diff --git a/.project b/.project deleted file mode 100644 index 4838758e3..000000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - jedp - - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c020..000000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1c..000000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/jun_api_online/.gitignore b/jun_api_online/.gitignore new file mode 100644 index 000000000..659f73625 --- /dev/null +++ b/jun_api_online/.gitignore @@ -0,0 +1,30 @@ +*.class +.DS_Store +application.pid + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +# *.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# Eclipse +.classpath +.project +target +classes +.settings +.factorypath + +# Idea +.idea +*.iml + +# git +*.orig +doc2 \ No newline at end of file diff --git a/jun_api_online/README.md b/jun_api_online/README.md new file mode 100644 index 000000000..5c9989b07 --- /dev/null +++ b/jun_api_online/README.md @@ -0,0 +1,81 @@ +# jun_springboot_admin_layui + +## 简介 +jun_springboot_admin_layui 是一个基于Layui + Spring Boot & MyBatis的API接口服务项目, +项目使用Spring boot2.0+shiro+redis+mybatis架构,可以适用 前后端分离项目后台或者APP接口后台,使用了Shiro-Redis实现分布式Session共享 +基于当前项目,可快速构建中小型API、RESTful API接口,项目含有代码生成器,单表标接口一键生成 +该项目已经有过多个真实项目的实践,稳定、简单、快速,让码农脱离重复劳动,专注于业务代码的编写,减少加班。 + + +- Swagger地址:http://localhost:8080/swagger-ui.html +- 登录地址:localhost:8080/api/user/login?username=admin&password=admin +- 接口地址:localhost:8080/api/public/company/list +- session超时,30分; + + + +### 使用框架如下: +* 核心框架:spring boot 2.1.6 +* 持久层框架:mybatis +* 数据库连接池:alibaba druid +* 安全框架:apache shiro +* 缓存框架:redis(自定义 RedisTemplate 序列化) +* 日志框架:logback +* 接口文档:swagger 2.9.2 +* 接口文档:Fastjson +* MyBatis([查看官方中文文档](http://www.mybatis.org/mybatis-3/zh/index.html)) +* MyBatisb通用Mapper插件([查看官方中文文档](https://mapperhelper.github.io/docs/)) +* MyBatis PageHelper分页插件([查看官方中文文档](https://pagehelper.github.io/)) +* 其他略 + +### 功能截图: +- 一键生成表接口测试 +![](https://github.com/wujun728/jun_springboot_admin_layui/blob/main/jun_springboot_api/doc/images/1.png) +- 登录接口测试 +![](https://github.com/wujun728/jun_springboot_admin_layui/blob/main/jun_springboot_api/doc/images/2.png) +- swagger接口清单 +![](https://github.com/wujun728/jun_springboot_admin_layui/blob/main/jun_springboot_api/doc/images/3.png) + + +C:\Windows\System32\drivers\etc\hosts文件中添加域名: +* qixing.fly666.cn qixing.hbqxcpa.cn +* api.qixing.fly666.cn api.qixing.hbqxcpa.cn +127.0.0.1 qixing.fly666.cn +127.0.0.1 qixing.hbqxcpa.cn +127.0.0.1 api.qixing.fly666.cn +127.0.0.1 api.qixing.hbqxcpa.cn + + + ### 特征&提供 +- 最佳实践的项目结构、配置文件、精简的POM +- 统一响应结果封装及生成工具 +- 统一异常处理 +- 简单的接口签名认证 +- 常用基础方法抽象封装 +- 使用Druid Spring Boot Starter 集成Druid数据库连接池与监控 +- 使用FastJsonHttpMessageConverter,提高JSON序列化速度 +- 集成MyBatis、通用Mapper插件、PageHelper分页插件,实现单表业务零SQL +- 使用SpringFox-Swagger2管理API文档 +- 使用lombok简化POJO +- 提供代码生成器根据表名生成对应的Model、Mapper、MapperXML、Service、ServiceImpl、Controller等基础代码, +- 其中Controller模板默认提供POST和RESTful两套,根据需求在```CodeGenerator.genController(tableName)```方法中自己选择,默认使用POST模板。 +- 代码模板可根据实际项目的需求来扩展,由于每个公司业务都不太一样,所以只提供了一些比较基础、通用的模板,**主要是提供一个思路**来减少重复代码的编写,我在实际项目的使用中,其实根据公司业务的抽象编写了大量的模板。另外,使用模板也有助于保持团队代码风格的统一 + +### 快速开始 +1. 下载项目 +2. 对```test```包内的代码生成器```CodeGenerator```进行配置,主要是JDBC,因为要根据表名来生成代码 +3. 如果只是想根据上面的演示来亲自试试的话可以使用```test resources```目录下的```sys_user.sql```,否则忽略该步 +3. 输入表名,运行```CodeGenerator.main()```方法,生成基础代码(可能需要刷新项目目录才会出来) +4. 根据业务在基础代码上进行扩展 +5. 对开发环境配置文件```application-dev.properties```进行配置,启动项目! + +### 开发建议 +- 表名,建议使用小写,多个单词使用下划线拼接 +- Model内成员变量建议与表字段数量对应,如需扩展成员变量(比如连表查询)建议创建DTO,否则需在扩展的成员变量上加```@Transient```注解,详情见[通用Mapper插件文档说明](https://mapperhelper.github.io/docs/2.use/) +- 建议业务失败直接使用```ServiceException("message")```抛出,由统一异常处理器来封装业务失败的响应结果,比如```throw new ServiceException("该手机号已被注册")```,会直接被封装为```{"code":400,"message":"该手机号已被注册"}```返回,无需自己处理,尽情抛出 +- 需要工具类的话建议先从```apache-commons-*```和```guava```中找,实在没有再造轮子或引入类库,尽量精简项目 +- 开发规范建议遵循阿里巴巴Java开发手册([最新版下载](https://github.com/alibaba/p3c)) +- 建议在公司内部使用[SpringFox-Swagger2](https://github.com/springfox/springfox) 、[RAP](https://github.com/thx/RAP)等开源项目来编写、管理API文档 + +反射兼容问题 +这是由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了,为了兼容原先的版本,需要在运行项目时添加 --add-opens java.base/java.lang=ALL-UNNAMED \ No newline at end of file diff --git a/jun_api_online/jun_admin/pom.xml b/jun_api_online/jun_admin/pom.xml new file mode 100644 index 000000000..a51a0f2bd --- /dev/null +++ b/jun_api_online/jun_admin/pom.xml @@ -0,0 +1,227 @@ + + + 4.0.0 + com.jun.plugin + jun_admin + 1.0 + 主应用Main + + + + org.projectlombok + lombok + 1.18.30 + + + org.springframework.boot + spring-boot-devtools + true + runtime + + + org.springframework.boot + spring-boot-starter-web + + + com.jun.plugin + jun_common + 1.0 + + + com.jun.plugin + jun-dynamic-form-spring-boot-starter + 1.0.13 + + + com.jun.plugin + jun-code-generator-spring-boot-starter + 1.0.13 + + + com.jun.plugin + generator + 1.0 + + + commons-beanutils + commons-beanutils + + + commons-lang + commons-lang + + + commons-logging + commons-logging + + + + + com.jun.plugin + quartz + 1.0 + + + com.jun.plugin + jun_system + 1.0 + + + com.jun.plugin + fileservice + 1.0 + + + com.jun.plugin + sms + 1.0 + + + com.jun.plugin + snakerflow + 1.0 + compile + + + cglib-nodep + cglib + + + commons-logging + commons-logging + + + + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-data-jdbc + + + + com.alibaba + druid-spring-boot-starter + 1.2.18 + + + org.springframework.boot + spring-boot-test + test + + + org.springframework + spring-test + test + + + junit + junit + test + + + junit + junit + test + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + org.flywaydb + flyway-mysql + 9.22.3 + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + manager + + + + + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/OnlineApplication.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/OnlineApplication.java new file mode 100644 index 000000000..984c7b23c --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/OnlineApplication.java @@ -0,0 +1,66 @@ +package com.jun.plugin.project; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.util.Arrays; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.jun.plugin.rest.filter.ResourceFilter; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.EnableScheduling; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@EnableScheduling +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) // 多数据源 (exclude = DruidDataSourceAutoConfigure.class) +@MapperScan({"com.jun.plugin.**.mapper","com.jun.plugin.online.dao"}) +@ComponentScan(basePackages = {"com.jun.plugin.project","com.jun.plugin.common","com.jun.plugin.rest","com.jun.plugin.generator", + "com.jun.plugin.quartz","com.jun.plugin.online","com.jun.plugin.generate","com.jun.plugin.system"}) +@ServletComponentScan(basePackages = {"com.jun.plugin.**.filter"}) +public class OnlineApplication extends SpringBootServletInitializer { + public static void main(String[] args) throws Exception { +// SpringApplication application = new SpringApplication(SpringbootApplication.class); +// application.setBannerMode(Banner.Mode.OFF); +// application.run(args); + //System.setProperty("spring.devtools.restart.enabled", "true"); + ConfigurableApplicationContext application = SpringApplication.run(OnlineApplication.class, args); + Environment env = application.getEnvironment(); + InetAddress inetAddress = Inet4Address.getLocalHost(); + String hostAddress = inetAddress.getHostAddress(); + String serverPort = env.getProperty("server.port"); + String serverPath = env.getProperty("spring.application.name"); + String url = env.getProperty("spring.datasource.url"); + log.info("项目启动成功!访问地址: http://{}:{}/{}", hostAddress, serverPort, serverPath); + log.info("本机地址: http://localhost:{}", serverPort); + } + + @Override // 为了打包springboot项目 + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(this.getClass()); + } + + @Bean + public CommandLineRunner commandLineRunner(ApplicationContext ctx) { + return args -> { + System.out.println("Let's inspect the beans provided by Spring Boot:"); + String[] beanNames = ctx.getBeanDefinitionNames(); + System.err.println("beanNames size = "+ beanNames.length); + //Arrays.stream(beanNames).forEach(System.out::println); + }; + } +} + + diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/BaseController.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/BaseController.java new file mode 100644 index 000000000..f43d12a6c --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/BaseController.java @@ -0,0 +1,58 @@ +package com.jun.plugin.project.config; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.jun.plugin.common.Result; +//import com.jun.plugin.common.util.SpringContextUtil; +import com.jun.plugin.common.utils.spring.SpringUtils; +import io.swagger.annotations.ApiOperation; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.UnknownHostException; + + +/** + * 客户信息 + * + * @author wujun + * @email wujun728@mail.com + * @date 2022-02-28 16:28:58 + */ +@RequestMapping("/") +@RestController +public class BaseController { + + @ApiOperation("404请求") + @GetMapping("404") + public String e404() { + System.out.println("404............"); + return "这真的是一个404页面,你看看"; + } + + @GetMapping("/") + public Result root() throws UnknownHostException { + Environment env = SpringUtil.getApplicationContext().getEnvironment(); + InetAddress inetAddress = Inet4Address.getLocalHost(); + String hostAddress = inetAddress.getHostAddress(); + String serverPort = env.getProperty("server.port"); + String serverPath = env.getProperty("spring.application.name"); + String url = env.getProperty("spring.datasource.url"); + Result result = Result.success("项目启动成功!"); + result.put("local",String.format("本机地址: http://localhost:%s", serverPort)); + result.put("ipadress",String.format("访问地址: http://%s:%s/%s", hostAddress, serverPort, serverPath)); + return result; + } + + +// public static void main(String[] args) { +//// System.out.println(IdUtil.getSnowflake(10,8).nextId()); +// } + +} diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/GlobalRequestBodyAdvice.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/GlobalRequestBodyAdvice.java new file mode 100644 index 000000000..f6e73467b --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/GlobalRequestBodyAdvice.java @@ -0,0 +1,91 @@ +package com.jun.plugin.project.config; + +import org.springframework.core.MethodParameter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.Map; + +/** + * @title 全局请求参数处理类 + */ +@ControllerAdvice(basePackages = "com.jun.plugin.*.controller")//此处设置需要当前Advice执行的域 , 省略默认全局生效 +public class GlobalRequestBodyAdvice implements RequestBodyAdvice { + + + /** 此处如果返回false , 则不执行当前Advice的业务 */ + @Override + public boolean supports(MethodParameter methodParameter, Type targetType, Class> converterType) { +// return methodParameter.getMethod().isAnnotationPresent(XXApiReq.class); + return false; + } + + /** + * @title 读取参数前执行 + * @description 在此做些编码 / 解密 / 封装参数为对象的操作 + * + * */ + @Override + public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) throws IOException { + // 提取数据 + InputStream is = inputMessage.getBody(); + byte[] data = new byte[is.available()]; + is.read(data); + //转数据类型 + ObjectMapper mapper = new ObjectMapper(); + Map m = mapper.readValue(new String(data), Map.class); + //m.forEach(null); + return new XHttpInputMessage(inputMessage, "UTF-8"); + } + + /** + * @title 读取参数后执行 + * @author Xingbz + */ + @Override + public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + return inputMessage; + } + + /** + * @title 无请求时的处理 + */ + @Override + public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + return body; + } +} + +//这里实现了HttpInputMessage 封装一个自己的HttpInputMessage +class XHttpInputMessage implements HttpInputMessage { + private HttpHeaders headers; + private InputStream body; + + public XHttpInputMessage(HttpInputMessage httpInputMessage, String encode) throws IOException { + this.headers = httpInputMessage.getHeaders(); + this.body = encode(httpInputMessage.getBody(), encode); + } + + private InputStream encode(InputStream body, String encode) { + //省略对流进行编码的操作 + return body; + } + + @Override + public InputStream getBody() { + return body; + } + + @Override + public HttpHeaders getHeaders() { + return null; + } +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MetaObjectHandlerConfig.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MetaObjectHandlerConfig.java new file mode 100644 index 000000000..a37f9c0ef --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MetaObjectHandlerConfig.java @@ -0,0 +1,86 @@ +package com.jun.plugin.project.config; + +import cn.hutool.core.util.ClassLoaderUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +//import com.jun.plugin.project.service.HttpSessionService; +import com.jun.plugin.common.constant.Constant; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.Date; +import java.util.HashSet; + + +/** + * mybatis plus 默认值配置 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +public class MetaObjectHandlerConfig implements MetaObjectHandler { + +// @Lazy +// @Resource +// HttpSessionService httpSessionService; + + @Override + public void insertFill(MetaObject metaObject) { + Date currentDate = new Date(); + String[] setterNames = metaObject.getSetterNames(); + HashSet setterNameSet = new HashSet<>(Arrays.asList(setterNames)); + if (setterNameSet.contains("deleted")) { + //默认未删除 + setFieldValByName("deleted", Constant.DATA_NOT_DELETED, metaObject); + } + if (setterNameSet.contains("createTime")) { + //创建时间默认当前时间 + setFieldValByName("createTime", currentDate, metaObject); + } + if (setterNameSet.contains("createDate")) { + //创建时间默认当前时间 + setFieldValByName("createDate", currentDate, metaObject); + } +// if (setterNameSet.contains("createId")) { +// //创建时间默认当前时间 +// setFieldValByName("createId", httpSessionService.getCurrentUserId(), metaObject); +// } +// if (setterNameSet.contains("updateId")) { +// //创建时间默认当前时间 +// setFieldValByName("updateId", httpSessionService.getCurrentUserId(), metaObject); +// } + if (setterNameSet.contains("updateTime")) { + //创建时间默认当前时间 + setFieldValByName("updateTime", currentDate, metaObject); + } + if (setterNameSet.contains("updateDate")) { + //创建时间默认当前时间 + setFieldValByName("updateDate", currentDate, metaObject); + } + + + } + + @Override + public void updateFill(MetaObject metaObject) { + Date currentDate = new Date(); + String[] setterNames = metaObject.getSetterNames(); + HashSet setterNameSet = new HashSet<>(Arrays.asList(setterNames)); + if (setterNameSet.contains("updateTime")) { + //创建时间默认当前时间 + setFieldValByName("updateTime", currentDate, metaObject); + } + if (setterNameSet.contains("updateDate")) { + //创建时间默认当前时间 + setFieldValByName("updateDate", currentDate, metaObject); + } +// if (setterNameSet.contains("updateId")) { +// //创建时间默认当前时间 +// setFieldValByName("updateId", httpSessionService.getCurrentUserId(), metaObject); +// } + } +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MetaRecordFillHandlerConfig.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MetaRecordFillHandlerConfig.java new file mode 100644 index 000000000..e8750eb84 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MetaRecordFillHandlerConfig.java @@ -0,0 +1,95 @@ +//package com.jun.plugin.project.config; +// +//import cn.hutool.db.meta.Table; +//import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +//import com.jun.plugin.common.constant.Constant; +//import com.jun.plugin.db.record.Record; +//import com.jun.plugin.rest.handler.RecordFillHandler; +//import org.apache.ibatis.reflection.MetaObject; +//import org.springframework.stereotype.Component; +// +//import java.util.Arrays; +//import java.util.Date; +//import java.util.HashSet; +// +// +///** +// * mybatis plus 默认值配置 +// * +// * @author wujun +// * @version V1.0 +// * @date 2020年3月18日 +// */ +//@Component +//public class MetaRecordFillHandlerConfig implements RecordFillHandler { +// +//// @Lazy +//// @Resource +//// HttpSessionService httpSessionService; +// +//// @Override +//// public void insertFill(MetaObject metaObject) { +//// Date currentDate = new Date(); +//// String[] setterNames = metaObject.getSetterNames(); +//// HashSet setterNameSet = new HashSet<>(Arrays.asList(setterNames)); +//// if (setterNameSet.contains("deleted")) { +//// //默认未删除 +//// setFieldValByName("deleted", Constant.DATA_NOT_DELETED, metaObject); +//// } +//// if (setterNameSet.contains("createTime")) { +//// //创建时间默认当前时间 +//// setFieldValByName("createTime", currentDate, metaObject); +//// } +//// if (setterNameSet.contains("createDate")) { +//// //创建时间默认当前时间 +//// setFieldValByName("createDate", currentDate, metaObject); +//// } +////// if (setterNameSet.contains("createId")) { +////// //创建时间默认当前时间 +////// setFieldValByName("createId", httpSessionService.getCurrentUserId(), metaObject); +////// } +////// if (setterNameSet.contains("updateId")) { +////// //创建时间默认当前时间 +////// setFieldValByName("updateId", httpSessionService.getCurrentUserId(), metaObject); +////// } +//// if (setterNameSet.contains("updateTime")) { +//// //创建时间默认当前时间 +//// setFieldValByName("updateTime", currentDate, metaObject); +//// } +//// if (setterNameSet.contains("updateDate")) { +//// //创建时间默认当前时间 +//// setFieldValByName("updateDate", currentDate, metaObject); +//// } +//// +//// +//// } +//// +//// @Override +//// public void updateFill(MetaObject metaObject) { +//// Date currentDate = new Date(); +//// String[] setterNames = metaObject.getSetterNames(); +//// HashSet setterNameSet = new HashSet<>(Arrays.asList(setterNames)); +//// if (setterNameSet.contains("updateTime")) { +//// //创建时间默认当前时间 +//// setFieldValByName("updateTime", currentDate, metaObject); +//// } +//// if (setterNameSet.contains("updateDate")) { +//// //创建时间默认当前时间 +//// setFieldValByName("updateDate", currentDate, metaObject); +//// } +////// if (setterNameSet.contains("updateId")) { +////// //创建时间默认当前时间 +////// setFieldValByName("updateId", httpSessionService.getCurrentUserId(), metaObject); +////// } +//// } +// +// @Override +// public void insertFill(Table table, Record record) { +// +// } +// +// @Override +// public void updateFill(Table table, Record record) { +// +// } +//} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MyBatisPlusConfig.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MyBatisPlusConfig.java new file mode 100644 index 000000000..f078d62a4 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/MyBatisPlusConfig.java @@ -0,0 +1,30 @@ +package com.jun.plugin.project.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * mybatis plus config + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Configuration +public class MyBatisPlusConfig { + /** + * 配置mybatis-plus 分页查件 + */ + + /** 配置分页插件*/ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/RecordHandlerConfig.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/RecordHandlerConfig.java new file mode 100644 index 000000000..bad14d2e1 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/RecordHandlerConfig.java @@ -0,0 +1,70 @@ +package com.jun.plugin.project.config; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.jun.plugin.common.base.interfaces.IRecordHandler; +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.db.record.Record; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Date; +import java.util.HashSet; + + +/** + * mybatis plus 默认值配置 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +public class RecordHandlerConfig implements IRecordHandler { + + @Lazy + @Resource + HttpSessionService httpSessionService; + + @Override + public String tableName() { + return "all"; + } + + @Override + public void insertFill(Record record) { + if(ObjUtil.isNotNull(record.get("update_time"))){ + record.set("update_time", DateUtil.now()); + } + if(ObjUtil.isNotNull(record.get("create_time"))){ + record.set("create_time", DateUtil.now()); + } + if(ObjUtil.isNotNull(record.get("create_id"))){ + record.set("create_id", httpSessionService.getCurrentUserId()); + } + if(ObjUtil.isNotNull(record.get("update_id"))){ + record.set("update_id", httpSessionService.getCurrentUserId()); + } + } + + @Override + public void updateFill(Record record) { + if(ObjUtil.isNotNull(record.get("update_time"))){ + record.set("update_time", DateUtil.now()); + } + if(ObjUtil.isNotNull(record.get("create_time"))){ + record.set("create_time", DateUtil.now()); + } + if(ObjUtil.isNotNull(record.get("create_id"))){ + record.set("create_id", httpSessionService.getCurrentUserId()); + } + if(ObjUtil.isNotNull(record.get("update_id"))){ + record.set("update_id", httpSessionService.getCurrentUserId()); + } + } +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/RedisCacheConfig.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/RedisCacheConfig.java new file mode 100644 index 000000000..f0a90e8c8 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/RedisCacheConfig.java @@ -0,0 +1,103 @@ +package com.jun.plugin.project.config; + +import java.time.Duration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; + +import javax.annotation.Resource; + +/** + * Redis缓存配置。 + */ +@Configuration +@EnableCaching +public class RedisCacheConfig { + +// @Autowired +// private RedisTemplate redisTemplate; + + @Resource + private RedisConnectionFactory factory; + + @Bean + public RedisTemplate redisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(factory); + // 字符串Key序列化 + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + // 对象值序列化 +// ObjectRedisSerializer objectRedisSerializer = new ObjectRedisSerializer(); + RedisSerializer objectRedisSerializer = new GenericJackson2JsonRedisSerializer(); + redisTemplate.setValueSerializer(objectRedisSerializer); + redisTemplate.setHashValueSerializer(objectRedisSerializer); + return redisTemplate; + } + + @Bean(name = "redisCacheManager") + public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) { + + // 初始化一个RedisCacheWriter + RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); + // 设置CacheManager的值序列化方式为json序列化 + RedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(); + RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair + .fromSerializer(jsonSerializer); + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair); + config.entryTtl(Duration.ofSeconds(60*2)).disableCachingNullValues();// 不缓存空值 +// // 初始化RedisCacheManager + return new RedisCacheManager(redisCacheWriter, config, getRedisCacheConfigurationMap()); + } + + + private Map getRedisCacheConfigurationMap() { + Map redisCacheConfigurationMap = new HashMap<>(); + redisCacheConfigurationMap.put("messagCache", this.getRedisCacheConfigurationWithTtl(30 * 60)); + //自定义设置缓存时间 + redisCacheConfigurationMap.put("userCache", this.getRedisCacheConfigurationWithTtl(60)); + redisCacheConfigurationMap.put("cache4h", this.getRedisCacheConfigurationWithTtl(60*60*4)); + redisCacheConfigurationMap.put("cache5m", this.getRedisCacheConfigurationWithTtl(60*2)); + redisCacheConfigurationMap.put("cache2m", this.getRedisCacheConfigurationWithTtl(60*2)); + redisCacheConfigurationMap.put("cache1m", this.getRedisCacheConfigurationWithTtl(60)); + + return redisCacheConfigurationMap; + } + + private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) { +// RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory); + // 设置CacheManager的值序列化方式为json序列化 + RedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(); + RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair + .fromSerializer(jsonSerializer); + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair); + redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith( + RedisSerializationContext + .SerializationPair + .fromSerializer(jsonSerializer) + ).entryTtl(Duration.ofSeconds(seconds)); + return redisCacheConfiguration; + } + +} diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/SwaggerConfiguration.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/SwaggerConfiguration.java new file mode 100644 index 000000000..732e5daba --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/SwaggerConfiguration.java @@ -0,0 +1,51 @@ +package com.jun.plugin.project.config; + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import com.google.common.base.Predicates; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + + +/** + * SwaggerConfiguration + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Configuration +@EnableSwagger2 +@EnableKnife4j +@Import(BeanValidatorPluginsConfiguration.class) +public class SwaggerConfiguration { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(Predicates.or(RequestHandlerSelectors.basePackage("com.jun.plugin.system.controller"), + RequestHandlerSelectors.basePackage("com.jun.plugin.bizservice.controller"))) + .paths(PathSelectors.any()) + .build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("Springboot-api APIs") + .description("Springboot-api APIs") + .termsOfServiceUrl("http://localhost:8080/") + .version("1.0") + .build(); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/ThymeleafConfigration.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/ThymeleafConfigration.java new file mode 100644 index 000000000..f3b5c7736 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/ThymeleafConfigration.java @@ -0,0 +1,74 @@ +//package com.jun.plugin.project.config; +// +//import java.io.File; +//import java.io.FileNotFoundException; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.util.ResourceUtils; +//import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; +//import org.thymeleaf.templatemode.TemplateMode; +//import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; +// +//@Configuration +//public class ThymeleafConfigration { +// +// @Bean +// public SpringResourceTemplateResolver firstTemplateResolver() { +// SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); +// //templateResolver.setPrefix("classpath:/templates/"); +// +// File path = null; +// try { +// path = new File(ResourceUtils.getURL("classpath:").getPath()); +// //file:/data/github/testmanagement/target/testmanagement-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes! +// System.out.println(path.getPath()); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } +// //server.tomcat.basedir=outsidefile/jacococoverage +// String outside_templates=path.getParentFile().getParentFile().getParent()+File.separator; +// //String outside_templates=path.getParentFile().getParentFile().getParent()+File.separator+"outsidefile"+File.separator+"jacococoverage"+File.separator; +// +// System.out.println(outside_templates); +// outside_templates=outside_templates.substring(5,outside_templates.length()); +// //file:/data/github/testmanagement/target/outsidefile/jacococoverage/ +// +// System.out.println("new outside_templates is "+outside_templates); +// templateResolver.setPrefix("file://"+outside_templates); +// +// templateResolver.setSuffix(".html"); +// templateResolver.setTemplateMode(TemplateMode.HTML); +// templateResolver.setCharacterEncoding("UTF-8"); +// templateResolver.setOrder(0); +// templateResolver.setCheckExistence(true); +// //Spring Boot中Thymeleaf引擎动态刷新 +// templateResolver.setCacheable(false); +// return templateResolver; +// } +// +//// @Bean +//// public ClassLoaderTemplateResolver secondaryTemplateResolver() { +//// ClassLoaderTemplateResolver secondaryTemplateResolver = new ClassLoaderTemplateResolver(); +//// secondaryTemplateResolver.setPrefix("templates2/"); +//// secondaryTemplateResolver.setSuffix(".html"); +//// secondaryTemplateResolver.setTemplateMode(TemplateMode.HTML); +//// secondaryTemplateResolver.setCharacterEncoding("UTF-8"); +//// secondaryTemplateResolver.setOrder(1); +//// secondaryTemplateResolver.setCacheable(false); +//// secondaryTemplateResolver.setCheckExistence(true); +//// return secondaryTemplateResolver; +//// } +// @Bean +// public ClassLoaderTemplateResolver secondaryTemplateResolver3() { +// ClassLoaderTemplateResolver secondaryTemplateResolver = new ClassLoaderTemplateResolver(); +// secondaryTemplateResolver.setPrefix("templates3/"); +// secondaryTemplateResolver.setSuffix(".html"); +// secondaryTemplateResolver.setTemplateMode(TemplateMode.HTML); +// secondaryTemplateResolver.setCharacterEncoding("UTF-8"); +// secondaryTemplateResolver.setOrder(1); +// secondaryTemplateResolver.setCacheable(false); +// secondaryTemplateResolver.setCheckExistence(true); +// return secondaryTemplateResolver; +// } +//} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/WebConfig.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/WebConfig.java new file mode 100644 index 000000000..6ed742d9b --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/WebConfig.java @@ -0,0 +1,138 @@ +package com.jun.plugin.project.config; + + +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; +import java.util.List; + +/** + * spring mvc配置类 + * sunxh 2023/2/26 + */ +@Configuration +@EnableWebMvc +public class WebConfig implements WebMvcConfigurer { + +// @Resource +// private MyWebInterceptor myWebInterceptor; +// @Resource +// private LoggerInterceptor loggerInterceptor; + + /** + * 资源跨域设置 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + //super.addCorsMappings(registry); + //registry.addMapping("/api/**").allowedOrigins("*").maxAge(3600); + registry.addMapping("/**").allowedHeaders("*").allowedMethods("POST", "GET", "PUT", "DELETE") + .allowedOrigins("*"); + } + + /** + * 请求拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + WebMvcConfigurer.super.addInterceptors(registry); + //loggerInterceptor.addInterceptor(registry); + //myWebInterceptor.addInterceptor(registry); +// registry.addInterceptor(new RepeatSubmitInterceptor() { +// @Override +// public boolean isRepeatSubmit(HttpServletRequest request) { +// return false; +// } +// }).addPathPatterns("/**") +// .excludePathPatterns("/emp/toLogin","/emp/login","/js/**","/css/**","/images/**"); + } + + /** + * @description: 访问静态文件,发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源 + * @date: 2021/4/15 + */ + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + /** 本地文件上传路径 */ +// registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + Global.getProfile() + "/"); + + registry.addResourceHandler("/**").addResourceLocations("classpath:/static/","classpath:/static2/","classpath:/static3/","classpath:/templates/","classpath:/templates3/","classpath:/views/"); +// registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/"); + registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/","classpath:/static2/","classpath:/static3/"); + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + + /** swagger配置 */ + registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + /** 文件下载映射配置,同下 */ +// registry.addResourceHandler(fileUploadProperties.getAccessUrl()).addResourceLocations("file:" + fileUploadProperties.getPath()); + } + + /** + * 定义全局默认时间序列化 + */ + private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private static final String DATE_FORMAT = "yyyy-MM-dd"; + @Override + public void configureMessageConverters(List> converters) { + Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() + .indentOutput(true) + .dateFormat(new SimpleDateFormat("yyyy-MM-dd")) + .simpleDateFormat(DATE_TIME_FORMAT) + .serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))) + .serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))) + .deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))) + .deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT))) + .modulesToInstall(new ParameterNamesModule()); + converters.add(new MappingJackson2HttpMessageConverter(builder.build())); + } + + /** + * 视图配置 + * @param registry + */ + @Override + public void configureViewResolvers(ViewResolverRegistry registry) { + //super.configureViewResolvers(registry); + registry.viewResolver(resourceViewResolver()); + /*registry.jsp("/WEB-INF/jsp/",".jsp");*/ + } + + @Bean + public InternalResourceViewResolver resourceViewResolver() + { + InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver(); + //请求视图文件的前缀地址 + internalResourceViewResolver.setPrefix("/WEB-INF/jsp/"); + //请求视图文件的后缀 + internalResourceViewResolver.setSuffix(".jsp"); + return internalResourceViewResolver; + } + + + /** + * 默认首页的设置,当输入域名是可以自动跳转到默认指定的网页 + */ + @Override + public void addViewControllers(ViewControllerRegistry registry) { +// registry.addViewController("/").setViewName("forward:" + indexUrl); + registry.addViewController("/").setViewName("forward:" + "login.html"); + } +} + diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/interceptor/MyInterceptor.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/interceptor/MyInterceptor.java new file mode 100644 index 000000000..fc1d84f86 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/interceptor/MyInterceptor.java @@ -0,0 +1,40 @@ +package com.jun.plugin.project.config.interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +/** + * @author HongYi + * @createTime 2021年02月01日 14:00:00 + */ +@Component +public class MyInterceptor implements HandlerInterceptor { + private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class); + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + logger.info("------------------ preHandle"); + request.setAttribute("startTime",System.currentTimeMillis()); + return true; + } + + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { + logger.info("------------------ postHandle"); + long startTime = (long) request.getAttribute("startTime"); + request.removeAttribute("startTime"); + logger.info("请求处理时间: " + (System.currentTimeMillis() - startTime) + "毫秒"); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, + Object handler, Exception ex) { + logger.info("------------------ after"); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/interceptor/MybatisExecutor.java b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/interceptor/MybatisExecutor.java new file mode 100644 index 000000000..e59b8fd55 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/java/com/jun/plugin/project/config/interceptor/MybatisExecutor.java @@ -0,0 +1,87 @@ +package com.jun.plugin.project.config.interceptor; + +//import com.fen.dou.entity.BaseEntity; +//import com.fen.dou.entity.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.plugin.*; +import org.springframework.stereotype.Component; + +import com.jun.plugin.common.entity.BaseEntity; + +import java.util.Map; +import java.util.Properties; + +@Slf4j +@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) }) +@Component +public class MybatisExecutor implements Interceptor { + @Override + @SuppressWarnings("unchecked") + public Object intercept(Invocation invocation) throws Throwable { + // 根据签名指定的args顺序获取具体的实现类 + // 1. 获取MappedStatement实例, 并获取当前SQL命令类型 + MappedStatement ms = (MappedStatement) invocation.getArgs()[0]; + SqlCommandType commandType = ms.getSqlCommandType(); + + // 2. 获取当前正在被操作的类, 有可能是Java Bean, 也可能是普通的操作对象, 比如普通的参数传递 + // 普通参数, 即是 @Param 包装或者原始 Map 对象, 普通参数会被 Mybatis 包装成 Map 对象 + // 即是 org.apache.ibatis.binding.MapperMethod$ParamMap + Object parameter = invocation.getArgs()[1]; + // 获取拦截器指定的方法类型, 通常需要拦截 update + String methodName = invocation.getMethod().getName(); + log.info("NormalPlugin, methodName; {}, commandType: {}", methodName, commandType); + + // 3. 获取当前用户信息 +// User user = new User(1,"yangcai","sssss"); + // 默认测试参数值 + int creator = 2, updater = 3; + + if (parameter instanceof BaseEntity) { + // 4. 实体类 + BaseEntity entity = (BaseEntity) parameter; +// if (user != null) { +// creator = entity.getCreateIds(); +// updater = entity.getUpdater(); +// } + if (methodName.equals("update")) { + if (commandType.equals(SqlCommandType.INSERT)) { +// entity.setCreator(creator); +// entity.setUpdater(updater); +// entity.setCreateTime(System.currentTimeMillis()); +// entity.setUpdateTime(System.currentTimeMillis()); + } else if (commandType.equals(SqlCommandType.UPDATE)) { +// entity.setUpdater(updater); +// entity.setUpdateTime(System.currentTimeMillis()); + } + } + } else if (parameter instanceof Map) { + // 5. @Param 等包装类 + // 更新时指定某些字段的最新数据值 + if (commandType.equals(SqlCommandType.UPDATE)) { + // 遍历参数类型, 检查目标参数值是否存在对象中, 该方式需要应用编写有一些统一的规范 + // 否则均统一为实体对象, 就免去该重复操作 + Map map = (Map) parameter; + if (map.containsKey("creator")) { + map.put("creator", creator); + } + if (map.containsKey("updateTime")) { + map.put("updateTime", System.currentTimeMillis()); + } + } + } + // 6. 均不是需要被拦截的类型, 不做操作 + return invocation.proceed(); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + } +} diff --git a/jun_api_online/jun_admin/src/main/resources/application-dev.yml b/jun_api_online/jun_admin/src/main/resources/application-dev.yml new file mode 100644 index 000000000..457a6bc51 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/application-dev.yml @@ -0,0 +1,69 @@ +# 开发环境配置 +spring: + thymeleaf: + cache: false + datasource: + url: jdbc:mysql://175.24.233.55:3307/db_qixing?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8&zeroDateTimeBehavior=convertToNull&useInformationSchema=true + username: ENC(i9EHZ6vsnfpTeKGvHmH+fA==) +# password: ENC(KX2tfUq8cZG3IXeAwZgk5w==) + password: ENC(DRxUQYNs+FWrr9vlmZfJN+lLEV1GxqCX) + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: localhost # Redis服务器地址 + database: 1 # Redis数据库索引(默认为0) + port: 6379 # Redis服务器连接端口 + password: # Redis服务器连接密码(默认为空) + jedis: + pool: + max-active: 8 # 连接池最大连接数(使用负值表示没有限制) + max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-idle: 8 # 连接池中的最大空闲连接 + min-idle: 0 # 连接池中的最小空闲连接 + timeout: 13000 # 连接超时时间(毫秒 + + flyway: + # 是否启用flyway + enabled: false + # 编码格式,默认UTF-8 + encoding: UTF-8 + # 迁移sql脚本文件存放路径,默认db/migration + locations: classpath:db/migration + # 迁移sql脚本文件名称的前缀,默认V + sql-migration-prefix: V + # 迁移sql脚本文件名称的分隔符,默认2个下划线__ + sql-migration-separator: __ + # 迁移sql脚本文件名称的后缀 + sql-migration-suffixes: .sql + # 迁移时是否进行校验,默认true + validate-on-migrate: true + # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表 + +filepath: "D:\\files\\" +file: + #文件上传目录 绝对路径 末尾请加 / + path: D:/files/ #windows + #path: /home/data/files/ #linux + #文件预览、下载的url, 末尾请勿加 / + url: http://qiniu.hbqxcpa.cn/files + qiniuAccessKey: ts0n9OF16ekFkDkZTTlpmyPI-tP3HKQDyw_GR4o2 + qiniuBucketName: qixing-files + qiniuDomain: http://qiniu.hbqxcpa.cn + qiniuPrefix: upload + qiniuSecretKey: c-OjjwV3ZgzCQwxc6W_bsTFKuDg8qeyqohyJU0RL + type: 1 + + +# AES密码加密私钥(Base64加密) +encryptAESKey: V2FuZzkyNjQ1NGRTQkFQSUpXVA== +# JWT认证加密私钥(Base64加密) +encryptJWTKey: U0JBUElKV1RkV2FuZzkyNjQ1NA== +# AccessToken过期时间-5分钟-5*60(秒为单位) +accessTokenExpireTime: 300 +# RefreshToken过期时间-30分钟-30*60(秒为单位) +refreshTokenExpireTime: 1800 +# Shiro缓存过期时间-5分钟-5*60(秒为单位)(一般设置与AccessToken过期时间一致) +shiroCacheExpireTime: 300 +shiro: + enable: true +knife4j: + production: true #生成环境禁用查看文档 \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/application-local.yml b/jun_api_online/jun_admin/src/main/resources/application-local.yml new file mode 100644 index 000000000..8aa9de1d1 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/application-local.yml @@ -0,0 +1,67 @@ +# 开发环境配置 +spring: + thymeleaf: + cache: false + datasource: + url: jdbc:mysql://localhost:3306/db_qixing_bk?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8&zeroDateTimeBehavior=convertToNull&useInformationSchema=true + username: ENC(i9EHZ6vsnfpTeKGvHmH+fA==) + password: ENC(KX2tfUq8cZG3IXeAwZgk5w==) + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: localhost # Redis服务器地址 + database: 1 # Redis数据库索引(默认为0) + port: 6379 # Redis服务器连接端口 + password: # Redis服务器连接密码(默认为空) + jedis: + pool: + max-active: 8 # 连接池最大连接数(使用负值表示没有限制) + max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-idle: 8 # 连接池中的最大空闲连接 + min-idle: 0 # 连接池中的最小空闲连接 + timeout: 13000 # 连接超时时间(毫秒 + + flyway: + # 是否启用flyway + enabled: false + # 编码格式,默认UTF-8 + encoding: UTF-8 + # 迁移sql脚本文件存放路径,默认db/migration + locations: classpath:db/migration + # 迁移sql脚本文件名称的前缀,默认V + sql-migration-prefix: V + # 迁移sql脚本文件名称的分隔符,默认2个下划线__ + sql-migration-separator: __ + # 迁移sql脚本文件名称的后缀 + sql-migration-suffixes: .sql + # 迁移时是否进行校验,默认true + validate-on-migrate: true + # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表 + +filepath: "D:\\files\\" +file: + #文件上传目录 绝对路径 末尾请加 / + path: /home/data/files/ #linux + #文件预览、下载的url, 末尾请勿加 / + url: http://qiniu.hbqxcpa.cn/files + qiniuAccessKey: ts0n9OF16ekFkDkZTTlpmyPI-tP3HKQDyw_GR4o2 + qiniuBucketName: qixing-files + qiniuDomain: http://qiniu.hbqxcpa.cn + qiniuPrefix: upload + qiniuSecretKey: c-OjjwV3ZgzCQwxc6W_bsTFKuDg8qeyqohyJU0RL + type: 1 + + +# AES密码加密私钥(Base64加密) +encryptAESKey: V2FuZzkyNjQ1NGRTQkFQSUpXVA== +# JWT认证加密私钥(Base64加密) +encryptJWTKey: U0JBUElKV1RkV2FuZzkyNjQ1NA== +# AccessToken过期时间-5分钟-5*60(秒为单位) +accessTokenExpireTime: 300 +# RefreshToken过期时间-30分钟-30*60(秒为单位) +refreshTokenExpireTime: 1800 +# Shiro缓存过期时间-5分钟-5*60(秒为单位)(一般设置与AccessToken过期时间一致) +shiroCacheExpireTime: 300 +shiro: + enable: true +knife4j: + production: true #生成环境禁用查看文档 \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/application.yml b/jun_api_online/jun_admin/src/main/resources/application.yml new file mode 100644 index 000000000..c948f9abd --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/application.yml @@ -0,0 +1,209 @@ +# 端口 +server: + port: 8082 + compression: + enabled: true + min-response-size: 1KB + mime-types: application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css + max-http-header-size: 102400 + tomcat: + uri-encoding: UTF-8 + servlet: + encoding: + charset: UTF-8 + force: true + enabled: true + +spring: + profiles: + active: local +# active: prod + mvc: + throw-exception-if-no-handler-found: true +# static-path-pattern: /static/** + resources: + add-mappings: false + main: + allow-bean-definition-overriding: true + allow-circular-references: true + application: + name: jun-code-online + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + # 文件大小限制 + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + # redis token信息 + redis: + key: + prefix: + userToken: "user:token:" + passwordError: "user:password:error:" + permissionRefresh: "user:token:permissionRefresh:" + expire: + #userToken: 604800 # 7天 1*24*3600 + userToken: 86400 # 1天 1*24*3600 + passwordError: 3600 # 一个小时 + #permissionRefresh: 604800 # 7天 7*24*3600 + permissionRefresh: 86400 # 1天 1*24*3600 + allowMultipleLogin: true # 允许多处登陆 + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + cache-enabled: false + mapper-locations: + ## classpath:mapper/*.xml,classpath:mapper/*Mapper.xml + - classpath*:mapper/*.xml # 扫描子模块下的 mapper.xml文件 + - classpath:mapper/*.xml # 扫描当前模块下的 mapper.xml 文件 +# mapper-locations: classpath:mapper/*.xml,classpath:mapper/${project.database}/**/*.xml + type-aliases-package: org.snaker.engine.entity + global-config: + enable-sql-runner: true + db-config: + logic-delete-value: 0 + logic-not-delete-value: 1 + logic-delete-field: deleted + +project: + database: mysql + config: + packages: 'com.jun.plugin.abcd,com.jun.plugin.abc' + datasource: + dsname: 'main' + url: ${spring.datasource.url} + driver: ${spring.datasource.driver-class-name} + username: ${spring.datasource.username} + password: ${spring.datasource.password} + runApi: + enable: true + devMode: true + serviceName: jun-runA + api_config: api_config + context: / + + +jasypt: + algorithm: PBEWithMD5AndDES + encryptor: + password: 123456@@ + +shiro: + enable: false + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: + # 匹配链接 + urlPatterns: /system/*,/tool/* +# 工作流参数定义 +workflows: + list: + - processName: leave + flowName: 请假流程 + pageURl: oapomsworkmarksleave/list + tname: oa_poms_workmarks_leave + taskName: 的请假流程 + - processName: project + flowName: 立项流程 + pageURl: pjProject/list + tname: pj_project + taskName: 的立项流程 + - processName: contract + flowName: 业务约定书流程 + pageURl: pjContract/list + tname: pj_contract + taskName: 的合同审批流程 + - processName: plan + flowName: 项目计划流程 + pageURl: pjProjectPlan/list + tname: pj_project_plan + taskName: 的项目计划流程 + - processName: daily + flowName: 日报审批流程 + pageURl: pjProjectDaily/list + tname: pj_project_daily + taskName: 的日报流程 + - processName: draft + flowName: 底稿审批流程 + pageURl: pjProjectDraft/list + tname: pj_project_draft + taskName: 的底稿 + - processName: recheck + flowName: 复核审批流程 + pageURl: pjProjectReport/list + tname: pj_project_report + taskName: 的复核 + - processName: member + flowName: 成员结算审批流程 + pageURl: pjProjectMember/list + tname: pj_project_member + taskName: 的成员结算 + - processName: invoice + flowName: 开票审批流程 + pageURl: pjProjectInvoice/list + tname: pj_project_invoice + taskName: 的开票申请 + - processName: borrow + flowName: 项目借阅审批流程 + pageURl: pjProjectBorrow/list + tname: pj_project_borrow + taskName: 的项目借阅 + - processName: office + flowName: 办公用品领用审批流程 + pageURl: oaOfficeCount/list + tname: oa_office_count + taskName: 的领用申购 + - processName: office2 + flowName: 办公用品申购审批流程 + pageURl: oaOfficeCount2/list + tname: oa_office_count2 + taskName: 的领用申购 + - processName: outsite + flowName: 外出审批流程 + pageURl: oaPomsWorkmarksOutsite/list + tname: oa_poms_workmarks_outsite + taskName: 的外出申请 + - processName: expense + flowName: 报销审批流程 + pageURl: oaPomsWorkmarksClaimExpense/list + tname: oa_poms_workmarks_claim_expense + taskName: 的报销申请 + - processName: hire + flowName: 录用审批流程 + pageURl: hrUserHire/list + tname: hr_user_hire + taskName: 的录用申请电子流 + - processName: hire + flowName: 录用审批流程 + pageURl: hrUserHire/list + tname: hr_user_hire + taskName: 的录用申请电子流 + - processName: becomemember + flowName: 转正审批流程 + pageURl: hrUserBecomeMember/list + tname: hr_user_become_member + taskName: 的转正申请电子流 + - processName: dimission + flowName: 离职审批流程 + pageURl: hrUserDimission/list + tname: hr_user_dimission + taskName: 的离职申请电子流 + - processName: assessment + flowName: 考核电子流 + pageURl: hrAssessmentUserRecord/list + tname: hr_assessment_user_record + taskName: 的考核电子流 + - processName: customer + flowName: 客户审批电子流 + pageURl: pjCustomer/list + tname: pj_customer + taskName: 的客户审批电子流 + - processName: your_name + pageURl: your_id \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/db/migration/V1.0__engine_create_ddl.sql b/jun_api_online/jun_admin/src/main/resources/db/migration/V1.0__engine_create_ddl.sql new file mode 100644 index 000000000..f64970ca7 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/db/migration/V1.0__engine_create_ddl.sql @@ -0,0 +1,47 @@ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*Table structure for table `app_action` */ + + +# DROP TABLE IF EXISTS `app_config`; + +CREATE TABLE `app_config` ( + `project_id` bigint(20) DEFAULT NULL COMMENT '项目Id', + `app_path` varchar(255) DEFAULT NULL COMMENT '应用目录地址', + `certificate_path` varchar(255) DEFAULT NULL COMMENT '应用证书配置', + `create_date` datetime(6) DEFAULT NULL COMMENT '新建时间', + `creator` varchar(255) DEFAULT NULL COMMENT '新建用户', + `db_address` varchar(255) DEFAULT NULL COMMENT '数据库地址', + `db_password` varchar(255) DEFAULT NULL COMMENT '数据库密码', + `db_user` varchar(255) DEFAULT NULL COMMENT '数据库用户', + `id` bigint(20) NOT NULL COMMENT 'id', + `ip_address` varchar(255) DEFAULT NULL COMMENT '创建IP地址', + `repository_address` varchar(255) DEFAULT NULL COMMENT '代码库', + `tenant` varchar(255) DEFAULT NULL COMMENT '租户code', + `update_date` datetime(6) DEFAULT NULL COMMENT '修改时间', + `updater` varchar(255) DEFAULT NULL COMMENT '修改用户', + `db_type` varchar(255) DEFAULT NULL COMMENT '数据库类型', + `keyword` varchar(255) DEFAULT NULL COMMENT '应用对应关键字', + `app_id` bigint(20) DEFAULT NULL COMMENT '应用Id', + `type` varchar(255) DEFAULT NULL COMMENT '数据库类型', + `defaultdbconfig` varchar(255) DEFAULT NULL, + `database_create_flag` int(11) NOT NULL COMMENT '是否创建数据库: 0 代表不初始化, 大于0 代表初始化', + `database_init_flag` int(11) NOT NULL COMMENT '是否初始化数据库: 0 代表不初始化, 大于0 代表初始化', + `db_admin_create_flag` int(11) NOT NULL COMMENT '是否创建数据库管理员: 0 代表不初始化, 大于0 代表初始化', + PRIMARY KEY (`id`), + UNIQUE KEY `idx_app_config` (`project_id`), + UNIQUE KEY `idx_app_id_config` (`app_id`), + UNIQUE KEY `idx_project_id_config` (`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=gbk; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/jun_api_online/jun_admin/src/main/resources/files/logo_resume.jpg b/jun_api_online/jun_admin/src/main/resources/files/logo_resume.jpg new file mode 100644 index 000000000..ace375766 Binary files /dev/null and b/jun_api_online/jun_admin/src/main/resources/files/logo_resume.jpg differ diff --git "a/jun_api_online/jun_admin/src/main/resources/files/\347\256\200\345\216\206\346\250\241\346\235\2771.docx" "b/jun_api_online/jun_admin/src/main/resources/files/\347\256\200\345\216\206\346\250\241\346\235\2771.docx" new file mode 100644 index 000000000..541427ae9 Binary files /dev/null and "b/jun_api_online/jun_admin/src/main/resources/files/\347\256\200\345\216\206\346\250\241\346\235\2771.docx" differ diff --git "a/jun_api_online/jun_admin/src/main/resources/files/\347\256\200\345\216\206\346\250\241\346\235\2772.docx" "b/jun_api_online/jun_admin/src/main/resources/files/\347\256\200\345\216\206\346\250\241\346\235\2772.docx" new file mode 100644 index 000000000..43058590f Binary files /dev/null and "b/jun_api_online/jun_admin/src/main/resources/files/\347\256\200\345\216\206\346\250\241\346\235\2772.docx" differ diff --git a/jun_api_online/jun_admin/src/main/resources/logback-spring.xml b/jun_api_online/jun_admin/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..82058f74c --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/logback-spring.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${LOG_PATH}/${LOG_FILE} + + ${FILE_LOG_PATTERN} + + + ${LOG_PATH}/${LOG_HISTORY} + 30 + + + + + + + + 0 + 500 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/mapper/SysConfigDao.xml.bak b/jun_api_online/jun_admin/src/main/resources/mapper/SysConfigDao.xml.bak new file mode 100644 index 000000000..9073a15ef --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/mapper/SysConfigDao.xml.bak @@ -0,0 +1,53 @@ + + + + + + + + + + + insert into sys_config(`key`, `value`, remark) + values(#{key},#{value},#{remark}) + + + + update sys_config set `key` = #{key}, `value` = #{value}, remark = #{remark} + where id = #{id} + + + + + update sys_config set `value` = #{value} where `key` = #{key} + + + + + + + delete from sys_config where id in + + #{id} + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/mapper/SysGeneratorMapper.xml b/jun_api_online/jun_admin/src/main/resources/mapper/SysGeneratorMapper.xml new file mode 100644 index 000000000..a262b1bba --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/mapper/SysGeneratorMapper.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, table_name, menu_name, pid, gen_time + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_admin/src/main/resources/mapper/SysOssDao.xml.bak b/jun_api_online/jun_admin/src/main/resources/mapper/SysOssDao.xml.bak new file mode 100644 index 000000000..d2ec63e91 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/mapper/SysOssDao.xml.bak @@ -0,0 +1,53 @@ + + + + + + + + + + + + insert into sys_oss + ( + `url`, + `create_date` + ) + values + ( + #{url}, + #{createDate} + ) + + + + update sys_oss + + `url` = #{url}, + `create_date` = #{createDate} + + where id = #{id} + + + + delete from sys_oss where id = #{value} + + + + delete from sys_oss where id in + + #{id} + + + + \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/mapper/UserMapper.xml.bak b/jun_api_online/jun_admin/src/main/resources/mapper/UserMapper.xml.bak new file mode 100644 index 000000000..34fea9a80 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/mapper/UserMapper.xml.bak @@ -0,0 +1,16 @@ + + + + + insert into file_system (name,password) values (#{name},#{password}); + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/qiniu.properties b/jun_api_online/jun_admin/src/main/resources/qiniu.properties new file mode 100644 index 000000000..b95e022ef --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/qiniu.properties @@ -0,0 +1,6 @@ +bucketName=qixing-files +domain=http://qiniu.hbqxcpa.cn +prefix=upload +type=1 +ACCESS_KEY=ts0n9OF16ekFkDkZTTlpmyPI-tP3HKQDyw_GR4o2 +SECRET_KEY=c-OjjwV3ZgzCQwxc6W_bsTFKuDg8qeyqohyJU0RL diff --git a/jun_api_online/jun_admin/src/main/resources/vm/Controller.java.vm b/jun_api_online/jun_admin/src/main/resources/vm/Controller.java.vm new file mode 100644 index 000000000..1768ee9d8 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/Controller.java.vm @@ -0,0 +1,181 @@ +package ${package}.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import java.util.List; +import com.jun.plugin.system.common.utils.DataResult; +import com.jun.plugin.common.aop.annotation.DataScope; +import com.jun.plugin.module.flow.process.BaseFlowController; + +import ${package}.entity.${className}Entity; +import ${package}.mapper.${className}Mapper; +import ${package}.service.${className}Service; + + + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +@Controller +@RequestMapping("/") +@Slf4j +public class ${className}Controller extends BaseFlowController{ + + @Autowired + private ${className}Service ${classname}Service; + + @Autowired + private ${className}Mapper ${classname}Mapper; + + + /** + * 跳转到页面 + */ + @GetMapping("/index/${classname}") + public String ${classname}() { + return "${classNameLower}/list"; + } + + @ApiOperation(value = "新增") + @PostMapping("${classname}/add") + @RequiresPermissions("${classname}:add") + @ResponseBody + public DataResult add(@RequestBody ${className}Entity ${classname}){ + if(this.checkExists(${classname})) { + return DataResult.fail("同名记录信息已存在!"); + } + ${classname}Service.save(${classname}); + return DataResult.success(); + } + + @ApiOperation(value = "删除") + @DeleteMapping("${classname}/delete") + @RequiresPermissions("${classname}:delete") + @ResponseBody + public DataResult delete(@RequestBody @ApiParam(value = "id集合") List ids){ + ${classname}Service.removeByIds(ids); + return DataResult.success(); + } + + @ApiOperation(value = "更新") + @PutMapping("${classname}/update") + @RequiresPermissions("${classname}:update") + @ResponseBody + public DataResult update(@RequestBody ${className}Entity ${classname}){ + ${classname}Service.updateById(${classname}); + return DataResult.success(); + } + + @ApiOperation(value = "查询分页数据") + @PostMapping("${classname}/listByPage") + @RequiresPermissions("${classname}:list") + @ResponseBody + @DataScope + public DataResult findListByPage(@RequestBody ${className}Entity ${classname}){ + Page page = new Page(${classname}.getPage(), ${classname}.getLimit()); + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(${classname}.getCreateIds())) { + queryWrapper.in(${className}Entity::getCreateId, ${classname}.getCreateIds()); + } + //数据权限示例, 需手动添加此条件 end + //queryWrapper.like(${className}Entity::getId, ${classname}.getId()==null?"":${classname}.getId()); + IPage<${className}Entity> iPage = ${classname}Service.page(page, queryWrapper); + //关联流程查询待办、处理人、状态 + List<${className}Entity> records = iPage.getRecords(); + records.forEach(item -> { + if((item.getOrderId()!=null && item.getOrderId().length()>0) && (item.getOrderStatus()==null)) { + this.setFlowStatusInfo(item); + System.err.println(item.getOrderStatus()); + if(item.getOrderState()==0) { + if((item.getOrderStatus()==null || item.getOrderStatus()!=0)) { + item.setOrderStatus(item.getOrderState()); + ${classname}Service.updateById(item); + } + } + }else { + item.setOrderState(item.getOrderStatus()); + } + + }); + return DataResult.success(iPage); + } + + + @ApiOperation(value = "查询下拉列表数据") + @PostMapping("${classname}/listBySelect") + @ResponseBody + @DataScope + public DataResult listBySelect(@RequestBody ${className}Entity ${classname}){ + Page page = new Page(${classname}.getPage(), ${classname}.getLimit()); + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(${classname}.getCreateIds())) { + queryWrapper.in(${className}Entity::getCreateId, ${classname}.getCreateIds()); + } + //数据权限示例, 需手动添加此条件 end + //查询条件示例 + //queryWrapper.like(${className}Entity::getId, ${classname}.getId()); + IPage<${className}Entity> iPage = ${classname}Service.page(page, queryWrapper); + return DataResult.success(iPage); + } + + @ApiOperation(value = "查询单条数据") + @PostMapping("${classname}/findOne") + @ResponseBody + public DataResult findOne(@RequestBody ${className}Entity ${classname}){ + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + //queryWrapper.eq(${className}Entity::getId, ${classname}.getId()); + //${className}Entity one = ${classname}Service.getOne(queryWrapper); + ${className}Entity one = ${classname}Service.getById(${classname}.getId()); + return DataResult.success(one); + } + + @ApiOperation(value = "查询下拉框数据") + @PostMapping("${classname}/findListBySelect") + @ResponseBody + @DataScope + public DataResult findListBySelect(@RequestBody ${className}Entity ${classname}){ + Page page = new Page(${classname}.getPage(), ${classname}.getLimit()); + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(${classname}.getCreateIds())) { + queryWrapper.in(${className}Entity::getCreateId, ${classname}.getCreateIds()); + } + //数据权限示例, 需手动添加此条件 end + //queryWrapper.like(${className}Entity::getId, ${classname}.getId()); + IPage<${className}Entity> iPage = ${classname}Service.page(page, queryWrapper); + log.info("\n this.${classname}Mapper.selectCountUser()="+this.${classname}Mapper.selectCountUser()); + return DataResult.success(iPage); + } + + @PostMapping("${classname}/checkExists") + @ResponseBody + public Boolean checkExists(@RequestBody ${className}Entity ${classname}){ + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(${className}Entity::getId, ${classname}.getId());// 这里换成自己查询的关键条件 + ${className}Entity one = ${classname}Service.getOne(queryWrapper.last("LIMIT 1")); + if(one == null) { + return false; + }else { + return true; + } + } + +} diff --git a/jun_api_online/jun_admin/src/main/resources/vm/Dao.java.vm b/jun_api_online/jun_admin/src/main/resources/vm/Dao.java.vm new file mode 100644 index 000000000..36a5f4563 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/Dao.java.vm @@ -0,0 +1,20 @@ +package ${package}.mapper; + +import ${package}.entity.${className}Entity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +public interface ${className}Mapper extends BaseMapper<${className}Entity> { + + @Select("SELECT count(1) from sys_user") + int selectCountUser(); + +} diff --git a/jun_api_online/jun_admin/src/main/resources/vm/Dao.xml.vm b/jun_api_online/jun_admin/src/main/resources/vm/Dao.xml.vm new file mode 100644 index 000000000..9b44ded64 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/Dao.xml.vm @@ -0,0 +1,14 @@ + + + + + + + +#foreach($column in $columns) + +#end + + + + \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/vm/Entity.java.vm b/jun_api_online/jun_admin/src/main/resources/vm/Entity.java.vm new file mode 100644 index 000000000..c51dc91f3 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/Entity.java.vm @@ -0,0 +1,60 @@ +package ${package}.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jun.plugin.common.entity.BaseFlowEntity; +import org.springframework.data.annotation.Id; + +#if(${hasBigDecimal}) +#end +import java.io.Serializable; + +import lombok.Data; + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +@Data +@TableName("${tableName}") +public class ${className}Entity extends BaseFlowEntity implements Serializable { + private static final long serialVersionUID = 1L; + +##循环,遍历字段信息 +#foreach ($column in $columns) + /** + * $column.comments + */ +##判断是否主键1 +#if($column.columnName == $pk.columnName) + @Id + @TableId("$column.columnName") + private $column.attrType $column.attrname; +#end +##判断是否主键 +#if($column.columnName != $pk.columnName) +##循环列,新增字段描述备注 + @TableField(value = "$column.columnName" ## +#if($column.columnName.toString().contains("creat") || $column.columnName.toString().contains("deleted")) +, fill = FieldFill.INSERT ## +#elseif($column.columnName.toString().contains("update")) +, fill = FieldFill.INSERT_UPDATE ## +#end ) +##循环列,新增字段描述备注dataType +#if($column.dataType == 'datetime') + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +#elseif($column.dataType == 'date') + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") +#end + private $column.attrType $column.attrname; +#end +##循环,结束 +#end + +} diff --git a/jun_api_online/jun_admin/src/main/resources/vm/Service.java.vm b/jun_api_online/jun_admin/src/main/resources/vm/Service.java.vm new file mode 100644 index 000000000..847833676 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/Service.java.vm @@ -0,0 +1,16 @@ +package ${package}.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import ${package}.entity.${className}Entity; + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +public interface ${className}Service extends IService<${className}Entity> { + +} + diff --git a/jun_api_online/jun_admin/src/main/resources/vm/ServiceImpl.java.vm b/jun_api_online/jun_admin/src/main/resources/vm/ServiceImpl.java.vm new file mode 100644 index 000000000..8d8891f2d --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/ServiceImpl.java.vm @@ -0,0 +1,15 @@ +package ${package}.service.impl; + +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import ${package}.mapper.${className}Mapper; +import ${package}.entity.${className}Entity; +import ${package}.service.${className}Service; + + +@Service("${classname}Service") +public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}Entity> implements ${className}Service { + + +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/vm/controller.java.ftl b/jun_api_online/jun_admin/src/main/resources/vm/controller.java.ftl new file mode 100644 index 000000000..b2429b779 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/controller.java.ftl @@ -0,0 +1,78 @@ +package ${package.Controller}; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.web.bind.annotation.RequestMapping; +import ${package.Entity}.${entity}; +import ${package.Service}.${table.serviceName}; +<#if restControllerStyle> + import org.springframework.web.bind.annotation.RestController; +<#else> + import org.springframework.stereotype.Controller; + +import com.laker.admin.framework.model.Response; +import com.laker.admin.framework.model.PageResponse; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +<#if superControllerClassPackage??> + import ${superControllerClassPackage}; + + +/** +*

+ * ${table.comment!} 前端控制器 + *

+* +* @author ${author} +* @since ${date} +*/ +<#if restControllerStyle> + @RestController +<#else> + @Controller + +@RequestMapping("/${cfg.easyModule}/${cfg.easyMain}") +<#if superControllerClass??> + public class ${table.controllerName} extends ${superControllerClass} { +<#else> + public class ${table.controllerName} { + +@Autowired +${table.serviceName} ${table.serviceName?substring(1)?uncap_first}; + +@GetMapping +@ApiOperation(value = "${table.comment!}分页查询") +public PageResponse pageAll(@RequestParam(required = false, defaultValue = "1") long page, +@RequestParam(required = false, defaultValue = "10") long limit) { +Page roadPage = new Page<>(page, limit); +LambdaQueryWrapper<${table.entityName}> queryWrapper = new QueryWrapper().lambda(); +Page pageList = ${table.serviceName?substring(1)?uncap_first}.page(roadPage, queryWrapper); +return PageResponse.ok(pageList.getRecords(), pageList.getTotal()); +} + +@PostMapping +@ApiOperation(value = "新增或者更新${table.comment!}") +public Response saveOrUpdate(@RequestBody ${table.entityName} param) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.saveOrUpdate(param)); +} + +@GetMapping("/{id}") +@ApiOperation(value = "根据id查询${table.comment!}") +public Response get(@PathVariable Long id) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.getById(id)); +} + +@DeleteMapping("/{id}") +@ApiOperation(value = "根据id删除${table.comment!}") +public Response delete(@PathVariable Long id) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.removeById(id)); +} +@DeleteMapping("/batch/{ids}") +@ApiOperation(value = "根据批量删除ids删除") +public Response batchRemove(@PathVariable Long[] ids) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.removeByIds(CollUtil.toList(ids))); +} +} \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/vm/list.html.vm b/jun_api_online/jun_admin/src/main/resources/vm/list.html.vm new file mode 100644 index 000000000..0bf010994 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/list.html.vm @@ -0,0 +1,604 @@ + + + + + Title + + + + + + + + + + + +
+
+
+
+ 在此你可以对${comments}进行编辑!若有操作及使用问题及常见“问题”:请查看操作手册! +
+
+
+###遍历查询条件 +#foreach($column in $columns) +#if($column.columnName != $pk.columnName && $column.isNull == 'NO') +##跳过循环,新增及修改时间字段,注解支持,不展示 +#if($column.columnName.toString().contains("create") || $column.columnName.toString().contains("deleted") || $column.columnName.toString().contains("update")) + #break +#end +#if($column.dataType == 'datetime') +
+ +
+#else +
+ +
+#end +#end +#end +
+ + +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/vm/menu.sql.vm b/jun_api_online/jun_admin/src/main/resources/vm/menu.sql.vm new file mode 100644 index 000000000..0f66241e7 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/menu.sql.vm @@ -0,0 +1,26 @@ +-- 默认上级目录菜单为其他 +INSERT INTO sys_permission (id, name, pid, url,target, type,order_num, deleted, status,create_time,update_time) + VALUES ('${identity}', '${comments}' ,'54', '/index/${classname}','_self', '2', '910',1, 1,now(),now()); +-- 菜单对应按钮SQL +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${selectId}', '${identity}', '列表' , '${classname}/listByPage','${classname}:list', '3',1, 1,now(),now()); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${addId}', '${identity}', '新增' , '${classname}/add','${classname}:add', '3',1, 1,now(),now()); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${updateId}', '${identity}', '修改' , '${classname}/update','${classname}:update', '3',1, 1,now(),now()); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${deleteId}', '${identity}', '删除' , '${classname}/delete','${classname}:delete', '3',1, 1,now(),now()); + +-- INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) +-- VALUES ('${deleteId}11', '${identity}', '提交' , '${classname}/submit','${classname}:submit', '3',1, 1,now(),now()); + + + +select +#foreach($column in $columns) + ${column.columnName} as ${column.attrname}, +#end + 1 as gen +from + ${tableName} +where id != null ; \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/vm/web/add.html.ftl b/jun_api_online/jun_admin/src/main/resources/vm/web/add.html.ftl new file mode 100644 index 000000000..d95915f7c --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/web/add.html.ftl @@ -0,0 +1,63 @@ + + + + + Title + + + +
+
+
+ + <#list table.fields as field> + <#if !field.keyFlag && field.propertyName != 'enable'> +
+ +
+ +
+
+ + <#if field.propertyName == 'enable'> +
+ +
+ + +
+
+ + +
+
+
+
+ + +
+
+
+ + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_admin/src/main/resources/vm/web/edit.html.ftl b/jun_api_online/jun_admin/src/main/resources/vm/web/edit.html.ftl new file mode 100644 index 000000000..f72341635 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/web/edit.html.ftl @@ -0,0 +1,74 @@ + + + + + + + +
+
+
+ + <#list table.fields as field> + <#if field.keyFlag > + +
+ +
+ +
+
+ + + <#if !field.keyFlag && field.propertyName != 'enable'> +
+ +
+ +
+
+ + <#if field.propertyName == 'enable'> +
+ +
+ + +
+
+ + + +
+
+
+
+ + +
+
+
+ + + + + + + diff --git a/jun_api_online/jun_admin/src/main/resources/vm/web/main.html.ftl b/jun_api_online/jun_admin/src/main/resources/vm/web/main.html.ftl new file mode 100644 index 000000000..a69beae59 --- /dev/null +++ b/jun_api_online/jun_admin/src/main/resources/vm/web/main.html.ftl @@ -0,0 +1,113 @@ + + + + + ${table.comment} + + + +
+
+
+
+ +
+ +
+ + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + diff --git a/jun_api_online/jun_admin/src/test/java/com/jun/plugin/JasyptExample.java b/jun_api_online/jun_admin/src/test/java/com/jun/plugin/JasyptExample.java new file mode 100644 index 000000000..57d61fba0 --- /dev/null +++ b/jun_api_online/jun_admin/src/test/java/com/jun/plugin/JasyptExample.java @@ -0,0 +1,24 @@ +package com.jun.plugin; + +import org.jasypt.util.text.BasicTextEncryptor; + +public class JasyptExample { + public static void main(String[] args) { + BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); + + // 设置加密密钥 + textEncryptor.setPassword("123456@@"); +// textEncryptor.setPassword("myEncryptionPassword"); + + // 要加密的数据 + String myText = "This is a text to encrypt"; + + // 加密 + String encryptedText = textEncryptor.encrypt(myText); + System.out.println("Encrypted text: " + encryptedText); + + // 解密 + String decryptedText = textEncryptor.decrypt(encryptedText); + System.out.println("Decrypted text: " + decryptedText); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_api/bizservice/pom.xml b/jun_api_online/jun_api/bizservice/pom.xml new file mode 100644 index 000000000..d012646ed --- /dev/null +++ b/jun_api_online/jun_api/bizservice/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + com.jun.plugin + bizservice + 1.0 + jar + 示例业务模块 + + + + com.jun.plugin + jun_common + 1.0 + + + org.apache.shiro + shiro-core + 1.13.0 + compile + + + org.mybatis + mybatis-spring + 3.0.0 + compile + + + com.baomidou + mybatis-plus-core + 3.5.3.2 + compile + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/Base64.java b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/Base64.java new file mode 100644 index 000000000..ad0965efb --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/Base64.java @@ -0,0 +1,80 @@ +package com.jun.plugin.bizservice; + + +import org.apache.commons.io.FileUtils; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPInputStream; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import java.util.zip.GZIPOutputStream; + +public class Base64 implements Serializable { + public static void main(String[] args) throws IOException { + + File file = new File("C:\\Users\\whbj_wujun\\Desktop\\base64.txt"); + String content = FileUtils.readFileToString(file,StandardCharsets.UTF_8); + //String content = "" + ""; + String compressStr = Base64.compressBase64(content,StandardCharsets.UTF_8.toString()); + + File base64= new File("C:\\Users\\whbj_wujun\\Desktop\\base64-v2.txt"); + FileUtils.writeByteArrayToFile(base64,compressStr.getBytes(StandardCharsets.UTF_8)); + System.out.println(compressStr); +// System.out.println("11111111111111111111111111111111111111111111111111111L"); +// System.out.println(Base64.decodeGzipBase64(compressStr)); + } + + public static String compressBase64(String str, String charset) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + GZIPOutputStream gzip = new GZIPOutputStream(out); + gzip.write(str.getBytes(charset)); + if (gzip != null) { + gzip.close(); + } + BASE64Encoder baseEn = new BASE64Encoder(); + String zipStr = baseEn.encode(out.toByteArray()); + return zipStr; + } catch (Exception e) { + throw new IOException(e); + } finally { + if (out != null) { + out.close(); + } + } + } + + public static String decodeGzipBase64(String str){ + ByteArrayOutputStream out =new ByteArrayOutputStream(); + BASE64Decoder baseDe =new BASE64Decoder(); + try { + byte [] bytes=baseDe.decodeBuffer(str); + + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); + GZIPInputStream gzip = new GZIPInputStream(byteArrayInputStream); + byte [] b =new byte[128]; + int n; + while ((n=gzip.read(b))>=0){ + out.write(b,0,n); + } + }catch (Exception e){ + return null; + } + return out.toString(); + } + + +} + diff --git a/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/config/BizAutoConfig.java b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/config/BizAutoConfig.java new file mode 100644 index 000000000..8f45a370b --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/config/BizAutoConfig.java @@ -0,0 +1,15 @@ +package com.jun.plugin.bizservice.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.bizservice") +@MapperScan(basePackages = "com.jun.plugin.bizservice.mapper") +public class BizAutoConfig { +} diff --git a/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/controller/BizTestController.java b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/controller/BizTestController.java new file mode 100644 index 000000000..bb425547c --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/controller/BizTestController.java @@ -0,0 +1,100 @@ +package com.jun.plugin.bizservice.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jun.plugin.common.Result; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.stereotype.Controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.List; + +import com.jun.plugin.bizservice.entity.BizTestEntity; +import com.jun.plugin.bizservice.service.BizTestService; + + + +/** + * 客户信息 + * + * @author wujun + * @email wujun728@mail.com + * @date 2022-02-28 16:28:58 + */ +@Controller +@RequestMapping("/public") +public class BizTestController { + @Autowired + private BizTestService bizTestService; + + + /** + * 跳转到页面 + */ + @GetMapping("/test") + @ResponseBody + public Result bizTest1() { + return Result.success("11111111111"); + } + /** + * 跳转到页面 + */ + @GetMapping("/json") + @ResponseBody + public Result bizTest2() { + return Result.success(getClass()); + } + + /** + * 跳转到页面 + */ + @GetMapping("/index/bizTest") + public String bizTest() { + return "biztest/list"; + } + + @ApiOperation(value = "新增") + @PostMapping("bizTest/add") + @RequiresPermissions("bizTest:add") + @ResponseBody + public Result add(@RequestBody BizTestEntity bizTest){ + bizTestService.save(bizTest); + return Result.success(); + } + + @ApiOperation(value = "删除") + @DeleteMapping("bizTest/delete") + @RequiresPermissions("bizTest:delete") + @ResponseBody + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids){ + bizTestService.removeByIds(ids); + return Result.success(); + } + + @ApiOperation(value = "更新") + @PutMapping("bizTest/update") + @RequiresPermissions("bizTest:update") + @ResponseBody + public Result update(@RequestBody BizTestEntity bizTest){ + bizTestService.updateById(bizTest); + return Result.success(); + } + + @ApiOperation(value = "查询分页数据") + @PostMapping("bizTest/listByPage") + @RequiresPermissions("bizTest:list") + @ResponseBody + public Result findListByPage(@RequestBody BizTestEntity bizTest){ + Page page = new Page(bizTest.getPage(), bizTest.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + //queryWrapper.eq(BizTestEntity::getId, bizTest.getId()); + IPage iPage = bizTestService.page(page, queryWrapper); + return Result.success(iPage); + } + +} diff --git a/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/entity/BizTestEntity.java b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/entity/BizTestEntity.java new file mode 100644 index 000000000..94d100343 --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/entity/BizTestEntity.java @@ -0,0 +1,94 @@ +package com.jun.plugin.bizservice.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import com.jun.plugin.common.entity.BaseEntity; + + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import lombok.Data; + +/** + * 客户信息 + * + * @author wujun + * @email wujun728@mail.com + * @date 2022-02-28 16:28:58 + */ +@Data +@TableName("biz_test") +public class BizTestEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId("id") + private String id; + + /** + * 客户名称 + */ + @TableField("cusname") + private String cusname; + + /** + * 注册金额 + */ + @TableField("money") + private BigDecimal money; + + /** + * 客户描述 + */ + @TableField("cusdesc") + private String cusdesc; + + /** + * 客户全称 + */ + @TableField("fullname") + private String fullname; + + /** + * 客户性质 + */ + @TableField("dict_cussex") + private String dictCussex; + + /** + * 注册时间 + */ + @TableField("register_date") + private Date registerDate; + + /** + * 客户类型 + */ + @TableField("dict_custype") + private String dictCustype; + + /** + * + */ + @TableField("ref_id") + private String refId; + + /** + * 关联子客户名称 + */ + @TableField("ref_title_username") + private String refTitleUsername; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + +} diff --git a/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/mapper/BizTestMapper.java b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/mapper/BizTestMapper.java new file mode 100644 index 000000000..675ff62f7 --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/mapper/BizTestMapper.java @@ -0,0 +1,16 @@ +package com.jun.plugin.bizservice.mapper; + +import com.jun.plugin.bizservice.entity.BizTestEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 客户信息 + * + * @author wujun + * @email wujun728@mail.com + * @date 2022-02-28 16:28:58 + */ +public interface BizTestMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/service/BizTestService.java b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/service/BizTestService.java new file mode 100644 index 000000000..c924bc19f --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/service/BizTestService.java @@ -0,0 +1,16 @@ +package com.jun.plugin.bizservice.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.bizservice.entity.BizTestEntity; + +/** + * 客户信息 + * + * @author wujun + * @email wujun728@mail.com + * @date 2022-02-28 16:28:58 + */ +public interface BizTestService extends IService { + +} + diff --git a/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/service/impl/BizTestServiceImpl.java b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/service/impl/BizTestServiceImpl.java new file mode 100644 index 000000000..edd4ec4a8 --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/java/com/jun/plugin/bizservice/service/impl/BizTestServiceImpl.java @@ -0,0 +1,15 @@ +package com.jun.plugin.bizservice.service.impl; + +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import com.jun.plugin.bizservice.mapper.BizTestMapper; +import com.jun.plugin.bizservice.entity.BizTestEntity; +import com.jun.plugin.bizservice.service.BizTestService; + + +@Service("bizTestService") +public class BizTestServiceImpl extends ServiceImpl implements BizTestService { + + +} \ No newline at end of file diff --git a/jun_api_online/jun_api/bizservice/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_api/bizservice/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..4983c2e99 --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.bizservice.config.BizAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_api/bizservice/src/main/resources/mapper/BizTestMapper.xml b/jun_api_online/jun_api/bizservice/src/main/resources/mapper/BizTestMapper.xml new file mode 100644 index 000000000..94245a63b --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/resources/mapper/BizTestMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_api/bizservice/src/main/resources/templates/biztest/list.html b/jun_api_online/jun_api/bizservice/src/main/resources/templates/biztest/list.html new file mode 100644 index 000000000..8339baa84 --- /dev/null +++ b/jun_api_online/jun_api/bizservice/src/main/resources/templates/biztest/list.html @@ -0,0 +1,300 @@ + + + + + Title + + + + + + +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_api/pom.xml b/jun_api_online/jun_api/pom.xml new file mode 100644 index 000000000..44e2db5a9 --- /dev/null +++ b/jun_api_online/jun_api/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + com.jun.plugin + jun_api + pom + 1.0 + 业务功能模块 + + + bizservice + + \ No newline at end of file diff --git a/jun_api_online/jun_common/pom.xml b/jun_api_online/jun_common/pom.xml new file mode 100644 index 000000000..18a0766e5 --- /dev/null +++ b/jun_api_online/jun_common/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + com.jun.plugin + jun_common + 1.0 + jar + 公共模块 + + + + io.github.wujun728 + jun-common + 1.0.15 + + + io.github.wujun728 + jun-groovy-api-spring-boot-starter + 1.0.15 + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.2 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_common/src/main/java/com/jun/plugin/bizservice/config/CommonAutoConfig.java b/jun_api_online/jun_common/src/main/java/com/jun/plugin/bizservice/config/CommonAutoConfig.java new file mode 100644 index 000000000..79578f539 --- /dev/null +++ b/jun_api_online/jun_common/src/main/java/com/jun/plugin/bizservice/config/CommonAutoConfig.java @@ -0,0 +1,15 @@ +package com.jun.plugin.bizservice.config; + +//import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.bizservice") +//@MapperScan(basePackages = "com.jun.plugin.bizservice.mapper") +public class CommonAutoConfig { +} diff --git a/jun_api_online/jun_common/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_common/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..ba7a25eaa --- /dev/null +++ b/jun_api_online/jun_common/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.bizservice.config.CommonAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_generator/pom.xml b/jun_api_online/jun_generator/pom.xml new file mode 100644 index 000000000..e494b65f1 --- /dev/null +++ b/jun_api_online/jun_generator/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + + com.jun.plugin + 1.0 + jun_generator + jar + 代码生成器 + + + + UTF-8 + 1.8 + 1.8 + + + + + com.jun.plugin + jun_common + 1.0 + + + + com.baomidou + mybatis-plus-generator + 3.5.3.1 + + + com.baomidou + mybatis-plus-core + 3.5.3.2 + compile + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + velocity + org.apache.velocity + 1.7 + + + commons-configuration + commons-configuration + 1.10 + compile + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + jdk-1.8 + + true + 1.8 + + + 1.8 + 1.8 + 1.8 + + + + + + + + + src/main/resources + true + + + src/main/java + + **/*.tpl + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/AutoConfigModel.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/AutoConfigModel.java new file mode 100644 index 000000000..e09842c9c --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/AutoConfigModel.java @@ -0,0 +1,45 @@ +//package com.jun.plugin.system.code; +// +//import java.util.List; +// +///** +// */ +//public class AutoConfigModel { +// /**表名称**/ +// private String tableName; +// /**表描述**/ +// private String tableComment; +// +// private List beanColumns; +// public String getTableName() { +// return tableName; +// } +// public void setTableName(String tableName) { +// this.tableName = tableName; +// } +// public String getTableComment() { +// return tableComment; +// } +// public void setTableComment(String tableComment) { +// this.tableComment = tableComment; +// } +// +// public AutoConfigModel() { +// super(); +// } +// public List getBeanColumns() { +// return beanColumns; +// } +// public void setBeanColumns(List beanColumns) { +// this.beanColumns = beanColumns; +// } +// public AutoConfigModel(String tableName, String tableComment, +// List beanColumns) { +// super(); +// this.tableName = tableName; +// this.tableComment = tableComment; +// this.beanColumns = beanColumns; +// } +// +// +//} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/BeanColumn.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/BeanColumn.java new file mode 100644 index 000000000..e8d2476bb --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/BeanColumn.java @@ -0,0 +1,509 @@ +package com.jun.plugin.generator.code; + + +/** + * 实体列 + */ +public class BeanColumn { + public String getDictTypeName() { + return dictTypeName; + } + + public void setDictTypeName(String dictTypeName) { + this.dictTypeName = dictTypeName; + } + + + + /** 表\目录 **/ + private String table_catalog; + /** 是否为null **/ + private String is_nullable; + /** 表名 **/ + private String table_name; + /** 数据库 **/ + private String table_schema; + /** 额外的 EXTRA": "auto_increment 自增id **/ + private String extra; + /** 列名 **/ + private String column_name; + /**主键 PRI**/ + private String column_key; + /**数字精度**/ + private String numeric_precision; + /**权限**/ + private String privileges; + /**列注释**/ + private String column_comment; + /**数字刻度**/ + private String numeric_scale; + /**列/类型**/ + private String column_type; + /**生成表达式**/ + private String generation_expression; + /**序数位置**/ + private String ordinal_position; + /**数据类型**/ + private String data_type; + /**默认值**/ + private String column_default; + /**字符最大长度**/ + private String character_maximum_length; + /**字符\八位字节\长度**/ + private String character_octet_length; + /**日期时间精度**/ + private String datetime_precision; + /**字符集名称**/ + private String character_set_name; + /**排序规则名称**/ + private String collation_name; + + /**实体类型 java.lang.String**/ + private String beanType; + + /**实体bean列名 例如:nameVc **/ + private String beanName; + /**mapperxml需要类型 例如:jdbcType="VARCHAR" **/ + private String jdbcType; + + /**java类型**/ + private String javaType; + /**java 首字母大写**/ + private String javaName; + + private Integer htmlType=1;//是字符串类型 + + //字典表名字 + private String dictTypeName; + /**字典表里面的数据**/ + + enum htmlType{ + //字符串类型,labne类型,switch按钮类型,时间类型,上传类型 + STRING("String",1), + LABLE("lable",2), + SWITCH("switch",3), + TIME("time",4), + UPLOAD("upload",5); + + htmlType(String type, int value) { + this.type = type; + this.value = value; + } + public String type; + public int value; + + } + + + public BeanColumn() { + super(); + } + + public String getTable_catalog() { + return table_catalog; + } + + public void setTable_catalog(String table_catalog) { + this.table_catalog = table_catalog; + } + + public String getIs_nullable() { + return is_nullable; + } + + public void setIs_nullable(String is_nullable) { + this.is_nullable = is_nullable; + } + + public String getTable_name() { + return table_name; + } + + public void setTable_name(String table_name) { + this.table_name = table_name; + } + + public String getTable_schema() { + return table_schema; + } + + public void setTable_schema(String table_schema) { + this.table_schema = table_schema; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } + + public String getColumn_name() { + return column_name; + } + + public void setColumn_name(String column_name) { + this.column_name = column_name; + } + + public String getColumn_key() { + return column_key; + } + + public void setColumn_key(String column_key) { + this.column_key = column_key; + } + + public String getNumeric_precision() { + return numeric_precision; + } + + public void setNumeric_precision(String numeric_precision) { + this.numeric_precision = numeric_precision; + } + + public String getPrivileges() { + return privileges; + } + + public void setPrivileges(String privileges) { + this.privileges = privileges; + } + + public String getColumn_comment() { + return column_comment; + } + + public void setColumn_comment(String column_comment) { + this.column_comment = column_comment; + } + + public String getNumeric_scale() { + return numeric_scale; + } + + public void setNumeric_scale(String numeric_scale) { + this.numeric_scale = numeric_scale; + } + + public String getColumn_type() { + return column_type; + } + + public void setColumn_type(String column_type) { + this.column_type = column_type; + } + + public String getGeneration_expression() { + return generation_expression; + } + + public void setGeneration_expression(String generation_expression) { + this.generation_expression = generation_expression; + } + + public String getOrdinal_position() { + return ordinal_position; + } + + public void setOrdinal_position(String ordinal_position) { + this.ordinal_position = ordinal_position; + } + + public String getData_type() { + return data_type; + } + + public void setData_type(String data_type) { + this.data_type = data_type; + } + + public String getColumn_default() { + return column_default; + } + + public void setColumn_default(String column_default) { + this.column_default = column_default; + } + + public String getCharacter_maximum_length() { + return character_maximum_length; + } + + public void setCharacter_maximum_length(String character_maximum_length) { + this.character_maximum_length = character_maximum_length; + } + + public String getCharacter_octet_length() { + return character_octet_length; + } + + public void setCharacter_octet_length(String character_octet_length) { + this.character_octet_length = character_octet_length; + } + + public String getDatetime_precision() { + return datetime_precision; + } + + public void setDatetime_precision(String datetime_precision) { + this.datetime_precision = datetime_precision; + } + + public String getCharacter_set_name() { + return character_set_name; + } + + public void setCharacter_set_name(String character_set_name) { + this.character_set_name = character_set_name; + } + + public String getCollation_name() { + return collation_name; + } + + public void setCollation_name(String collation_name) { + this.collation_name = collation_name; + } + + public String getJavaType() { + String beanType=this.getBeanType(); + String returnStr="String"; + if(beanType==null) { + return returnStr; + }else { + returnStr=beanType.substring(beanType.lastIndexOf(".")+1,beanType.length()); + } + javaType=returnStr; + return javaType; + } + + public void setJavaType(String javaType) { + this.javaType = javaType; + } + + public String getBeanType() { + String type=this.getData_type(); + String returnStr="java.lang.String"; + if(type==null) { + return returnStr; + } + switch(type) { + case "tinyint" : + returnStr="java.lang.Integer"; + break; + case "smallint" : + returnStr="java.lang.Integer"; + break; + case "int" : + returnStr="java.lang.Integer"; + break; + case "bigint" : + returnStr="java.lang.Long"; + break; + case "mediumint" : + returnStr="java.lang.Integer"; + break; + case "integer" : + returnStr="java.lang.Integer"; + break; + case "float" : + returnStr="java.lang.Float"; + break; + case "double" : + returnStr="java.lang.Double"; + break; + case "decimal" : + returnStr="java.math.BigDecimal"; + break; + case "bit" : + returnStr="java.lang.Byte"; + break; + case "char" : + returnStr="java.lang.Character"; + break; + case "varchar" : + returnStr="java.lang.String"; + break; + case "tinytext" : + returnStr="java.lang.String"; + break; + case "text" : + returnStr="java.lang.String"; + break; + case "mediumtext" : + returnStr="java.lang.String"; + break; + case "longtext" : + returnStr="java.lang.String"; + break; + case "date" : + returnStr="java.util.Date"; + break; + case "datetime" : + returnStr="java.util.Date"; + break; + case "timestamp" : + returnStr="java.util.Date"; + break; + default: + break; + } + beanType=returnStr; + return beanType; + } + + public void setBeanType(String beanType) { + this.beanType = beanType; + } + + public String getBeanName() { + if(getColumn_name()!=null) { + return StringUtils.upperCase_(this.column_name,false); + } + return beanName; + } + public void setBeanName(String beanName) { + this.beanName = beanName; + } + public String getJavaName() { + javaName=StringUtils.firstUpperCase(getBeanName()); + return javaName; + } + + public void setJavaName(String javaName) { + this.javaName = javaName; + } + + public String getJdbcType() { + String datetype=getData_type(); + String returnStr="VARCHAR"; + if(datetype==null) { + return returnStr; + } + switch(datetype) { + case "tinyint" : + returnStr="TINYINT"; + break; + case "smallint" : + returnStr="SMALLINT"; + break; + case "int" : + returnStr="INTEGER"; + break; + case "bigint" : + returnStr="BIGINT"; + break; + case "mediumint" : + returnStr="INTEGER"; + break; + case "integer" : + returnStr="INTEGER"; + break; + case "float" : + returnStr="REAL"; + break; + case "double" : + returnStr="DOUBLE"; + break; + case "decimal" : + returnStr="DECIMAL"; + break; + case "bit" : + returnStr="OTHER"; + break; + case "char" : + returnStr="CHAR"; + break; + case "varchar" : + returnStr="VARCHAR"; + break; + case "tinytext" : + returnStr="VARCHAR"; + break; + case "text" : + returnStr="VARCHAR"; + break; + case "mediumtext" : + returnStr="VARCHAR"; + break; + case "longtext" : + returnStr="VARCHAR"; + break; + case "date" : + returnStr="TIMESTAMP"; + break; + case "datetime" : + returnStr="TIMESTAMP"; + break; + case "timestamp" : + returnStr="TIMESTAMP"; + break; + default: + break; + } + jdbcType=returnStr; + return jdbcType; + } + + public void setJdbcType(String jdbcType) { + this.jdbcType = jdbcType; + } + + public BeanColumn(String table_catalog, String is_nullable, String table_name, String table_schema, String extra, + String column_name, String column_key, String numeric_precision, String privileges, String column_comment, + String numeric_scale, String column_type, String generation_expression, String ordinal_position, + String data_type, String column_default, String character_maximum_length, String character_octet_length, + String datetime_precision, String character_set_name, String collation_name,String htmlType,String dictTypeName + + ) { + super(); + this.table_catalog = table_catalog; + this.is_nullable = is_nullable; + this.table_name = table_name; + this.table_schema = table_schema; + this.extra = extra; + this.column_name = column_name; + this.column_key = column_key; + this.numeric_precision = numeric_precision; + this.privileges = privileges; + this.column_comment = column_comment; + this.numeric_scale = numeric_scale; + this.column_type = column_type; + this.generation_expression = generation_expression; + this.ordinal_position = ordinal_position; + this.data_type = data_type; + this.column_default = column_default; + this.character_maximum_length = character_maximum_length; + this.character_octet_length = character_octet_length; + this.datetime_precision = datetime_precision; + this.character_set_name = character_set_name; + this.collation_name = collation_name; + this.beanType = getBeanType(); + this.beanName = getBeanName(); + this.jdbcType=getJdbcType(); + this.javaType=getJavaType(); + this.javaName=getJavaName(); + this.htmlType=getHtmlType(); + this.dictTypeName=getDictTypeName(); + } + + public Integer getHtmlType() { + return htmlType; + } + + public void setHtmlType(Integer htmlType) { + this.htmlType = htmlType; + } + + + + + + + + + + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/StringUtils.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/StringUtils.java new file mode 100644 index 000000000..94d371d8f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/StringUtils.java @@ -0,0 +1,98 @@ +package com.jun.plugin.generator.code; + + + + + +/** + * 字符串工具类 + * + * @author fc + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 空字符串 */ + private static final String NULLSTR = ""; + + + + + + + + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + + + + + /** + * 首字母大写 + * + * @param name + * @return + */ + public static String firstUpperCase(String name) { + name = name.substring(0, 1).toUpperCase() + name.substring(1); + return name; + } + /** + * 首字母小写 + * + * @param name + * @return + */ + public static String firstLowerCase(String name) { + name = name.substring(0, 1).toLowerCase() + name.substring(1); + return name; + + } + + /** + * 将下划线转化为大写 + * + * @param name + * @param firstCase 首字母是否大写 true:大写 false;小写 + * @return + */ + public static String upperCase_(String name, boolean firstCase) { + if(isEmpty(name)){ + return ""; + } + String[] s = name.split("_"); + StringBuffer stringBuffer = new StringBuffer(); + for (String s1 : s) { + stringBuffer.append(s1.substring(0, 1).toUpperCase() + s1.substring(1)); + } + if(!firstCase){ + return firstLowerCase(stringBuffer.toString()); + } + return stringBuffer.toString(); + } + + + + + +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/TableInfo.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/TableInfo.java new file mode 100644 index 000000000..bc9d77376 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/TableInfo.java @@ -0,0 +1,141 @@ +package com.jun.plugin.generator.code; + +import com.jun.plugin.generator.utils.GenUtils; +import org.apache.commons.lang.WordUtils; + +import java.util.List; +import java.util.Objects; + +/** + * 数据库表对象 + */ +public class TableInfo { + + /** + * 数据库表名字 t_fifle + */ + private String tableName; + + /** + * java表名字例如 SysOperLog + */ + private String javaTableName; + + /** + * 数据表注释 例如文件管理系统 + */ + private String tableComment; + + /** + * java表名字例如 sysOperLog + */ + private String javaTableName_a; + + /** + * 字段集合 + */ + List beanColumns; + + /** + * Entity基类字段 + */ + public static final String[] BASE_ENTITY = {"createBy" , "createTime" , "updateBy" , "updateTime" , "remark"}; + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getJavaTableName() { + return javaTableName; + } + + public void setJavaTableName(String javaTableName) { + this.javaTableName = javaTableName; + } + + public List getBeanColumns() { + return beanColumns; + } + + public void setBeanColumns(List beanColumns) { + this.beanColumns = beanColumns; + } + + public String getTableComment() { + return tableComment; + } + + public void setTableComment(String tableComment) { + this.tableComment = tableComment; + } + + public String getJavaTableName_a() { + return javaTableName_a; + } + + public void setJavaTableName_a(String javaTableName_a) { + this.javaTableName_a = javaTableName_a; + } + + public TableInfo(String tableName, List beanColumns, String tableComment) { + super(); + this.tableName = tableName; + this.javaTableName = tableToJava(tableName); + this.beanColumns = beanColumns; + this.tableComment = tableComment; + this.javaTableName_a = tableToJava_a(tableName); + } + + public TableInfo() { + super(); + } + + /** + * 列名转换成Java属性名 + * + * @param columnName + * @return + */ + public String columnToJava(String columnName) { + return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_" , ""); + } + + /** + * 表名转换成Java类名 + * + * @param tableName + * @return + */ + public String tableToJava(String tableName) { + String tablePrefix = Objects.requireNonNull(GenUtils.getConfig().getString("tablePrefix")); + if (StringUtils.isNotBlank(tablePrefix)) { + tableName = tableName.replaceFirst(tablePrefix, ""); + } + return columnToJava(tableName); + } + + /** + * 首字母小写 + * + * @param tableName + * @return + */ + public String tableToJava_a(String tableName) { + String str = tableToJava(tableName); + return StringUtils.firstLowerCase(str); + } + + /** + * + * + * @param javaField + * @return + */ + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, BASE_ENTITY); + } +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/TsysTables.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/TsysTables.java new file mode 100644 index 000000000..c7a491e68 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/code/TsysTables.java @@ -0,0 +1,59 @@ +package com.jun.plugin.generator.code; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + + +public class TsysTables implements Serializable{ + private static final long serialVersionUID = 1L; + private String tableName;//表名 + private String engine;//表引擎 + private String tableComment;//表注释 + private String tableModel;//表实体名字 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date createTime; + public String getTableName() { + return tableName; + } + public void setTableName(String tableName) { + this.tableName = tableName; + } + public String getEngine() { + return engine; + } + public void setEngine(String engine) { + this.engine = engine; + } + public String getTableComment() { + return tableComment; + } + public void setTableComment(String tableComment) { + this.tableComment = tableComment; + } + public String getTableModel() { + return tableModel; + } + public void setTableModel(String tableModel) { + this.tableModel = tableModel; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public TsysTables(String tableName, String engine, String tableComment, String tableModel, Date createTime) { + super(); + this.tableName = tableName; + this.engine = engine; + this.tableComment = tableComment; + this.tableModel = tableModel; + this.createTime = createTime; + } + public TsysTables() { + super(); + } + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/config/DevtoolsAutoConfig.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/config/DevtoolsAutoConfig.java new file mode 100644 index 000000000..ba06d41dd --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/config/DevtoolsAutoConfig.java @@ -0,0 +1,15 @@ +package com.jun.plugin.generator.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@ComponentScan(basePackages = "com.jun.plugin.generator") +@MapperScan(basePackages = "com.jun.plugin.generator.mapper") +@Configuration +public class DevtoolsAutoConfig { +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/controller/CodeController.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/controller/CodeController.java new file mode 100644 index 000000000..96ffd30bf --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/controller/CodeController.java @@ -0,0 +1,42 @@ +package com.jun.plugin.generator.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.db.meta.MetaUtil; +import cn.hutool.db.meta.Table; +import cn.hutool.extra.spring.SpringUtil; +import com.jun.plugin.common.Result; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.sql.DataSource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/code") +public class CodeController { + + //RestServiceController + + @GetMapping("/getTableList") + public Result getTableList(){ + DataSource dataSource = SpringUtil.getBean(DataSource.class); + List tables = MetaUtil.getTables(dataSource); + List tablemap = new ArrayList<>(); + for(String tab : tables){ + Table table = MetaUtil.getTableMeta(dataSource,tab); + Map map = new HashMap(){{ + put("tableName",table.getTableName()); + put("tableComment",table.getComment()); + put("createTime", DateUtil.now()); + put("updateTime", DateUtil.now()); + }}; + tablemap.add(map); + } + return Result.success(tablemap); + } + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/controller/SysGeneratorController.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/controller/SysGeneratorController.java new file mode 100644 index 000000000..c2fc6d349 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/controller/SysGeneratorController.java @@ -0,0 +1,127 @@ +package com.jun.plugin.generator.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import com.jun.plugin.common.utils.DataResult; +import com.jun.plugin.common.Result; +import com.jun.plugin.generator.code.BeanColumn; +import com.jun.plugin.generator.code.TableInfo; +import com.jun.plugin.generator.entity.SysGenerator; +import com.jun.plugin.generator.service.ISysGeneratorService; +import com.jun.plugin.generator.utils.GenUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipOutputStream; + +/** + * 代码生成 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "系统模块-代码生成") +@Slf4j +@Controller +@RequestMapping("/sysGenerator") +public class SysGeneratorController { + @Resource + private ISysGeneratorService sysGeneratorService; + + private String prefix = "generator"; +// @Autowired +// private ITGeneratorService generatorService; + + /** + * 生成代码 + */ + @ApiOperation(value = "生成") + @GetMapping("/gen") +// //@RequiresPermissions("sysGenerator:add") + @ResponseBody + public void code(String tables, HttpServletResponse response) throws IOException { + byte[] data = sysGeneratorService.generatorCode(tables.split(",")); + + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\""+tables+".zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + + IOUtils.write(data, response.getOutputStream()); + } + + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPage") + //@RequiresPermissions("sysGenerator:list") + @ResponseBody + public Result findListByPage(@RequestBody SysGenerator vo) { + Page page = new Page(vo.getPage(), vo.getLimit()); + IPage iPage = sysGeneratorService.selectAllTables(page, vo); + return Result.success(iPage); + } + + + /** + * 生成文件Zip + * + * @throws IOException + * @author fuce + * @Date 2021年1月15日 下午2:21:55 + */ + @GetMapping("/createAutoZip") + @ResponseBody + public void createAutoZip(String tableName,String tableComment, HttpServletResponse response) throws IOException { + byte[] b; + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + // 根据表名查询表字段集合 + List list = sysGeneratorService.queryColumns2(tableName); + // 初始化表信息 + TableInfo tableInfo = new TableInfo(tableName, list, tableComment); + // 自动生成 + GenUtils.autoCodeOneModel(tableInfo, tableName,tableComment, zip); + IOUtils.closeQuietly(zip); + b = outputStream.toByteArray(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\""+tableName+".zip\""); + response.addHeader("Content-Length", "" + b.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(b, response.getOutputStream()); + } + + + /** + * 预览生成文件 + * + * @author fuce + * @Date 2021年1月15日 下午2:21:55 + */ + @GetMapping("/viewAuto") + public String viewAuto(@RequestParam String tableName ,String tableComment, ModelMap model) { + List list = sysGeneratorService.queryColumns2(tableName); + TableInfo tableInfo = new TableInfo(tableName, list, tableComment);//获取表信息 + //查询表信息 + Map table = sysGeneratorService.queryTable(tableName); + //查询列信息 + List> columns = sysGeneratorService.queryColumns(tableName); + //生成代码VIEW + Map map = GenUtils.generatorCode(table, columns, null,true); + model.put("viewmap", map); + return "generator/view"; + } + + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/ColumnEntity.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/ColumnEntity.java new file mode 100644 index 000000000..d50f1a865 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/ColumnEntity.java @@ -0,0 +1,115 @@ +package com.jun.plugin.generator.entity; + +import lombok.Data; + +/** + * 代码生成 列属性 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class ColumnEntity { + /** + * 列名 + */ + private String columnName; + + /** + * 列名类型 + */ + private String dataType; + + /** + * 列名备注 + */ + private String comments; + + /** + * 属性名称(第一个字母大写),如:user_name => UserName + */ + private String attrName; + + /** + * 属性名称(第一个字母小写),如:user_name => userName + */ + private String attrname; + + /** + * 属性类型 + */ + private String attrType; + + /** + * 属性长度 + */ + private String maxLength; + + /** + * 属性是否必填 + */ + private String isNull; + + /** + * auto_increment + */ + private String extra; + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public String getAttrname() { + return attrname; + } + + public void setAttrname(String attrname) { + this.attrname = attrname; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrType() { + return attrType; + } + + public void setAttrType(String attrType) { + this.attrType = attrType; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/SysGenerator.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/SysGenerator.java new file mode 100644 index 000000000..f46cdb6a0 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/SysGenerator.java @@ -0,0 +1,34 @@ +package com.jun.plugin.generator.entity; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 代码生成 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysGenerator extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + private String tableName; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + private String tableComment; + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/TableEntity.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/TableEntity.java new file mode 100644 index 000000000..6ac4e0b43 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/entity/TableEntity.java @@ -0,0 +1,84 @@ +package com.jun.plugin.generator.entity; + +import java.util.List; + +/** + * 代码生成 表数据 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public class TableEntity { + //表的名称 + private String tableName; + //表的备注 + private String comments; + //表的主键 + private ColumnEntity pk; + //表的列名(不包含主键) + private List columns; + + //类名(第一个字母大写),如:sys_user => SysUser + private String className; + //类名(第一个字母小写),如:sys_user => sysUser + private String classname; + //类名(都小写),如:sys_user => sysuser + private String classNameLower; + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public ColumnEntity getPk() { + return pk; + } + + public void setPk(ColumnEntity pk) { + this.pk = pk; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + } + + public String getClassNameLower() { + return classNameLower; + } + + public void setClassNameLower(String classNameLower) { + this.classNameLower = classNameLower; + } +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/mapper/GeneratorMapper.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/mapper/GeneratorMapper.java new file mode 100644 index 000000000..c48ddca80 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/mapper/GeneratorMapper.java @@ -0,0 +1,45 @@ +package com.jun.plugin.generator.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.generator.code.BeanColumn; +import com.jun.plugin.generator.code.TsysTables; +import com.jun.plugin.generator.entity.SysGenerator; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface GeneratorMapper extends BaseMapper { + + IPage selectAllTables(Page page, @Param(value = "vo") SysGenerator vo); + + Map queryTable(String tableName); + + List> queryColumns(String tableName); + + + /** + * 查询当前所有表 + * @param tableName 条件搜索 + * @return + */ + List queryList(String tableName); + + /** + * 查询表详情 + * @param tableName + * @return + */ + List queryColumns2(String tableName); + List> queryColumns3(String tableName); +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/service/ISysGeneratorService.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/service/ISysGeneratorService.java new file mode 100644 index 000000000..a96c5d668 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/service/ISysGeneratorService.java @@ -0,0 +1,61 @@ +package com.jun.plugin.generator.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.generator.code.BeanColumn; +import com.jun.plugin.generator.code.TsysTables; +import com.jun.plugin.generator.entity.SysGenerator; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface ISysGeneratorService { + + /** + * 获取所有表 + * + * @param page page + * @param vo vo + * @return IPage + */ + IPage selectAllTables(Page page, SysGenerator vo); + + /** + * 生成代码 + * + * @param tables tables + * @return byte[] + */ + byte[] generatorCode(String[] tables); + + + Map queryTable(String tableName); + + List> queryColumns(String tableName); + + /** + * 查询具体某表信息 + * + * @param tableName + * @return + */ + public List queryList(String tableName); + + /** + * 查询表详情 + * + * @param tableName + * @return + */ + public List queryColumns2(String tableName); + + + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/service/impl/SysGeneratorServiceImpl.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/service/impl/SysGeneratorServiceImpl.java new file mode 100644 index 000000000..874db789c --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/service/impl/SysGeneratorServiceImpl.java @@ -0,0 +1,96 @@ +package com.jun.plugin.generator.service.impl; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.generator.code.BeanColumn; +import com.jun.plugin.generator.code.TsysTables; +import com.jun.plugin.generator.entity.SysGenerator; +import com.jun.plugin.generator.mapper.GeneratorMapper; +import com.jun.plugin.generator.service.ISysGeneratorService; +import com.jun.plugin.generator.utils.GenUtils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipOutputStream; + +/** + * 代码生成 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +@Slf4j +public class SysGeneratorServiceImpl implements ISysGeneratorService { + @Resource + GeneratorMapper generatorMapper; + +// public SysGeneratorServiceImpl(GeneratorMapper generatorMapper) { +// this.generatorMapper = generatorMapper; +// } + + @Override + public IPage selectAllTables(Page page, SysGenerator vo) { + return generatorMapper.selectAllTables(page, vo); + } + + @Override + public byte[] generatorCode(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + + for (String tableName : tableNames) { + //查询表信息 + Map table = queryTable(tableName); + //查询列信息 + List> columns = queryColumns(tableName); + //生成代码 + GenUtils.generatorCode(table, columns, zip,false); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + @Override + public Map queryTable(String tableName) { + return generatorMapper.queryTable(tableName); + } + @Override + public List> queryColumns(String tableName) { + return generatorMapper.queryColumns(tableName); + } + + + + /** + * 查询具体某表信息 + * + * @param tableName + * @return + */ + @Override + public List queryList(String tableName) { + return generatorMapper.queryList(tableName); + } + + /** + * 查询表详情 + * + * @param tableName + * @return + */ + @Override + public List queryColumns2(String tableName) { + System.out.println("queryColumns2>>>" + JSONUtil.toJsonPrettyStr(generatorMapper.queryColumns3(tableName))); + return generatorMapper.queryColumns2(tableName); + } + + +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/swagger/BuildController.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/swagger/BuildController.java new file mode 100644 index 000000000..fc8b198c8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/swagger/BuildController.java @@ -0,0 +1,27 @@ +package com.jun.plugin.generator.swagger; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author 小懒虫 + * @date 2018/8/14 + */ +@Controller +@RequestMapping("/dev/build") +public class BuildController { + + @GetMapping("/index") + public String index(Model model){ + return "/devtools/build/index"; + } + + @GetMapping("/test111") + @ResponseBody + public String test1(Model model){ + return "1111"; + } +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/swagger/SwaggerController.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/swagger/SwaggerController.java new file mode 100644 index 000000000..22d190d64 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/swagger/SwaggerController.java @@ -0,0 +1,19 @@ +package com.jun.plugin.generator.swagger; + +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * @author 小懒虫 + * @date 2018/12/9 + */ +@Controller +public class SwaggerController { + + @GetMapping("/dev/swagger") +// @RequiresPermissions("/dev/swagger") + public String index(){ + return "redirect:/doc.html"; + } +} diff --git a/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/utils/GenUtils.java b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/utils/GenUtils.java new file mode 100644 index 000000000..62be5837f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/java/com/jun/plugin/generator/utils/GenUtils.java @@ -0,0 +1,544 @@ +package com.jun.plugin.generator.utils; + +import cn.hutool.core.date.DateTime; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.jun.plugin.common.exception.BusinessException; + +import com.jun.plugin.common.utils.DateUtils; +import com.jun.plugin.generator.code.TableInfo; +import com.jun.plugin.generator.entity.ColumnEntity; +import com.jun.plugin.generator.entity.TableEntity; +import org.apache.commons.configuration.Configuration; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +import java.io.*; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 代码生成器 工具类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public class GenUtils { + + static Configuration config = getConfig(); + + public static List getTemplates() { + if(false){ + return getTemplates2(); + }else{ + List templates = new ArrayList<>(); + templates.add("vm/Entity.java.vm"); + templates.add("vm/Dao.java.vm"); + templates.add("vm/Dao.xml.vm"); + templates.add("vm/Service.java.vm"); + templates.add("vm/ServiceImpl.java.vm"); + templates.add("vm/Controller.java.vm"); + templates.add("vm/menu.sql.vm"); + templates.add("vm/list.html.vm"); + return templates; + } + } + + public static List getTemplates2() { + List templates = new ArrayList(); + + //java代码模板 + templates.add("vm2/model/Entity.java.vm"); + //templates.add("auto_code/model/EntityExample.java.vm"); + templates.add("vm2/mapperxml/EntityMapper.xml.vm"); + templates.add("vm2/service/EntityService.java.vm"); + templates.add("vm2/service/impl/EntityServiceImpl.java.vm"); + templates.add("vm2/mapper/EntityMapper.java.vm"); + templates.add("vm2/controller/EntityController.java.vm"); + //前端模板 + templates.add("vm2/html/list.html.vm"); + templates.add("vm2/html/add.html.vm"); + templates.add("vm2/html/edit.html.vm"); + //sql模板 + templates.add("vm2/sql/menu.sql.vm"); + //templates.add("auto_code/说明.txt.vm"); + return templates; + } + + /** + * 生成代码 + */ + public static Map generatorCode(Map table, List> columns, ZipOutputStream zip,Boolean isView) { + Map velocityMap = new HashMap(); + + //配置信息 + Configuration config = getConfig(); + boolean hasBigDecimal = false; + //表信息 + TableEntity tableEntity = new TableEntity(); + tableEntity.setTableName(table.get("tableName")); + tableEntity.setComments(table.get("tableComment")); + //表名转换成Java类名 + String className = tableToJava(tableEntity.getTableName(), config.getStringArray("tablePrefix")); + tableEntity.setClassName(className); + tableEntity.setClassname(StringUtils.uncapitalize(className)); + tableEntity.setClassNameLower(className.toLowerCase()); + + //列信息 + List columsList = new ArrayList<>(); + for (Map column : columns) { + ColumnEntity columnEntity = new ColumnEntity(); + columnEntity.setColumnName(column.get("columnName")); + columnEntity.setDataType(column.get("dataType")); + columnEntity.setComments(column.get("columnComment")); + columnEntity.setExtra(column.get("extra")); + columnEntity.setMaxLength(String.valueOf(column.get("maxLength"))); + columnEntity.setIsNull(column.get("isNull")); + + //列名转换成Java属性名 + String attrName = columnToJava(columnEntity.getColumnName()); + columnEntity.setAttrName(attrName); + columnEntity.setAttrname(StringUtils.uncapitalize(attrName)); + + //列的数据类型,转换成Java类型 + String attrType = config.getString(columnEntity.getDataType(), "unknowType"); + columnEntity.setAttrType(attrType); + if (!hasBigDecimal && "BigDecimal".equals(attrType)) { + hasBigDecimal = true; + } + //是否主键 + if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) { + tableEntity.setPk(columnEntity); + } + + columsList.add(columnEntity); + } + tableEntity.setColumns(columsList); + + //没主键,则第一个字段为主键 + if (tableEntity.getPk() == null) { + tableEntity.setPk(tableEntity.getColumns().get(0)); + } + + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + String mainPath = config.getString("mainPath"); + mainPath = StringUtils.isBlank(mainPath) ? "com.jun.plugin" : mainPath; + //封装模板数据 + Map map = new HashMap<>(15); + map.put("tableName", tableEntity.getTableName()); + map.put("comments", tableEntity.getComments()); + map.put("pk", tableEntity.getPk()); + map.put("className", tableEntity.getClassName()); + map.put("classname", tableEntity.getClassname()); + map.put("pathName", tableEntity.getClassname().toLowerCase()); + map.put("columns", tableEntity.getColumns()); + map.put("classNameLower", tableEntity.getClassNameLower()); + map.put("hasBigDecimal", hasBigDecimal); + map.put("mainPath", mainPath); + map.put("package", config.getString("package")); + map.put("author", config.getString("author")); + map.put("email", config.getString("email")); + map.put("datetime", DateUtils.dateTime()); + map.put("identity", IdWorker.getId()); + map.put("addId", IdWorker.getId()); + map.put("updateId", IdWorker.getId()); + map.put("deleteId", IdWorker.getId()); + map.put("selectId", IdWorker.getId()); + + + VelocityContext context = new VelocityContext(map); + + //获取模板列表 + List templates = getTemplates(); + for (String template : templates) { + //渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, "UTF-8"); + tpl.merge(context, sw); + + try { + if(!isView){ + //添加到zip + zip.putNextEntry(new ZipEntry(Objects.requireNonNull(getFileName(template, tableEntity.getClassName(), config.getString("package"), config.getString("package"))))); + IOUtils.write(sw.toString(), zip, "UTF-8"); + IOUtils.closeQuietly(sw); + zip.closeEntry(); + } + } catch (IOException e) { + throw new BusinessException("渲染模板失败,表名:" + tableEntity.getTableName()); + } + velocityMap.put(template.substring(template.lastIndexOf("/") + 1, template.lastIndexOf(".vm")), sw.toString()); + } + return velocityMap; + + } + + + /** + * 预览方法 + * + * @param tableInfo 数据库表 + * @return + * @author fuce + * @Date 2021年1月18日 上午2:10:55 + */ + public static Map viewAuto(TableInfo tableInfo, String tableName , String tableComment) { + Map velocityMap = new HashMap(); + + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class" , "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + Map map = new HashMap<>(); + //数据库表数据 + map.put("tableInfo" , tableInfo); + //字段集合 + map.put("beanColumns" , tableInfo.getBeanColumns()); + //配置文件 + map.put("SnowflakeIdWorker" , "SnowflakeIdWorker.class"); + //class类路径 + map.put("parentPack" , config.getString("package")); + //作者 + map.put("author" , config.getString("author")); + //时间 + map.put("datetime" , new DateTime()); + //sql需要的权限父级pid + map.put("pid" , "0"); + + VelocityContext velocityContext = new VelocityContext(map); + //获取模板列表 + List templates = getTemplates(); + for (String template : templates) { + Template tpl = Velocity.getTemplate(template, "UTF-8"); + StringWriter sw = new StringWriter(); + tpl.merge(velocityContext, sw); + System.out.println("输出模板"); + System.out.println(sw); + System.out.println("输出模板 end"); + velocityMap.put(template.substring(template.lastIndexOf("/") + 1, template.lastIndexOf(".vm")), sw.toString()); + } + return velocityMap; + } + + + /** + * 列名转换成Java属性名 + */ + public static String columnToJava(String field) { + String[] fields = field.split("_"); + StringBuilder sbuilder = new StringBuilder(fields[0]); + for (int i = 1; i < fields.length; i++) { + char[] cs = fields[i].toCharArray(); + cs[0] -= 32; + sbuilder.append(String.valueOf(cs)); + } + return sbuilder.toString().substring(0, 1).toUpperCase() + sbuilder.toString().substring(1); + } + + + /** + * 表名转换成Java类名 + */ + public static String tableToJava(String tableName, String[] tablePrefixArray) { + tableName = tableName.toLowerCase(); + if (null != tablePrefixArray && tablePrefixArray.length > 0) { + for (String tablePrefix : tablePrefixArray) { + tablePrefix = tablePrefix.toLowerCase(); + tableName = tableName.replace(tablePrefix, ""); + } + } + return columnToJava(tableName); + } + + /** + * 获取配置信息 + */ + public static Configuration getConfig() { + try { + return new PropertiesConfiguration("generator.properties"); + } catch (ConfigurationException e) { + throw new BusinessException("获取配置文件失败"); + } + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, String className, String packageName, String targetPath) { + String packagePath = "main" + File.separator + "java" + File.separator; + if (StringUtils.isNotBlank(packageName)) { + packagePath += packageName.replace(".", File.separator) + File.separator; + } + + if (template.contains("Entity.java.vm")) { + return packagePath + "entity" + File.separator + className + "Entity.java"; + } + + if (template.contains("Dao.java.vm")) { + return packagePath + "mapper" + File.separator + className + "Mapper.java"; + } + + if (template.contains("Service.java.vm")) { + return packagePath + "service" + File.separator + className + "Service.java"; + } + + if (template.contains("ServiceImpl.java.vm")) { + return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java"; + } + + if (template.contains("Controller.java.vm")) { + return packagePath + "controller" + File.separator + className + "Controller.java"; + } + + if (template.contains("Dao.xml.vm")) { + return "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml"; + } + + if (template.contains("menu.sql.vm")) { + return className.toLowerCase() + "_menu.sql"; + } + + if (template.contains("generator.html.vm")) { + return "main" + File.separator + "resources" + File.separator + "templates2" + File.separator + className.toLowerCase() + File.separator + "list" + ".html"; + } + return getCoverFileName(template,className,packageName,config.getString("parentPath")); + +// return null; + } + // **************************************************************************************************************** + // **************************************************************************************************************** + // **************************************************************************************************************** + + /** + * @param template + * @return + * @author fuce + * @Date 2021年1月17日 下午6:40:57 + */ + public static String getCoverFileName(String template, String className, String packageName, String targetPath) { + + String separator = File.separator; + String packagePath = targetPath + separator + "src" + separator + "main" + separator + "java" + separator; + String resourcesPath = targetPath + separator + "src" + separator + "main" + separator + "resources" + separator; + ; + if (StringUtils.isNotBlank(packageName)) { + packagePath += packageName.replace("." , separator) + separator; + } + + //model.java + if (template.contains("Entity.java.vm")) { + return packagePath + "model" + separator + "original" + separator + className + ".java"; + } +// if(template.contains("EntityExample.java.vm")) {//modelExample.java +// return packagePath+"model" +separator+ "auto" + separator + className + "Example.java"; +// } + + //daomapper.java + if (template.contains("EntityMapper.java.vm")) { + return packagePath + "Mapper" + separator + "original" + separator+ className + "Mapper.java"; + } + + //daomapper.xml + if (template.contains("EntityMapper.xml.vm")) { + return resourcesPath + "mybatis" + separator + "auto" + separator+ className + "Mapper.xml"; + } + + if (template.contains("EntityService.java.vm")) { + return packagePath + "Service" + separator + "original" + separator+ "" + className + "Service.java"; + } + + if (template.contains("EntityServiceImpl.java.vm")) { + return packagePath + "Service" + separator + "impl" + separator + className + "ServiceImpl.java"; + } + + if (template.contains("EntityController.java.vm")) { + return packagePath + "Controller" + separator + "original" + separator+ className + "Controller.java"; + } + + if (template.contains("generator.html.vm")) { + return resourcesPath + "templates" + separator + "admin" + separator + firstLowerCase(className) + separator + "generator.html"; + } + + if (template.contains("add.html.vm")) { + return resourcesPath + "templates" + separator + "admin" + separator + firstLowerCase(className) + separator + "add.html"; + } + + if (template.contains("edit.html.vm")) { + return resourcesPath + "templates" + separator + "admin" + separator + firstLowerCase(className) + separator + "edit.html"; + } + + if (template.contains("menu.sql.vm")) { + return resourcesPath + "sql" + separator + "menu.sql"; + } + return ""; + } + + /** + * 列名转换成Java属性名 + * + * @param columnName + * @return + */ +// public String columnToJava(String columnName) { +// return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_" , ""); +// } + + /** + * 表名转换成Java类名 + * + * @param tableName + * @return + */ + public String tableToJava(String tableName) { + String tablePrefix = Objects.requireNonNull(GenUtils.getConfig().getString("tablePrefix")); + if (StringUtils.isNotBlank(tablePrefix)) { + tableName = tableName.replaceFirst(tablePrefix, ""); + } + return columnToJava(tableName); + } + + public static String firstLowerCase(String name) { + name = name.substring(0, 1).toLowerCase() + name.substring(1); + return name; + + } + + + /** + * 创建单表 + * + * @author fuce + * @Date 2019年8月24日 下午11:44:54 + */ + public static void autoCodeOneModel(TableInfo tableInfo, String tableName ,String tableComment) { + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class" , "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + Map map = new HashMap<>(); + //数据库表数据 + map.put("tableInfo" , tableInfo); + //字段集合 + map.put("beanColumns" , tableInfo.getBeanColumns()); + //配置文件 + map.put("SnowflakeIdWorker" , "SnowflakeIdWorker.class"); + //class类路径 + map.put("parentPack" , config.getString("package")); + //作者 + map.put("author" , config.getString("author")); + //时间 + map.put("datetime" , new DateTime()); + //sql需要的权限父级pid + map.put("pid" , "0"); + + VelocityContext context = new VelocityContext(map); + + //获取模板列表 + List templates = getTemplates(); + /* + * if(vhtml!=true) { templates.remove("auto_code/html/generator.html.vm"); + * templates.remove("auto_code/html/add.html.vm"); + * templates.remove("auto_code/html/edit.html.vm"); } if (vController!=true) { + * templates.remove("auto_code/controller/EntityController.java.vm"); } if + * (vService!=true) { + * templates.remove("auto_code/service/EntityService.java.vm"); } if + * (vMapperORdao!=true) { templates.remove("auto_code/model/Entity.java.vm"); + * templates.remove("auto_code/model/EntityExample.java.vm"); + * templates.remove("auto_code/mapperxml/EntityMapper.xml.vm"); + * templates.remove("auto_code/mapper/EntityMapper.java.vm"); } + */ + for (String template : templates) { + try { + String targetPath = config.getString("parentPath"); + String filepath = getCoverFileName(template, tableInfo.getJavaTableName(), config.getString("package"), targetPath); + // 读取模板 + Template tpl = Velocity.getTemplate(template, "UTF-8"); + File file = new File(filepath); + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + + if (!file.exists()) { + file.createNewFile(); + } + try (FileOutputStream outStream = new FileOutputStream(file); + OutputStreamWriter writer = new OutputStreamWriter(outStream, "UTF-8"); + BufferedWriter sw = new BufferedWriter(writer)) { + tpl.merge(context, sw);//进行模板渲染 + sw.flush(); + System.out.println("成功生成Java文件:" + filepath); + } + } catch (IOException e) { + try { + throw new Exception("渲染模板失败,表名:" + "c" + "\n" + e.getMessage()); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + } + + + + /** + * 自动生成压缩文件方法 + * + * @param tableInfo + * @param zip + * @author fuce + * @Date 2021年1月17日 下午7:37:50 + */ + public static void autoCodeOneModel(TableInfo tableInfo, String tableName ,String tableComment, ZipOutputStream zip) { + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class" , "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + Map map = new HashMap<>(); + //数据库表数据 + map.put("tableInfo" , tableInfo); + //字段集合 + map.put("beanColumns" , tableInfo.getBeanColumns()); + //配置文件 + map.put("SnowflakeIdWorker" , "SnowflakeIdWorker.class"); + //class类路径 + map.put("parentPack" , config.getString("package")); + //作者 + map.put("author" , config.getString("author")); + //时间 + map.put("datetime" , new DateTime()); + //sql需要的权限父级pid + map.put("pid" , "0"); + VelocityContext velocityContext = new VelocityContext(map); + //获取模板列表 + List templates = getTemplates(); + for (String template : templates) { + try { + String filepath = getCoverFileName(template, tableInfo.getJavaTableName(), config.getString("package"), ""); + Template tpl = Velocity.getTemplate(template, "UTF-8"); + StringWriter sw = new StringWriter(); + tpl.merge(velocityContext, sw); + zip.putNextEntry(new ZipEntry(filepath)); + IOUtils.write(sw.toString(), zip, "UTF-8"); + IOUtils.closeQuietly(sw); + zip.closeEntry(); + } catch (IOException e) { + try { + throw new Exception("渲染模板失败,表名:" + "c" + "\n" + e.getMessage()); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + } + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/META-INF/spring.factories.bk b/jun_api_online/jun_generator/src/main/resources/META-INF/spring.factories.bk new file mode 100644 index 000000000..679bab61f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/META-INF/spring.factories.bk @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +#com.jun.plugin.generator.config.DevtoolsAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/config.properties b/jun_api_online/jun_generator/src/main/resources/config.properties new file mode 100644 index 000000000..6a9fff246 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/config.properties @@ -0,0 +1,38 @@ +################################################# step1 for modify datasource +jdbc.url=jdbc:mysql://localhost:3306/db_test666?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC&useInformationSchema=true +jdbc.username=root +jdbc.password= +jdbc.driver=com.mysql.cj.jdbc.Driver +#mysql 5.7 com.mysql.jdbc.Driver ,mysql 8.0 com.mysql.cj.jdbc.Driver + +################################################# step2 for modify author package project_path +authorName=Wujun +packageName=com.bjc.byk.test +project_path=D:/workspace/github/jun_api_service/jun_api_service_online/plugins/generator +#className=${className}Controller.subfix.ftl +#jsp namespace: web/${namespace}/${className}/list.jsp +template_path=src/main/resources/templates +javaPath=src/main/java +resourcesPath=src/main/resources +tableRemovePrefixes=T_AR,T_BD,T_CD,T_PD,T_CL,T_IP,T_LO,T_RI,T_EV,T_, +rowRemovePrefixes=S_,B_,I_,DT_,TS_,M_,F_,PK_I_N,PK_I_S + +################################################# +isLombok=true +isAutoImport=true +isWithPackage=true +isSwagger=true +isComment=true + +################################################# + +java.sql.Timestamp=Date +java.sql.Date=Date +java.sql.Time=Date +java.util.Date=Date +java.lang.Byte=Integer +java.lang.Short=Integer +java.lang.Integer=Integer +java.lang.Long=Long +java.lang.String=String +java.math.BigDecimal=java.math.BigDecimal \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/generator.properties b/jun_api_online/jun_generator/src/main/resources/generator.properties new file mode 100644 index 000000000..216aab525 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/generator.properties @@ -0,0 +1,64 @@ +#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F + +mainPath=com.jun.plugin +parentPack=com.jun.plugin +#\u5305\u540D +package=com.jun.plugin.bizservice +#\u4F5C\u8005 +author=wujun +#Email +email=wujun728@mail.com +#\u8868\u524D\u7F00 +tablePrefix= +parentPath= +#parentPath=D:\\CodeGenerator + +#\u7C7B\u578B\u8F6C\u6362\uFF0C\u914D\u7F6E\u4FE1\u606F +tinyint=Integer +smallint=Integer +mediumint=Integer +int=Integer +integer=Integer +bigint=Long +float=Float +double=Double +decimal=BigDecimal +bit=Boolean + +char=String +varchar=String +tinytext=String +text=String +mediumtext=String +longtext=String + +date=Date +datetime=Date +timestamp=Date + +NUMBER=Integer +INT=Integer +INTEGER=Integer +BINARY_INTEGER=Integer +LONG=String +FLOAT=Float +BINARY_FLOAT=Float +DOUBLE=Double +BINARY_DOUBLE=Double +DECIMAL=BigDecimal +CHAR=String +VARCHAR=String +VARCHAR2=String +NVARCHAR=String +NVARCHAR2=String +CLOB=String +BLOB=String +DATE=Date +DATETIME=Date +TIMESTAMP=Date +TIMESTAMP(6)=Date + +int8=Long +int4=Integer +int2=Integer +numeric=BigDecimal \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlcontroller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlcontroller.ftl new file mode 100644 index 000000000..65be7585a --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlcontroller.ftl @@ -0,0 +1,75 @@ +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; +import java.util.Map; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Autowired + private SQLManager sqlManager; + + /** + * 新增或编辑 + */ + @PostMapping("/save") + public Object save(${classInfo.className} ${classInfo.className?uncap_first}){ + ${classInfo.className} ${classInfo.className?uncap_first}=sqlManager.unique(${classInfo.className}.class,${classInfo.className?uncap_first}.getId()); + if(${classInfo.className?uncap_first}!=null){ + sqlManager.updateById(${classInfo.className?uncap_first}); + return ${returnUtilSuccess}("编辑成功"); + }else{ + sqlManager.insert(${classInfo.className?uncap_first}); + return ${returnUtilFailure}("保存成功"); + } + } + + /** + * 删除 + */ + @PostMapping("/delete") + public Object delete(int id){ + ${classInfo.className} ${classInfo.className?uncap_first}=sqlManager.unique(${classInfo.className}.class,id); + if(${classInfo.className?uncap_first}!=null){ + sqlManager.deleteById(id); + return ${returnUtilSuccess}("删除成功"); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 查询 + */ + @PostMapping("/find") + public Object find(int id){ + ${classInfo.className} ${classInfo.className?uncap_first}=sqlManager.unique(${classInfo.className}.class,id); + if(${classInfo.className?uncap_first}!=null){ + return ${returnUtilSuccess}(${classInfo.className?uncap_first}); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 分页查询 + */ + @PostMapping("/list") + public Object list(${classInfo.className} ${classInfo.className?uncap_first}, + @RequestParam(required = false, defaultValue = "0") int pageNumber, + @RequestParam(required = false, defaultValue = "10") int pageSize) { + List<${classInfo.className}> list = sqlManager.query(${classInfo.className}.class).select(); + return ${returnUtilSuccess}(list); + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlentity.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlentity.ftl new file mode 100644 index 000000000..de7e7609e --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlentity.ftl @@ -0,0 +1,31 @@ +<#if isAutoImport?exists && isAutoImport==true> +import java.io.Serializable; +import lombok.Data; +import java.util.Date; +import java.util.List; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className} implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + + + public ${classInfo.className}() { + } + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlmd.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlmd.ftl new file mode 100644 index 000000000..2dcdb64ac --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/beetlsql/beetlmd.ftl @@ -0,0 +1,31 @@ +sample +=== + +select #use("cols")# from ${classInfo.tableName} where #use("condition")# + +cols +=== +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + `${fieldItem.columnName}`<#if fieldItem_has_next>, + + + +updateSample +=== +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + `${fieldItem.columnName}=#${fieldItem.fieldName}#`<#if fieldItem_has_next>, + + + +condition +=== + 1 = 1 +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + @if(!isEmpty(${fieldItem.fieldName})){ + and `${fieldItem.columnName}`=#${fieldItem.fieldName}# + @} + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common-mapper/tkentity.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common-mapper/tkentity.ftl new file mode 100644 index 000000000..742dcb271 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common-mapper/tkentity.ftl @@ -0,0 +1,50 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import javax.persistence.*; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data +<#if isComment?exists && isComment==true>@Table(name="${classInfo.originTableName}")<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className} implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if isComment?exists && isComment==true>@Column(name="${fieldItem.columnName}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + + + public ${classInfo.className}() { + } + + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common-mapper/tkmapper.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common-mapper/tkmapper.ftl new file mode 100644 index 000000000..3fdb96059 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common-mapper/tkmapper.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import tk.mybatis.mapper.common.Mapper; +import org.apache.ibatis.annotations.Mapper; +import ${packageName}.entity.${classInfo.className}; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +public interface ${classInfo.className}Mapper extends Mapper<${classInfo.className}> { + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/controller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/controller.ftl new file mode 100644 index 000000000..0b928a89f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/controller.ftl @@ -0,0 +1,73 @@ +package ${packageController}; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import ${packageModel}.${classInfo.className}; +import ${packageService}.${classInfo.className}Service; +import com.jun.plugin.codegenerator.admin.model.ReturnT; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@Controller +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + /** + * 新增 + */ + @RequestMapping("/insert") + @ResponseBody + public ReturnT insert(${classInfo.className} ${classInfo.className?uncap_first}){ + return ${classInfo.className?uncap_first}Service.insert(${classInfo.className?uncap_first}); + } + + /** + * 删除 + */ + @RequestMapping("/delete") + @ResponseBody + public ReturnT delete(int id){ + return ${classInfo.className?uncap_first}Service.delete(id); + } + + /** + * 更新 + */ + @RequestMapping("/update") + @ResponseBody + public ReturnT update(${classInfo.className} ${classInfo.className?uncap_first}){ + return ${classInfo.className?uncap_first}Service.update(${classInfo.className?uncap_first}); + } + + /** + * Load查询 + */ + @RequestMapping("/load") + @ResponseBody + public ${classInfo.className} load(int id){ + return ${classInfo.className?uncap_first}Service.load(id); + } + + /** + * 分页查询 + */ + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(@RequestParam(required = false, defaultValue = "0") int offset, + @RequestParam(required = false, defaultValue = "10") int pagesize) { + return ${classInfo.className?uncap_first}Service.pageList(offset, pagesize); + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/dao.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/dao.ftl new file mode 100644 index 000000000..6ed153d42 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/dao.ftl @@ -0,0 +1,49 @@ +package ${packageDao}; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; +import ${packageModel}.${classInfo.className}; + +import java.util.List; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@Component +public interface ${classInfo.className}Dao { + + /** + * 新增 + */ + public int insert(@Param("${classInfo.className?uncap_first}") ${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 删除 + */ + public int delete(@Param("id") int id); + + /** + * 更新 + */ + public int update(@Param("${classInfo.className?uncap_first}") ${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * Load查询 + */ + public ${classInfo.className} load(@Param("id") int id); + + /** + * 分页查询Data + */ + public List<${classInfo.className}> pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize); + + /** + * 分页查询Count + */ + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/model.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/model.ftl new file mode 100644 index 000000000..7a28cc64a --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/model.ftl @@ -0,0 +1,45 @@ +package ${packageModel}; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.fieldClass == "Date"> + <#assign importDdate = true /> + + + +import java.io.Serializable; +<#if importDdate?? && importDdate> +import java.util.Date; + + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +public class ${classInfo.className} implements Serializable { + private static final long serialVersionUID = 42L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + /** + * ${fieldItem.fieldComment} + */ + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + + + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/mybatis.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/mybatis.ftl new file mode 100644 index 000000000..0e1a7560e --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/mybatis.ftl @@ -0,0 +1,82 @@ + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + `${fieldItem.columnName}`<#if fieldItem_has_next>, + + + + + + INSERT INTO ${classInfo.tableName} ( + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "Id" > + `${fieldItem.columnName}`<#if fieldItem_has_next>, + + + + ) + VALUES( + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "Id" > + <#if fieldItem.columnName="AddTime" || fieldItem.columnName="UpdateTime" > + NOW()<#if fieldItem_has_next>, + <#else> + ${r"#{"}${classInfo.className?uncap_first}.${fieldItem.fieldName}${r"}"}<#if fieldItem_has_next>, + + + + + ) + + + + DELETE FROM ${classInfo.tableName} + WHERE `id` = ${r"#{id}"} + + + + UPDATE ${classInfo.tableName} + SET + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "Id" && fieldItem.columnName != "AddTime" && fieldItem.columnName != "UpdateTime" > + ${fieldItem.columnName} = ${r"#{"}${classInfo.className?uncap_first}.${fieldItem.fieldName}${r"}"}, + + + UpdateTime = NOW() + WHERE `id` = ${r"#{"}${classInfo.className?uncap_first}.id${r"}"} + + + + + + + + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/service.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/service.ftl new file mode 100644 index 000000000..b3295ddab --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/service.ftl @@ -0,0 +1,39 @@ +package ${packageService}; +import java.util.Map; + +import ${packageModel}.${classInfo.className}; +import com.jun.plugin.codegenerator.admin.model.ReturnT; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +public interface ${classInfo.className}Service { + + /** + * 新增 + */ + public ReturnT insert(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 删除 + */ + public ReturnT delete(int id); + + /** + * 更新 + */ + public ReturnT update(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * Load查询 + */ + public ${classInfo.className} load(int id); + + /** + * 分页查询 + */ + public Map pageList(int offset, int pagesize); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/service_impl.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/service_impl.ftl new file mode 100644 index 000000000..44ca00df8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/common/service_impl.ftl @@ -0,0 +1,85 @@ +package ${packageServiceImpl}; + +import org.springframework.stereotype.Service; + +import com.jun.plugin.biz.dao.${classInfo.className}Dao; +import ${packageModel}.${classInfo.className}; +import ${packageService}.${classInfo.className}Service; +import com.jun.plugin.codegenerator.admin.model.ReturnT; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@Service +public class ${classInfo.className}ServiceImpl implements ${classInfo.className}Service { + + @Resource + private ${classInfo.className}Dao ${classInfo.className?uncap_first}Dao; + + /** + * 新增 + */ + @Override + public ReturnT insert(${classInfo.className} ${classInfo.className?uncap_first}) { + + // valid + if (${classInfo.className?uncap_first} == null) { + return new ReturnT(ReturnT.FAIL_CODE, "必要参数缺失"); + } + + ${classInfo.className?uncap_first}Dao.insert(${classInfo.className?uncap_first}); + return ReturnT.SUCCESS; + } + + /** + * 删除 + */ + @Override + public ReturnT delete(int id) { + int ret = ${classInfo.className?uncap_first}Dao.delete(id); + return ret>0?ReturnT.SUCCESS:ReturnT.FAIL; + } + + /** + * 更新 + */ + @Override + public ReturnT update(${classInfo.className} ${classInfo.className?uncap_first}) { + int ret = ${classInfo.className?uncap_first}Dao.update(${classInfo.className?uncap_first}); + return ret>0?ReturnT.SUCCESS:ReturnT.FAIL; + } + + /** + * Load查询 + */ + @Override + public ${classInfo.className} load(int id) { + return ${classInfo.className?uncap_first}Dao.load(id); + } + + /** + * 分页查询 + */ + @Override + public Map pageList(int offset, int pagesize) { + + List<${classInfo.className}> pageList = ${classInfo.className?uncap_first}Dao.pageList(offset, pagesize); + int totalCount = ${classInfo.className?uncap_first}Dao.pageListCount(offset, pagesize); + + // result + Map result = new HashMap(); + result.put("pageList", pageList); + result.put("totalCount", totalCount); + + return result; + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/controller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/controller.ftl new file mode 100644 index 000000000..0b928a89f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/controller.ftl @@ -0,0 +1,73 @@ +package ${packageController}; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import ${packageModel}.${classInfo.className}; +import ${packageService}.${classInfo.className}Service; +import com.jun.plugin.codegenerator.admin.model.ReturnT; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@Controller +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + /** + * 新增 + */ + @RequestMapping("/insert") + @ResponseBody + public ReturnT insert(${classInfo.className} ${classInfo.className?uncap_first}){ + return ${classInfo.className?uncap_first}Service.insert(${classInfo.className?uncap_first}); + } + + /** + * 删除 + */ + @RequestMapping("/delete") + @ResponseBody + public ReturnT delete(int id){ + return ${classInfo.className?uncap_first}Service.delete(id); + } + + /** + * 更新 + */ + @RequestMapping("/update") + @ResponseBody + public ReturnT update(${classInfo.className} ${classInfo.className?uncap_first}){ + return ${classInfo.className?uncap_first}Service.update(${classInfo.className?uncap_first}); + } + + /** + * Load查询 + */ + @RequestMapping("/load") + @ResponseBody + public ${classInfo.className} load(int id){ + return ${classInfo.className?uncap_first}Service.load(id); + } + + /** + * 分页查询 + */ + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(@RequestParam(required = false, defaultValue = "0") int offset, + @RequestParam(required = false, defaultValue = "10") int pagesize) { + return ${classInfo.className?uncap_first}Service.pageList(offset, pagesize); + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/dao.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/dao.ftl new file mode 100644 index 000000000..6ed153d42 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/dao.ftl @@ -0,0 +1,49 @@ +package ${packageDao}; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; +import ${packageModel}.${classInfo.className}; + +import java.util.List; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@Component +public interface ${classInfo.className}Dao { + + /** + * 新增 + */ + public int insert(@Param("${classInfo.className?uncap_first}") ${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 删除 + */ + public int delete(@Param("id") int id); + + /** + * 更新 + */ + public int update(@Param("${classInfo.className?uncap_first}") ${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * Load查询 + */ + public ${classInfo.className} load(@Param("id") int id); + + /** + * 分页查询Data + */ + public List<${classInfo.className}> pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize); + + /** + * 分页查询Count + */ + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jdbc-template/jtdao.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jdbc-template/jtdao.ftl new file mode 100644 index 000000000..681518fb1 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jdbc-template/jtdao.ftl @@ -0,0 +1,21 @@ +<#if isAutoImport?exists && isAutoImport==true> +import java.util.List; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface I${classInfo.className}DAO { + + int add(${classInfo.className} ${classInfo.className?uncap_first}); + + int update(${classInfo.className} ${classInfo.className?uncap_first}); + + int delete(int id); + + ${classInfo.className} findById(int id); + + List<${classInfo.className}> findAllList(Map param); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jdbc-template/jtdaoimpl.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jdbc-template/jtdaoimpl.ftl new file mode 100644 index 000000000..f3e93889e --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jdbc-template/jtdaoimpl.ftl @@ -0,0 +1,61 @@ +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import java.util.List; + + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Repository +public class ${classInfo.className}DaoImpl implements I${classInfo.className}Dao{ + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Override + public int add(${classInfo.className} ${classInfo.className?uncap_first}) { + return jdbcTemplate.update("insert into ${classInfo.tableName} (<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0><#list classInfo.fieldList as fieldItem >${fieldItem.columnName}<#if fieldItem_has_next>, ) values (<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0><#list classInfo.fieldList as fieldItem >?<#if fieldItem_has_next>, )", + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0><#list classInfo.fieldList as fieldItem >${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()<#if fieldItem_has_next>,); + } + + @Override + public int update(${classInfo.className} ${classInfo.className?uncap_first}) { + return jdbcTemplate.update("UPDATE ${classInfo.tableName} SET <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0><#list classInfo.fieldList as fieldItem ><#if fieldItem_index gt 0 >${fieldItem.columnName}=?<#if fieldItem_has_next>," + +" where <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0><#list classInfo.fieldList as fieldItem ><#if fieldItem_index = 0>${fieldItem.columnName}=?<#break >", + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem ><#if fieldItem_index gt 0 >${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}(), + <#list classInfo.fieldList as fieldItem ><#if fieldItem_index = 0 >${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}() + ); + } + + @Override + public int delete(int id) { + return jdbcTemplate.update("DELETE from ${classInfo.tableName} where <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0><#list classInfo.fieldList as fieldItem ><#if fieldItem_index = 0>${fieldItem.columnName}=?<#break >",id); + } + + @Override + public ${classInfo.className} findById(int id) { + List<${classInfo.className}> list = jdbcTemplate.query("select * from ${classInfo.tableName} where <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0><#list classInfo.fieldList as fieldItem ><#if fieldItem_index = 0>${fieldItem.columnName}=?<#break >", new Object[]{id}, new BeanPropertyRowMapper<${classInfo.className}>(${classInfo.className}.class)); + if(list!=null && !list.isEmpty() ){ + return list.get(0); + }else{ + return null; + } + } + + @Override + public List<${classInfo.className}> findAllList(Map params) { + List<${classInfo.className}> list = jdbcTemplate.query("select * from ${classInfo.tableName}", new Object[]{}, new BeanPropertyRowMapper<${classInfo.className}>(${classInfo.className}.class)); + if(list!=null && !list.isEmpty() ){ + return list; + }else{ + return Collections.emptyList(); + } + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/controller.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/controller.java.ftl new file mode 100644 index 000000000..225c35839 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/controller.java.ftl @@ -0,0 +1,165 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import ${packageName}.vo.${classInfo.className}Vo; +import ${packageName}.dto.${classInfo.className}Dto; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +//import com.bjc.lcp.common.cnt.enums.CntTableNameEnum; +//import com.bjc.lcp.common.cnt.service.CntService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.BeanUtils; +import org.springframework.util.ObjectUtils; +<#--import org.apache.shiro.authz.annotation.RequiresPermissions;--> +import org.springframework.web.servlet.ModelAndView; +import com.jun.plugin.common.Result; +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* @Version666 +* @description ${classInfo.classComment} +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Api(tags = "${classInfo.classComment}-管理") +@Slf4j +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + @ApiOperation(value = "${classInfo.classComment}-新增") + @PostMapping("/add") + //@RequiresPermissions("${classInfo.className?uncap_first}:add") + public Result add(@Validated(${classInfo.className}Vo.Create.class) @RequestBody ${classInfo.className}Vo vo) throws Exception { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.nullable==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + ${classInfo.className}Entity entity = new ${classInfo.className}Entity(); + BeanUtils.copyProperties(dto, entity); + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(entity); + if (list.size() > 0) { + return Result.fail("数据已存在"); + } + return Result.success(${classInfo.className?uncap_first}Service.save(entity)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/remove") + //@RequiresPermissions("${classInfo.className?uncap_first}:remove") + public Result delete(@Validated(${classInfo.className}Vo.Delete.class) @RequestBody ${classInfo.className}Vo vo) throws Exception { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + return Result.success(${classInfo.className?uncap_first}Service.deleteById(dto.getId())); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + ids.stream().forEach(item->{ + try { + ${classInfo.className?uncap_first}Service.deleteById(Long.valueOf(item)); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + return Result.success(); + } + + + @ApiOperation(value = "${classInfo.classComment}-更新") + @PutMapping("/update") + //@RequiresPermissions("${classInfo.className?uncap_first}:update") + public Result update(@Validated(${classInfo.className}Vo.Update.class) @RequestBody ${classInfo.className}Vo vo) throws Exception { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.findById(vo.getId()); + if (entity == null) { + return Result.fail("数据不存在"); + //entity = new AdminEntity(); + } + BeanUtils.copyProperties(dto, entity); + return Result.success(${classInfo.className?uncap_first}Service.update(entity)); + } + + + + @ApiOperation(value = "${classInfo.classComment}-查询单条") + @RequestMapping(value = "/getOne",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:getOne") + public Result getOne(@RequestBody ${classInfo.className}Vo vo) throws Exception { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.findById(dto.getId()); + return Result.success(entity); + } + + + @ApiOperation(value = "${classInfo.classComment}-查询列表分页数据") + @RequestMapping(value = "/listByPage",method = {RequestMethod.GET,RequestMethod.POST}) + public Result listByPage(@RequestBody ${classInfo.className}Vo vo) throws Exception { + ${classInfo.className}Entity entity = new ${classInfo.className}Entity(); + BeanUtils.copyProperties(vo, entity); + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(entity); + return Result.success(list); + } + + @ApiOperation(value = "${classInfo.classComment}-查询全部列表数据") + @RequestMapping(value = "/list",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:list") + public Result findListByPage(@RequestBody ${classInfo.className}Vo vo) throws Exception { + ${classInfo.className}Entity entity = new ${classInfo.className}Entity(); + BeanUtils.copyProperties(vo, entity); + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(entity); + return Result.success(list); + } + + +} + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/dao.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/dao.java.ftl new file mode 100644 index 000000000..ff02be668 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/dao.java.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; + +import ${packageName}.entity.${classInfo.className}Entity; + import com.jun.plugin.common.base.IDAO; + +/** + * @description ${classInfo.classComment}数据层 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface ${classInfo.className}Dao extends IDAO { + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/dto.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/dto.java.ftl new file mode 100644 index 000000000..2b435e593 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/dto.java.ftl @@ -0,0 +1,44 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.dto; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.jun.plugin.common.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Dto implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Dto() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/entity.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/entity.java.ftl new file mode 100644 index 000000000..b45cac811 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/entity.java.ftl @@ -0,0 +1,70 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +<#assign isSwagger=false /> +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiModel; +import com.bjc.base.entity.LongEntity; +import lombok.EqualsAndHashCode; +import javax.persistence.*; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +@EqualsAndHashCode(callSuper = false) +@Entity +@Table +@ApiModel(description = "${classInfo.classComment}") +public class ${classInfo.className}Entity extends LongEntity implements Serializable { + + private static final long serialVersionUID = 3724658580544666556L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */ + + <#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + + <#if fieldItem.isPrimaryKey==true> + <#--@TableId(value = "${fieldItem.columnName}" ,type = IdType.AUTO )--> + <#else> + @Column(nullable = false) + + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + + <#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + + @Override + public void beforeCreate() { + super.beforeCreate(); + } + + @Override + public void beforeUpdate() { + super.beforeUpdate(); + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/mapper.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/mapper.java.ftl new file mode 100644 index 000000000..c6e239c8b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/mapper.java.ftl @@ -0,0 +1,41 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ${packageName}.entity.${classInfo.className}Entity; +import java.util.List; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}Entity> { + + @Select( + "") + List<${classInfo.className}Entity> pageAll(${classInfo.className}Entity dto,int page,int limit); + + @Select("") + int countAll(${classInfo.className}Entity dto); + + @Select("SELECT count(1) from ${classInfo.tableName} ") + int countAll(); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/service.impl.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/service.impl.java.ftl new file mode 100644 index 000000000..2700183ab --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/service.impl.java.ftl @@ -0,0 +1,62 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service.impl; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +import java.util.List; + +/** + * @description ${classInfo.classComment}服务层实现 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Service +public class ${classInfo.className}ServiceImpl implements ${classInfo.className}Service { + + + @Override + public boolean save(${classInfo.className}Entity vo) throws Exception { + return false; + } + + @Override + public boolean update(${classInfo.className}Entity vo) throws Exception { + return false; + } + + @Override + public boolean delete(${classInfo.className}Entity vo) throws Exception { + return false; + } + + @Override + public boolean deleteById(Long id) throws Exception { + return false; + } + + @Override + public ${classInfo.className}Entity findById(Long id) throws Exception { + return null; + } + + @Override + public List<${classInfo.className}Entity> list(${classInfo.className}Entity vo) throws Exception { + return null; + } + + @Override + public List<${classInfo.className}Entity> page(${classInfo.className}Entity vo, int page, int size) throws Exception { + return null; + } + + @Override + public int count(${classInfo.className}Entity vo) throws Exception { + return 0; + } + +} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/service.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/service.java.ftl new file mode 100644 index 000000000..39a651d2b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/service.java.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; + +import ${packageName}.entity.${classInfo.className}Entity; + import com.jun.plugin.common.base.IDAO; + +/** + * @description ${classInfo.classComment}服务层 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface ${classInfo.className}Service extends IDAO { + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/vo.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/vo.java.ftl new file mode 100644 index 000000000..baec341e7 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa-byk/vo.java.ftl @@ -0,0 +1,62 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.vo; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import com.jun.plugin.common.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Vo implements Serializable { + + public interface Retrieve{} + public interface Delete {} + public interface Update {} + public interface Create {} + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */ + <#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + + <#if fieldItem.nullable==true> + @NotNull(message = "${fieldItem.fieldComment}不能为空", groups = {Create.class,Update.class,Delete.class}) + + <#if fieldItem.nullable==true> + @Size( max = ${fieldItem.columnSize?c},message = "${fieldItem.fieldComment}长度限制${fieldItem.columnSize?c}位") + + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Vo() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/entity.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/entity.ftl new file mode 100644 index 000000000..ceb1456dc --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/entity.ftl @@ -0,0 +1,55 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.GeneratedValue; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Entity +<#if isLombok?exists && isLombok==true>@Data +<#if isComment?exists && isComment==true>@Table(name="${classInfo.tableName}")<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className} implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if isComment?exists && isComment==true>@Column(name="${fieldItem.columnName}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + + + public ${classInfo.className}() { + } + + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/jpacontroller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/jpacontroller.ftl new file mode 100644 index 000000000..c6c98299b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/jpacontroller.ftl @@ -0,0 +1,83 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import ${packageName}.entity.${classInfo.className}; +import ${packageName}.repository.${classInfo.className}Repository; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Pageable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.data.domain.ExampleMatcher; +import org.springframework.data.domain.PageRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; +import java.util.Map; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Autowired + private ${classInfo.className}Repository ${classInfo.className?uncap_first}Repository; + + /** + * 新增或编辑 + */ + @PostMapping("/save") + public Object save(${classInfo.className} ${classInfo.className?uncap_first}){ + return ${classInfo.className?uncap_first}Repository.save(${classInfo.className?uncap_first}); + } + + /** + * 删除 + */ + @PostMapping("/delete") + public Object delete(int id){ + Optional<${classInfo.className}> ${classInfo.className?uncap_first}=${classInfo.className?uncap_first}Repository.findById(id); + if(${classInfo.className?uncap_first}.isPresent()){ + ${classInfo.className?uncap_first}Repository.deleteById(id); + return ${returnUtilSuccess}("删除成功"); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 查询 + */ + @PostMapping("/find") + public Object find(int id){ + Optional<${classInfo.className}> ${classInfo.className?uncap_first}=${classInfo.className?uncap_first}Repository.findById(id); + if(${classInfo.className?uncap_first}.isPresent()){ + return ${returnUtilSuccess}(${classInfo.className?uncap_first}.get()); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 分页查询 + */ + @PostMapping("/list") + public Object list(${classInfo.className} ${classInfo.className?uncap_first}, + @RequestParam(required = false, defaultValue = "0") int pageNumber, + @RequestParam(required = false, defaultValue = "10") int pageSize) { + + //创建匹配器,需要查询条件请修改此处代码 + ExampleMatcher matcher = ExampleMatcher.matchingAll(); + + //创建实例 + Example<${classInfo.className}> example = Example.of(${classInfo.className?uncap_first}, matcher); + //分页构造 + Pageable pageable = PageRequest.of(pageNumber,pageSize); + + return ${classInfo.className?uncap_first}Repository.findAll(example, pageable); + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/repository.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/repository.ftl new file mode 100644 index 000000000..c2a8affb8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/jpa/repository.ftl @@ -0,0 +1,26 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true>import ${packageName}.entity.${classInfo.className}; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.fieldClass == "Date"> + <#assign importDdate = true /> + + + +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Repository +public interface ${classInfo.className}Repository extends JpaRepository<${classInfo.className},Integer> { + + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/model.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/model.ftl new file mode 100644 index 000000000..7a28cc64a --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/model.ftl @@ -0,0 +1,45 @@ +package ${packageModel}; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.fieldClass == "Date"> + <#assign importDdate = true /> + + + +import java.io.Serializable; +<#if importDdate?? && importDdate> +import java.util.Date; + + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +public class ${classInfo.className} implements Serializable { + private static final long serialVersionUID = 42L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + /** + * ${fieldItem.fieldComment} + */ + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + + + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/controller.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/controller.java.ftl new file mode 100644 index 000000000..01824bed3 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/controller.java.ftl @@ -0,0 +1,230 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import ${packageName}.vo.${classInfo.className}Vo; +import ${packageName}.dto.${classInfo.className}Dto; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +//import com.bjc.lcp.common.cnt.enums.CntTableNameEnum; +//import com.bjc.lcp.common.cnt.service.CntService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.BeanUtils; +import org.springframework.util.ObjectUtils; +<#--import org.apache.shiro.authz.annotation.RequiresPermissions;--> +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.web.servlet.ModelAndView; +import com.jun.plugin.common.Result; +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* @description ${classInfo.classComment} +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Api(tags = "${classInfo.classComment}-管理") +@Slf4j +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + @Resource + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + + @ApiOperation(value = "${classInfo.classComment}-新增") + @PostMapping("/add") + //@RequiresPermissions("${classInfo.className?uncap_first}:add") + public Result add(@Validated(${classInfo.className}Vo.Create.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.nullable==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + if (list.size() > 0) { + return Result.fail("数据已存在"); + } + ${classInfo.className}Entity entity = new ${classInfo.className}Entity(); + + BeanUtils.copyProperties(dto, entity); + return Result.success(${classInfo.className?uncap_first}Service.save(entity)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/remove") + //@RequiresPermissions("${classInfo.className?uncap_first}:remove") + public Result delete(@Validated(${classInfo.className}Vo.Delete.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + return Result.success(${classInfo.className?uncap_first}Service.remove(queryWrapper)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/delete") + //@RequiresPermissions("${classInfo.className?uncap_first}:delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + return Result.success(${classInfo.className?uncap_first}Service.removeByIds(ids)); + } + + + @ApiOperation(value = "${classInfo.classComment}-更新") + @PutMapping("/update") + //@RequiresPermissions("${classInfo.className?uncap_first}:update") + public Result update(@Validated(${classInfo.className}Vo.Update.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + if (entity == null) { + //return Result.fail("数据不存在"); + entity = new ${classInfo.className}Entity(); + } + BeanUtils.copyProperties(dto, entity); + return Result.success(${classInfo.className?uncap_first}Service.saveOrUpdate(entity)); + } + + + + @ApiOperation(value = "${classInfo.classComment}-查询单条") + @RequestMapping(value = "/getOne",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:getOne") + public Result getOne(@RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + return Result.success(entity); + } + + + + + @ApiOperation(value = "${classInfo.classComment}-查询列表分页数据") + @RequestMapping(value = "/listByPage",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:listByPage") + public Result listByPage(@RequestBody ${classInfo.className}Vo ${classInfo.className?uncap_first}) { + Page page = new Page(${classInfo.className?uncap_first}.getPage(), ${classInfo.className?uncap_first}.getLimit()); + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(${classInfo.className?uncap_first}, dto); + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } + + + + IPage<${classInfo.className}Entity> iPage = ${classInfo.className?uncap_first}Service.page(page, queryWrapper); + return Result.success(iPage); + } + + @ApiOperation(value = "${classInfo.classComment}-查询全部列表数据") + @RequestMapping(value = "/list",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:list") + public Result findListByPage(@RequestBody ${classInfo.className}Vo ${classInfo.className?uncap_first}) { + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } + + + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + return Result.success(list); + } + + +} + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/dto.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/dto.java.ftl new file mode 100644 index 000000000..918648f83 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/dto.java.ftl @@ -0,0 +1,44 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.dto; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.jun.plugin.common.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Dto extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Dto() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/edit.html.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/edit.html.ftl new file mode 100644 index 000000000..6299a1b24 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/edit.html.ftl @@ -0,0 +1,64 @@ + + + +
+ + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > +
+ +
+ + <#--${fieldItem.fieldComment}--> +
+
+ + + +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/entity.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/entity.java.ftl new file mode 100644 index 000000000..612f07aa8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/entity.java.ftl @@ -0,0 +1,51 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.jun.plugin.common.entity.BaseEntity; +<#assign isSwagger=false /> +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +@TableName("${classInfo.tableName}") +public class ${classInfo.className}Entity extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.isPrimaryKey==true>@TableId(value = "${fieldItem.columnName}" ,type = IdType.AUTO )<#else>@TableField(value = "${fieldItem.columnName}" ) + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Entity() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.ftl new file mode 100644 index 000000000..d36251c32 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.ftl @@ -0,0 +1,266 @@ + + + + + + + XXXX管理 + + + + + + +
+
+
+ +
+
+ <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.nullable==false> +
+ +
+ +
+
+ + + + <#--
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
--> +
  + +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.v1.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.v1.ftl new file mode 100644 index 000000000..3fb144273 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.v1.ftl @@ -0,0 +1,234 @@ + + + + + + + XXX管理 + + + + +
+
+ +
+ 搜索信息 +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.vm.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.vm.ftl new file mode 100644 index 000000000..447a9cae3 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/list.html.vm.ftl @@ -0,0 +1,604 @@ + + + + + Title + + + + + + + + + + + +
+
+
+
+ 在此你可以对${comments}进行编辑!若有操作及使用问题及常见“问题”:请查看操作手册! +
+
+
+###遍历查询条件 +#foreach($column in $columns) +#if($column.columnName != $pk.columnName && $column.isNull == 'NO') +##跳过循环,新增及修改时间字段,注解支持,不展示 +#if($column.columnName.toString().contains("create") || $column.columnName.toString().contains("deleted") || $column.columnName.toString().contains("update")) + #break +#end +#if($column.dataType == 'datetime') +
+ +
+#else +
+ +
+#end +#end +#end +
+ + +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/mapper.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/mapper.java.ftl new file mode 100644 index 000000000..c6e239c8b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/mapper.java.ftl @@ -0,0 +1,41 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ${packageName}.entity.${classInfo.className}Entity; +import java.util.List; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}Entity> { + + @Select( + "") + List<${classInfo.className}Entity> pageAll(${classInfo.className}Entity dto,int page,int limit); + + @Select("") + int countAll(${classInfo.className}Entity dto); + + @Select("SELECT count(1) from ${classInfo.tableName} ") + int countAll(); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/menu.sql.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/menu.sql.ftl new file mode 100644 index 000000000..2b3193a3f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/menu.sql.ftl @@ -0,0 +1,17 @@ +-- 菜单SQL +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +VALUES ('1', '${classInfo.classComment}', 'generator/${classInfo.className?uncap_first}', NULL, '1', 'config', '6'); + +-- 按钮父菜单ID +set @parentId = @@identity; + +-- 菜单对应按钮SQL +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '查看', null, 'generator:${classInfo.className?uncap_first}:list,generator:${classInfo.className?uncap_first}:info', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '新增', null, 'generator:${classInfo.className?uncap_first}:save', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '修改', null, 'generator:${classInfo.className?uncap_first}:update', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '删除', null, 'generator:${classInfo.className?uncap_first}:delete', '2', null, '6'; + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/service.impl.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/service.impl.java.ftl new file mode 100644 index 000000000..6b3a91a11 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/service.impl.java.ftl @@ -0,0 +1,26 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service.impl; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.service.${classInfo.className}Service; + + +/** + * @description ${classInfo.classComment}服务层实现 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Service +public class ${classInfo.className}ServiceImpl extends ServiceImpl<${classInfo.className}Mapper, ${classInfo.className}Entity> implements ${classInfo.className}Service { + + @Autowired + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + +} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/service.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/service.java.ftl new file mode 100644 index 000000000..76483b1fe --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/service.java.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.IService; + +import ${packageName}.entity.${classInfo.className}Entity; + +/** + * @description ${classInfo.classComment}服务层 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface ${classInfo.className}Service extends IService<${classInfo.className}Entity> { + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/vo.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/vo.java.ftl new file mode 100644 index 000000000..77144a165 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single-v2/vo.java.ftl @@ -0,0 +1,56 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.vo; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import com.jun.plugin.common.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Vo extends BaseEntity implements Serializable { + + public interface Retrieve{} + public interface Delete {} + public interface Update {} + public interface Create {} + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.nullable==true>@NotNull(message = "${fieldItem.fieldComment}不能为空", groups = {Create.class,Update.class,Delete.class}) + <#if fieldItem.nullable==true>@Size( max = ${fieldItem.columnSize?c},message = "${fieldItem.fieldComment}长度限制${fieldItem.columnSize?c}位") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Vo() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/controller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/controller.ftl new file mode 100644 index 000000000..762410df5 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/controller.ftl @@ -0,0 +1,232 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import com.alibaba.fastjson.JSON; +import ${packageName}.vo.${classInfo.className}Vo; +import ${packageName}.dto.${classInfo.className}Dto; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +//import com.bjc.lcp.common.cnt.enums.CntTableNameEnum; +//import com.bjc.lcp.common.cnt.service.CntService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.BeanUtils; +import org.springframework.util.ObjectUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bjc.lcp.system.common.utils.DataResult; +import org.springframework.web.servlet.ModelAndView; +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* @description ${classInfo.classComment} +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Api(tags = "${classInfo.classComment}-管理") +@Slf4j +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + @Resource + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + + //@Autowired + //private CntService cntService; + + @ApiOperation(value = "${classInfo.classComment}-新增") + @PostMapping("/add") + @RequiresPermissions("${classInfo.className?uncap_first}:add") + public DataResult add(@Validated(${classInfo.className}Vo.Create.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.nullable==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + if (list.size() > 0) { + return DataResult.fail("数据已存在"); + } + ${classInfo.className}Entity entity = new ${classInfo.className}Entity(); + + BeanUtils.copyProperties(dto, entity); + return DataResult.success(${classInfo.className?uncap_first}Service.save(entity)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/remove") + @RequiresPermissions("${classInfo.className?uncap_first}:remove") + public DataResult delete(@Validated(${classInfo.className}Vo.Delete.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + return DataResult.success(${classInfo.className?uncap_first}Service.remove(queryWrapper)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/delete") + @RequiresPermissions("${classInfo.className?uncap_first}:delete") + public DataResult delete(@RequestBody @ApiParam(value = "id集合") List ids) { + return DataResult.success(${classInfo.className?uncap_first}Service.removeByIds(ids)); + } + + + @ApiOperation(value = "${classInfo.classComment}-更新") + @PutMapping("/update") + @RequiresPermissions("${classInfo.className?uncap_first}:update") + public DataResult update(@Validated(${classInfo.className}Vo.Update.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + if (entity == null) { + return DataResult.fail("数据不存在"); + } + BeanUtils.copyProperties(dto, entity); + return DataResult.success(${classInfo.className?uncap_first}Service.updateById(entity)); + } + + + + @ApiOperation(value = "${classInfo.classComment}-查询单条") + @RequestMapping(value = "/getOne",method = {RequestMethod.GET,RequestMethod.POST}) + @RequiresPermissions("${classInfo.className?uncap_first}:getOne") + public DataResult getOne(@RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + return DataResult.success(entity); + } + + + + + @ApiOperation(value = "${classInfo.classComment}-查询列表分页数据") + @RequestMapping(value = "/listByPage",method = {RequestMethod.GET,RequestMethod.POST}) + @RequiresPermissions("${classInfo.className?uncap_first}:listByPage") + public DataResult listByPage(@RequestBody ${classInfo.className}Vo ${classInfo.className?uncap_first}) { + Page page = new Page(${classInfo.className?uncap_first}.getPage(), ${classInfo.className?uncap_first}.getLimit()); + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(${classInfo.className?uncap_first}, dto); + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } + + + + IPage<${classInfo.className}Entity> iPage = ${classInfo.className?uncap_first}Service.page(page, queryWrapper); + return DataResult.success(iPage); + } + + @ApiOperation(value = "${classInfo.classComment}-查询全部列表数据") + @RequestMapping(value = "/list",method = {RequestMethod.GET,RequestMethod.POST}) + @RequiresPermissions("${classInfo.className?uncap_first}:list") + public DataResult findListByPage(@RequestBody ${classInfo.className}Vo ${classInfo.className?uncap_first}) { + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } + + + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + return DataResult.success(list); + } + + +} + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/controller.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/controller.java.ftl new file mode 100644 index 000000000..44946cb7d --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/controller.java.ftl @@ -0,0 +1,235 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import ${packageName}.vo.${classInfo.className}Vo; +import ${packageName}.dto.${classInfo.className}Dto; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +//import com.bjc.lcp.common.cnt.enums.CntTableNameEnum; +//import com.bjc.lcp.common.cnt.service.CntService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.BeanUtils; +import org.springframework.util.ObjectUtils; +<#--import org.apache.shiro.authz.annotation.RequiresPermissions;--> +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.web.servlet.ModelAndView; +import com.jun.plugin.common.Result; +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* @Version666 +* @description ${classInfo.classComment} +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Api(tags = "${classInfo.classComment}-管理") +@Slf4j +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + @Resource + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + + @ApiOperation(value = "${classInfo.classComment}-新增") + @PostMapping("/add") + //@RequiresPermissions("${classInfo.className?uncap_first}:add") + public Result add(@Validated(${classInfo.className}Vo.Create.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.nullable==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + if (list.size() > 0) { + return Result.fail("数据已存在"); + } + ${classInfo.className}Entity entity = new ${classInfo.className}Entity(); + + BeanUtils.copyProperties(dto, entity); + return Result.success(${classInfo.className?uncap_first}Service.save(entity)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/remove") + //@RequiresPermissions("${classInfo.className?uncap_first}:remove") + public Result delete(@Validated(${classInfo.className}Vo.Delete.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + return Result.success(${classInfo.className?uncap_first}Service.remove(queryWrapper)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/delete") + //@RequiresPermissions("${classInfo.className?uncap_first}:delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + return Result.success(${classInfo.className?uncap_first}Service.removeByIds(ids)); + } + + + @ApiOperation(value = "${classInfo.classComment}-更新") + @PutMapping("/update") + //@RequiresPermissions("${classInfo.className?uncap_first}:update") + public Result update(@Validated(${classInfo.className}Vo.Update.class) @RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + if (entity == null) { + //return Result.fail("数据不存在"); + entity = new ${classInfo.className}Entity(); + } + BeanUtils.copyProperties(dto, entity); + return Result.success(${classInfo.className?uncap_first}Service.saveOrUpdate(entity)); + } + + + + @ApiOperation(value = "${classInfo.classComment}-查询单条") + @RequestMapping(value = "/getOne",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:getOne") + public Result getOne(@RequestBody ${classInfo.className}Vo vo) { + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return Result.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + return Result.success(entity); + } + + + + + @ApiOperation(value = "${classInfo.classComment}-查询列表分页数据") + @RequestMapping(value = "/listByPage",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:listByPage") + public Result listByPage(@RequestBody(required = false) ${classInfo.className}Vo ${classInfo.className?uncap_first}) { + Page page = new Page(${classInfo.className?uncap_first}.getPage(), ${classInfo.className?uncap_first}.getLimit()); + ${classInfo.className}Dto dto = new ${classInfo.className}Dto(); + BeanUtils.copyProperties(${classInfo.className?uncap_first}, dto); + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + if(!ObjectUtils.isEmpty(${classInfo.className?uncap_first})){ +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } + + + } + + IPage<${classInfo.className}Entity> iPage = ${classInfo.className?uncap_first}Service.page(page, queryWrapper); + return Result.success(iPage); + } + + @ApiOperation(value = "${classInfo.classComment}-查询全部列表数据") + @RequestMapping(value = "/list",method = {RequestMethod.GET,RequestMethod.POST}) + //@RequiresPermissions("${classInfo.className?uncap_first}:list") + public Result findListByPage(@RequestBody(required = false) ${classInfo.className}Vo ${classInfo.className?uncap_first}) { + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + if(!ObjectUtils.isEmpty(${classInfo.className?uncap_first})){ +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } + + + } + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + return Result.success(list); + } + + +} + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/dto.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/dto.ftl new file mode 100644 index 000000000..7b017013d --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/dto.ftl @@ -0,0 +1,44 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.dto; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.bjc.lcp.system.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Dto extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Dto() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/dto.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/dto.java.ftl new file mode 100644 index 000000000..918648f83 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/dto.java.ftl @@ -0,0 +1,44 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.dto; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.jun.plugin.common.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Dto extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Dto() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/edit.html.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/edit.html.ftl new file mode 100644 index 000000000..6299a1b24 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/edit.html.ftl @@ -0,0 +1,64 @@ + + + +
+ + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > +
+ +
+ + <#--${fieldItem.fieldComment}--> +
+
+ + + +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/entity.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/entity.ftl new file mode 100644 index 000000000..1b0bd65ff --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/entity.ftl @@ -0,0 +1,51 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.bjc.lcp.system.entity.BaseEntity; +<#assign isSwagger=false /> +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +@TableName("${classInfo.tableName}") +public class ${classInfo.className}Entity extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.isPrimaryKey==true>@TableId(value = "${fieldItem.columnName}" ,type = IdType.AUTO )<#else>@TableField(value = "${fieldItem.columnName}" ) + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Entity() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/entity.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/entity.java.ftl new file mode 100644 index 000000000..612f07aa8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/entity.java.ftl @@ -0,0 +1,51 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.jun.plugin.common.entity.BaseEntity; +<#assign isSwagger=false /> +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +@TableName("${classInfo.tableName}") +public class ${classInfo.className}Entity extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.isPrimaryKey==true>@TableId(value = "${fieldItem.columnName}" ,type = IdType.AUTO )<#else>@TableField(value = "${fieldItem.columnName}" ) + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Entity() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.ftl new file mode 100644 index 000000000..d36251c32 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.ftl @@ -0,0 +1,266 @@ + + + + + + + XXXX管理 + + + + + + +
+
+
+ +
+
+ <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.nullable==false> +
+ +
+ +
+
+ + + + <#--
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
--> +
  + +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.v1.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.v1.ftl new file mode 100644 index 000000000..3fb144273 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.v1.ftl @@ -0,0 +1,234 @@ + + + + + + + XXX管理 + + + + +
+
+ +
+ 搜索信息 +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.vm.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.vm.ftl new file mode 100644 index 000000000..447a9cae3 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/list.html.vm.ftl @@ -0,0 +1,604 @@ + + + + + Title + + + + + + + + + + + +
+
+
+
+ 在此你可以对${comments}进行编辑!若有操作及使用问题及常见“问题”:请查看操作手册! +
+
+
+###遍历查询条件 +#foreach($column in $columns) +#if($column.columnName != $pk.columnName && $column.isNull == 'NO') +##跳过循环,新增及修改时间字段,注解支持,不展示 +#if($column.columnName.toString().contains("create") || $column.columnName.toString().contains("deleted") || $column.columnName.toString().contains("update")) + #break +#end +#if($column.dataType == 'datetime') +
+ +
+#else +
+ +
+#end +#end +#end +
+ + +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/mapper.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/mapper.ftl new file mode 100644 index 000000000..c6e239c8b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/mapper.ftl @@ -0,0 +1,41 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ${packageName}.entity.${classInfo.className}Entity; +import java.util.List; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}Entity> { + + @Select( + "") + List<${classInfo.className}Entity> pageAll(${classInfo.className}Entity dto,int page,int limit); + + @Select("") + int countAll(${classInfo.className}Entity dto); + + @Select("SELECT count(1) from ${classInfo.tableName} ") + int countAll(); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/mapper.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/mapper.java.ftl new file mode 100644 index 000000000..c6e239c8b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/mapper.java.ftl @@ -0,0 +1,41 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ${packageName}.entity.${classInfo.className}Entity; +import java.util.List; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}Entity> { + + @Select( + "") + List<${classInfo.className}Entity> pageAll(${classInfo.className}Entity dto,int page,int limit); + + @Select("") + int countAll(${classInfo.className}Entity dto); + + @Select("SELECT count(1) from ${classInfo.tableName} ") + int countAll(); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/menu.sql.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/menu.sql.ftl new file mode 100644 index 000000000..2b3193a3f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/menu.sql.ftl @@ -0,0 +1,17 @@ +-- 菜单SQL +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +VALUES ('1', '${classInfo.classComment}', 'generator/${classInfo.className?uncap_first}', NULL, '1', 'config', '6'); + +-- 按钮父菜单ID +set @parentId = @@identity; + +-- 菜单对应按钮SQL +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '查看', null, 'generator:${classInfo.className?uncap_first}:list,generator:${classInfo.className?uncap_first}:info', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '新增', null, 'generator:${classInfo.className?uncap_first}:save', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '修改', null, 'generator:${classInfo.className?uncap_first}:update', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '删除', null, 'generator:${classInfo.className?uncap_first}:delete', '2', null, '6'; + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.ftl new file mode 100644 index 000000000..76483b1fe --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.IService; + +import ${packageName}.entity.${classInfo.className}Entity; + +/** + * @description ${classInfo.classComment}服务层 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface ${classInfo.className}Service extends IService<${classInfo.className}Entity> { + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.impl.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.impl.ftl new file mode 100644 index 000000000..6b3a91a11 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.impl.ftl @@ -0,0 +1,26 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service.impl; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.service.${classInfo.className}Service; + + +/** + * @description ${classInfo.classComment}服务层实现 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Service +public class ${classInfo.className}ServiceImpl extends ServiceImpl<${classInfo.className}Mapper, ${classInfo.className}Entity> implements ${classInfo.className}Service { + + @Autowired + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + +} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.impl.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.impl.java.ftl new file mode 100644 index 000000000..6b3a91a11 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.impl.java.ftl @@ -0,0 +1,26 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service.impl; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.service.${classInfo.className}Service; + + +/** + * @description ${classInfo.classComment}服务层实现 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Service +public class ${classInfo.className}ServiceImpl extends ServiceImpl<${classInfo.className}Mapper, ${classInfo.className}Entity> implements ${classInfo.className}Service { + + @Autowired + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + +} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.java.ftl new file mode 100644 index 000000000..76483b1fe --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/service.java.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.IService; + +import ${packageName}.entity.${classInfo.className}Entity; + +/** + * @description ${classInfo.classComment}服务层 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface ${classInfo.className}Service extends IService<${classInfo.className}Entity> { + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/vo.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/vo.ftl new file mode 100644 index 000000000..37be5085f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/vo.ftl @@ -0,0 +1,56 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.vo; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import com.bjc.lcp.system.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Vo extends BaseEntity implements Serializable { + + public interface Retrieve{} + public interface Delete {} + public interface Update {} + public interface Create {} + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.nullable==true>@NotNull(message = "${fieldItem.fieldComment}不能为空", groups = {Create.class,Update.class,Delete.class}) + <#if fieldItem.nullable==true>@Size( max = ${fieldItem.columnSize},message = "${fieldItem.fieldComment}长度限制${fieldItem.columnSize}位") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Vo() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/vo.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/vo.java.ftl new file mode 100644 index 000000000..77144a165 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-single/vo.java.ftl @@ -0,0 +1,56 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.vo; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import com.jun.plugin.common.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}Vo extends BaseEntity implements Serializable { + + public interface Retrieve{} + public interface Delete {} + public interface Update {} + public interface Create {} + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.nullable==true>@NotNull(message = "${fieldItem.fieldComment}不能为空", groups = {Create.class,Update.class,Delete.class}) + <#if fieldItem.nullable==true>@Size( max = ${fieldItem.columnSize?c},message = "${fieldItem.fieldComment}长度限制${fieldItem.columnSize?c}位") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Vo() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-controller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-controller.ftl new file mode 100644 index 000000000..0039f4c8e --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-controller.ftl @@ -0,0 +1,232 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import com.alibaba.fastjson.JSON; +import ${packageName}.vo.${classInfo.className}VO; +import ${packageName}.dto.${classInfo.className}DTO; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +//import com.bjc.lcp.common.cnt.enums.CntTableNameEnum; +//import com.bjc.lcp.common.cnt.service.CntService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.BeanUtils; +import org.springframework.util.ObjectUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bjc.lcp.system.common.utils.DataResult; +import org.springframework.web.servlet.ModelAndView; +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* @description ${classInfo.classComment} +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Api(tags = "${classInfo.classComment}-管理") +@Slf4j +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + @Resource + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + + //@Autowired + //private CntService cntService; + + @ApiOperation(value = "${classInfo.classComment}-新增") + @PostMapping("/add") + @RequiresPermissions("${classInfo.className?uncap_first}:add") + public DataResult add(@Validated(${classInfo.className}VO.Create.class) @RequestBody ${classInfo.className}VO vo) { + ${classInfo.className}DTO dto = new ${classInfo.className}DTO(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.nullable==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + if (list.size() > 0) { + return DataResult.fail("数据已存在"); + } + ${classInfo.className}Entity entity = new ${classInfo.className}Entity(); + + BeanUtils.copyProperties(dto, entity); + return DataResult.success(${classInfo.className?uncap_first}Service.save(entity)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/remove") + @RequiresPermissions("${classInfo.className?uncap_first}:remove") + public DataResult delete(@Validated(${classInfo.className}VO.Delete.class) @RequestBody ${classInfo.className}VO vo) { + ${classInfo.className}DTO dto = new ${classInfo.className}DTO(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + return DataResult.success(${classInfo.className?uncap_first}Service.remove(queryWrapper)); + } + + @ApiOperation(value = "${classInfo.classComment}-删除") + @DeleteMapping("/delete") + @RequiresPermissions("${classInfo.className?uncap_first}:delete") + public DataResult delete(@RequestBody @ApiParam(value = "id集合") List ids) { + return DataResult.success(${classInfo.className?uncap_first}Service.removeByIds(ids)); + } + + + @ApiOperation(value = "${classInfo.classComment}-更新") + @PutMapping("/update") + @RequiresPermissions("${classInfo.className?uncap_first}:update") + public DataResult update(@Validated(${classInfo.className}VO.Update.class) @RequestBody ${classInfo.className}VO vo) { + ${classInfo.className}DTO dto = new ${classInfo.className}DTO(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + if (entity == null) { + return DataResult.fail("数据不存在"); + } + BeanUtils.copyProperties(dto, entity); + return DataResult.success(${classInfo.className?uncap_first}Service.updateById(entity)); + } + + + + @ApiOperation(value = "${classInfo.classComment}-查询单条") + @RequestMapping(value = "/getOne",method = {RequestMethod.GET,RequestMethod.POST}) + @RequiresPermissions("${classInfo.className?uncap_first}:getOne") + public DataResult getOne(@RequestBody ${classInfo.className}VO vo) { + ${classInfo.className}DTO dto = new ${classInfo.className}DTO(); + BeanUtils.copyProperties(vo, dto); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (ObjectUtils.isEmpty(dto.get${fieldItem.fieldName?cap_first}())) { + return DataResult.fail("参数[${fieldItem.fieldName}]不能为空"); + } + + + + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + + + + ${classInfo.className}Entity entity = ${classInfo.className?uncap_first}Service.getOne(queryWrapper);; + return DataResult.success(entity); + } + + + + + @ApiOperation(value = "${classInfo.classComment}-查询列表分页数据") + @RequestMapping(value = "/listByPage",method = {RequestMethod.GET,RequestMethod.POST}) + @RequiresPermissions("${classInfo.className?uncap_first}:listByPage") + public DataResult listByPage(@RequestBody ${classInfo.className}VO ${classInfo.className?uncap_first}) { + Page page = new Page(${classInfo.className?uncap_first}.getPage(), ${classInfo.className?uncap_first}.getLimit()); + ${classInfo.className}DTO dto = new ${classInfo.className}DTO(); + BeanUtils.copyProperties(${classInfo.className?uncap_first}, dto); + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, dto.get${fieldItem.fieldName?cap_first}()); + } + + + + IPage<${classInfo.className}Entity> iPage = ${classInfo.className?uncap_first}Service.page(page, queryWrapper); + return DataResult.success(iPage); + } + + @ApiOperation(value = "${classInfo.classComment}-查询全部列表数据") + @RequestMapping(value = "/list",method = {RequestMethod.GET,RequestMethod.POST}) + @RequiresPermissions("${classInfo.className?uncap_first}:list") + public DataResult findListByPage(@RequestBody ${classInfo.className}VO ${classInfo.className?uncap_first}) { + LambdaQueryWrapper<${classInfo.className}Entity> queryWrapper = Wrappers.lambdaQuery(); +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > +<#if fieldItem.isPrimaryKey==true> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } +<#else> + if (!ObjectUtils.isEmpty(${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}())) { + queryWrapper.eq(${classInfo.className}Entity::get${fieldItem.fieldName?cap_first}, ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + } + + + + List<${classInfo.className}Entity> list = ${classInfo.className?uncap_first}Service.list(queryWrapper); + return DataResult.success(list); + } + + +} + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-dto.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-dto.ftl new file mode 100644 index 000000000..132f5e406 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-dto.ftl @@ -0,0 +1,44 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.dto; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.bjc.lcp.system.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}DTO extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}DTO() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-entity.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-entity.ftl new file mode 100644 index 000000000..1b0bd65ff --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-entity.ftl @@ -0,0 +1,51 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.bjc.lcp.system.entity.BaseEntity; +<#assign isSwagger=false /> +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +@TableName("${classInfo.tableName}") +public class ${classInfo.className}Entity extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.isPrimaryKey==true>@TableId(value = "${fieldItem.columnName}" ,type = IdType.AUTO )<#else>@TableField(value = "${fieldItem.columnName}" ) + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}Entity() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-mapper.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-mapper.ftl new file mode 100644 index 000000000..c6e239c8b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-mapper.ftl @@ -0,0 +1,41 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ${packageName}.entity.${classInfo.className}Entity; +import java.util.List; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}Entity> { + + @Select( + "") + List<${classInfo.className}Entity> pageAll(${classInfo.className}Entity dto,int page,int limit); + + @Select("") + int countAll(${classInfo.className}Entity dto); + + @Select("SELECT count(1) from ${classInfo.tableName} ") + int countAll(); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-service.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-service.ftl new file mode 100644 index 000000000..76483b1fe --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-service.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.IService; + +import ${packageName}.entity.${classInfo.className}Entity; + +/** + * @description ${classInfo.classComment}服务层 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface ${classInfo.className}Service extends IService<${classInfo.className}Entity> { + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-serviceimpl.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-serviceimpl.ftl new file mode 100644 index 000000000..6b3a91a11 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-serviceimpl.ftl @@ -0,0 +1,26 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service.impl; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.service.${classInfo.className}Service; + + +/** + * @description ${classInfo.classComment}服务层实现 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Service +public class ${classInfo.className}ServiceImpl extends ServiceImpl<${classInfo.className}Mapper, ${classInfo.className}Entity> implements ${classInfo.className}Service { + + @Autowired + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + +} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-vo.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-vo.ftl new file mode 100644 index 000000000..9e958ba13 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/plus-vo.ftl @@ -0,0 +1,56 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.vo; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import com.bjc.lcp.system.entity.BaseEntity; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className}VO extends BaseEntity implements Serializable { + + public interface Retrieve{} + public interface Delete {} + public interface Update {} + public interface Create {} + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + <#if fieldItem.nullable==true>@NotNull(message = "${fieldItem.fieldComment}不能为空", groups = {Create.class,Update.class,Delete.class}) + <#if fieldItem.nullable==true>@Size( max = ${fieldItem.columnSize},message = "${fieldItem.fieldComment}长度限制${fieldItem.columnSize}位") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}VO() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/pluscontroller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/pluscontroller.ftl new file mode 100644 index 000000000..2aaa8d7a0 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus-v2/pluscontroller.ftl @@ -0,0 +1,166 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import com.alibaba.fastjson.JSON; +import ${packageName}.vo.${classInfo.className}VO; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.web.servlet.ModelAndView; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* @description ${classInfo.classComment} +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Slf4j +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Autowired + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + + @Autowired + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + /** + * 新增或编辑 + */ + @PostMapping("/save") + public Object save(@RequestBody ${classInfo.className} ${classInfo.className?uncap_first}){ + log.info("${classInfo.className?uncap_first}:"+JSON.toJSONString(${classInfo.className?uncap_first})); + ${classInfo.className} old${classInfo.className} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",${classInfo.className?uncap_first}.get${classInfo.className}Id())); + ${classInfo.className?uncap_first}.setUpdateTime(new Date()); + if(old${classInfo.className}!=null){ + ${classInfo.className?uncap_first}Mapper.updateById(${classInfo.className?uncap_first}); + }else{ + if(${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_name",${classInfo.className?uncap_first}.get${classInfo.className}Name()))!=null){ + return ${returnUtilFailure}("保存失败,名字重复"); + } + ${classInfo.className?uncap_first}.setCreateTime(new Date()); + ${classInfo.className?uncap_first}Mapper.insert(${classInfo.className?uncap_first}); + } + return ${returnUtilSuccess}("保存成功"); + } + + /** + * 删除 + */ + @PostMapping("/delete") + public Object delete(int id){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + if(${classInfo.className?uncap_first}!=null){ + ${classInfo.className?uncap_first}Mapper.deleteById(id); + return ${returnUtilSuccess}("删除成功"); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 查询 + */ + @PostMapping("/find") + public Object find(int id){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + if(${classInfo.className?uncap_first}!=null){ + return ${returnUtilSuccess}(${classInfo.className?uncap_first}); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 自动分页查询 + */ + @PostMapping("/list") + public Object list(String searchParams, + @RequestParam(required = false, defaultValue = "0") int page, + @RequestParam(required = false, defaultValue = "10") int limit) { + log.info("page:"+page+"-limit:"+limit+"-json:"+ JSON.toJSONString(searchParams)); + //分页构造器 + Page<${classInfo.className}> buildPage = new Page<${classInfo.className}>(page,limit); + //条件构造器 + QueryWrapper<${classInfo.className}> queryWrapper = new QueryWrapper<${classInfo.className}>(); + if(StringUtils.isNotEmpty(searchParams)&&JSON.isValid(searchParams)) { + ${classInfo.className} ${classInfo.className?uncap_first} = JSON.parseObject(searchParams, ${classInfo.className}.class); + queryWrapper.eq(StringUtils.isNoneEmpty(${classInfo.className?uncap_first}.get${classInfo.className}Name()), "${classInfo.className?uncap_first}_name", ${classInfo.className?uncap_first}.get${classInfo.className}Name()); + } + //执行分页 + IPage<${classInfo.className}> pageList = ${classInfo.className?uncap_first}Mapper.selectPage(buildPage, queryWrapper); + //返回结果 + return ${returnUtil}.PAGE(pageList.getRecords(),pageList.getTotal()); + } + /** + * 手工分页查询(按需使用) + */ + /*@PostMapping("/list2") + public Object list2(String searchParams, + @RequestParam(required = false, defaultValue = "0") int page, + @RequestParam(required = false, defaultValue = "10") int limit) { + log.info("searchParams:"+ JSON.toJSONString(searchParams)); + //通用模式 + ${classInfo.className} queryParamDTO = JSON.parseObject(searchParams, ${classInfo.className}.class); + //专用DTO模式 + //QueryParamDTO queryParamDTO = JSON.parseObject(searchParams, QueryParamDTO.class); + //queryParamDTO.setPage((page - 1)* limit); + //queryParamDTO.setLimit(limit); + //(page - 1) * limit, limit + List<${classInfo.className}> itemList = ${classInfo.className?uncap_first}Mapper.pageAll(queryParamDTO,(page - 1)* limit,limit); + Integer itemCount = ${classInfo.className?uncap_first}Mapper.countAll(queryParamDTO); + //返回结果 + return ${returnUtilSuccess}.PAGE(itemList,itemCount); + }*/ + @GetMapping("/list") + public ModelAndView listPage(){ + return new ModelAndView("${classInfo.className?uncap_first}-list"); + } + + @GetMapping("/edit") + public ModelAndView editPage(int id){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + return new ModelAndView("${classInfo.className?uncap_first}-edit","${classInfo.className?uncap_first}",${classInfo.className?uncap_first}); + } + + /** + * 发布/暂停(如不需要请屏蔽) + */ + @PostMapping("/publish") + public Object publish(int id,Integer status){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + if(${classInfo.className?uncap_first}!=null){ + ${classInfo.className?uncap_first}.setUpdateTime(new Date()); + ${classInfo.className?uncap_first}.setStatus(status); + ${classInfo.className?uncap_first}Mapper.updateById(${classInfo.className?uncap_first}); + return ${returnUtilSuccess}((status==1)?"已发布":"已暂停"); + }else if(status.equals(${classInfo.className?uncap_first}.getStatus())){ + return ${returnUtilFailure}("状态不正确"); + }else{ + return ${returnUtilFailure}(); + } + } + + /** + * 执行(如不需要请屏蔽) + */ + @PostMapping("/execute") + public Object execute(){ + return ${returnUtilSuccess}; + } +} +} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/pluscontroller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/pluscontroller.ftl new file mode 100644 index 000000000..f18e4429c --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/pluscontroller.ftl @@ -0,0 +1,161 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import com.alibaba.fastjson.JSON; +import ${packageName}.entity.${classInfo.className}; +import ${packageName}.mapper.${classInfo.className}Mapper; +import ${packageName}.util.ReturnT; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.web.servlet.ModelAndView; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* @description ${classInfo.classComment}控制器 +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Slf4j +@RestController +@RequestMapping("/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Autowired + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + + /** + * 新增或编辑 + */ + @PostMapping("/save") + public Object save(@RequestBody ${classInfo.className} ${classInfo.className?uncap_first}){ + log.info("${classInfo.className?uncap_first}:"+JSON.toJSONString(${classInfo.className?uncap_first})); + ${classInfo.className} old${classInfo.className} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",${classInfo.className?uncap_first}.get${classInfo.className}Id())); + ${classInfo.className?uncap_first}.setUpdateTime(new Date()); + if(old${classInfo.className}!=null){ + ${classInfo.className?uncap_first}Mapper.updateById(${classInfo.className?uncap_first}); + }else{ + if(${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_name",${classInfo.className?uncap_first}.get${classInfo.className}Name()))!=null){ + return ${returnUtilFailure}("保存失败,名字重复"); + } + ${classInfo.className?uncap_first}.setCreateTime(new Date()); + ${classInfo.className?uncap_first}Mapper.insert(${classInfo.className?uncap_first}); + } + return ${returnUtilSuccess}("保存成功"); + } + + /** + * 删除 + */ + @PostMapping("/delete") + public Object delete(int id){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + if(${classInfo.className?uncap_first}!=null){ + ${classInfo.className?uncap_first}Mapper.deleteById(id); + return ${returnUtilSuccess}("删除成功"); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 查询 + */ + @PostMapping("/find") + public Object find(int id){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + if(${classInfo.className?uncap_first}!=null){ + return ${returnUtilSuccess}(${classInfo.className?uncap_first}); + }else{ + return ${returnUtilFailure}("没有找到该对象"); + } + } + + /** + * 自动分页查询 + */ + @PostMapping("/list") + public Object list(String searchParams, + @RequestParam(required = false, defaultValue = "0") int page, + @RequestParam(required = false, defaultValue = "10") int limit) { + log.info("page:"+page+"-limit:"+limit+"-json:"+ JSON.toJSONString(searchParams)); + //分页构造器 + Page<${classInfo.className}> buildPage = new Page<${classInfo.className}>(page,limit); + //条件构造器 + QueryWrapper<${classInfo.className}> queryWrapper = new QueryWrapper<${classInfo.className}>(); + if(StringUtils.isNotEmpty(searchParams)&&JSON.isValid(searchParams)) { + ${classInfo.className} ${classInfo.className?uncap_first} = JSON.parseObject(searchParams, ${classInfo.className}.class); + queryWrapper.eq(StringUtils.isNoneEmpty(${classInfo.className?uncap_first}.get${classInfo.className}Name()), "${classInfo.className?uncap_first}_name", ${classInfo.className?uncap_first}.get${classInfo.className}Name()); + } + //执行分页 + IPage<${classInfo.className}> pageList = ${classInfo.className?uncap_first}Mapper.selectPage(buildPage, queryWrapper); + //返回结果 + return ${returnUtil}.PAGE(pageList.getRecords(),pageList.getTotal()); + } + /** + * 手工分页查询(按需使用) + */ + /*@PostMapping("/list2") + public Object list2(String searchParams, + @RequestParam(required = false, defaultValue = "0") int page, + @RequestParam(required = false, defaultValue = "10") int limit) { + log.info("searchParams:"+ JSON.toJSONString(searchParams)); + //通用模式 + ${classInfo.className} queryParamDTO = JSON.parseObject(searchParams, ${classInfo.className}.class); + //专用DTO模式 + //QueryParamDTO queryParamDTO = JSON.parseObject(searchParams, QueryParamDTO.class); + //queryParamDTO.setPage((page - 1)* limit); + //queryParamDTO.setLimit(limit); + //(page - 1) * limit, limit + List<${classInfo.className}> itemList = ${classInfo.className?uncap_first}Mapper.pageAll(queryParamDTO,(page - 1)* limit,limit); + Integer itemCount = ${classInfo.className?uncap_first}Mapper.countAll(queryParamDTO); + //返回结果 + return ${returnUtilSuccess}.PAGE(itemList,itemCount); + }*/ + @GetMapping("/list") + public ModelAndView listPage(){ + return new ModelAndView("${classInfo.className?uncap_first}-list"); + } + + @GetMapping("/edit") + public ModelAndView editPage(int id){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + return new ModelAndView("${classInfo.className?uncap_first}-edit","${classInfo.className?uncap_first}",${classInfo.className?uncap_first}); + } + + /** + * 发布/暂停(如不需要请屏蔽) + */ + @PostMapping("/publish") + public Object publish(int id,Integer status){ + ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id)); + if(${classInfo.className?uncap_first}!=null){ + ${classInfo.className?uncap_first}.setUpdateTime(new Date()); + ${classInfo.className?uncap_first}.setStatus(status); + ${classInfo.className?uncap_first}Mapper.updateById(${classInfo.className?uncap_first}); + return ${returnUtilSuccess}((status==1)?"已发布":"已暂停"); + }else if(status.equals(${classInfo.className?uncap_first}.getStatus())){ + return ${returnUtilFailure}("状态不正确"); + }else{ + return ${returnUtilFailure}(); + } + } + + /** + * 执行(如不需要请屏蔽) + */ + @PostMapping("/execute") + public Object execute(){ + return ${returnUtilSuccess}; + } +} +} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusentity.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusentity.ftl new file mode 100644 index 000000000..52134edbb --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusentity.ftl @@ -0,0 +1,46 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.entity; + +<#if isAutoImport?exists && isAutoImport==true> +<#if isLombok?exists && isLombok==true>import lombok.Data; +import java.util.Date; +import java.util.List; +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +<#if isSwagger?exists && isSwagger==true> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +<#if isLombok?exists && isLombok==true>@Data<#if isSwagger?exists && isSwagger==true> +@ApiModel("${classInfo.classComment}") +public class ${classInfo.className} implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.AUTO) +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */<#if isSwagger?exists && isSwagger==true> + @ApiModelProperty("${fieldItem.fieldComment}") + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + +<#if isLombok?exists && isLombok==false> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + + public ${classInfo.className}() {} +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusmapper.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusmapper.ftl new file mode 100644 index 000000000..438b514fd --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusmapper.ftl @@ -0,0 +1,38 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import ${packageName}.entity.${classInfo.className}; +import java.util.List; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}> { + + @Select( + "") + List<${classInfo.className}> pageAll(${classInfo.className} queryParamDTO,int page,int limit); + + @Select("") + int countAll(${classInfo.className} queryParamDTO); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusservice.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusservice.ftl new file mode 100644 index 000000000..4672e01a1 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis-plus/plusservice.ftl @@ -0,0 +1,16 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @description ${classInfo.classComment}服务层 + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Service +public interface ${classInfo.className}Service extends IService<${classInfo.className}> { + + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis.ftl new file mode 100644 index 000000000..0e1a7560e --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis.ftl @@ -0,0 +1,82 @@ + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + `${fieldItem.columnName}`<#if fieldItem_has_next>, + + + + + + INSERT INTO ${classInfo.tableName} ( + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "Id" > + `${fieldItem.columnName}`<#if fieldItem_has_next>, + + + + ) + VALUES( + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "Id" > + <#if fieldItem.columnName="AddTime" || fieldItem.columnName="UpdateTime" > + NOW()<#if fieldItem_has_next>, + <#else> + ${r"#{"}${classInfo.className?uncap_first}.${fieldItem.fieldName}${r"}"}<#if fieldItem_has_next>, + + + + + ) + + + + DELETE FROM ${classInfo.tableName} + WHERE `id` = ${r"#{id}"} + + + + UPDATE ${classInfo.tableName} + SET + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "Id" && fieldItem.columnName != "AddTime" && fieldItem.columnName != "UpdateTime" > + ${fieldItem.columnName} = ${r"#{"}${classInfo.className?uncap_first}.${fieldItem.fieldName}${r"}"}, + + + UpdateTime = NOW() + WHERE `id` = ${r"#{"}${classInfo.className?uncap_first}.id${r"}"} + + + + + + + + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/controller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/controller.ftl new file mode 100644 index 000000000..69697c732 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/controller.ftl @@ -0,0 +1,76 @@ +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@RestController +@RequestMapping(value = "/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + + @Resource + private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + + /** + * 新增 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + @RequestMapping("/insert") + public Object insert(${classInfo.className} ${classInfo.className?uncap_first}){ + return ${classInfo.className?uncap_first}Service.insert(${classInfo.className?uncap_first}); + } + + /** + * 刪除 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + @RequestMapping("/delete") + public ReturnT delete(int id){ + return ${classInfo.className?uncap_first}Service.delete(id); + } + + /** + * 更新 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + @RequestMapping("/update") + public ReturnT update(${classInfo.className} ${classInfo.className?uncap_first}){ + return ${classInfo.className?uncap_first}Service.update(${classInfo.className?uncap_first}); + } + + /** + * 查询 根据主键 id 查询 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + @RequestMapping("/load") + public Object load(int id){ + return ${classInfo.className?uncap_first}Service.load(id); + } + + /** + * 查询 分页查询 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + @RequestMapping("/pageList") + public Map pageList(@RequestParam(required = false, defaultValue = "0") int offset, + @RequestParam(required = false, defaultValue = "10") int pagesize) { + return ${classInfo.className?uncap_first}Service.pageList(offset, pagesize); + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mapper.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mapper.ftl new file mode 100644 index 000000000..e7dc9ef57 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mapper.ftl @@ -0,0 +1,59 @@ +<#if isAutoImport?exists && isAutoImport==true> +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; +import java.util.List; + + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +@Repository +public interface ${classInfo.className}Mapper { + + /** + * 新增 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + int insert(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 刪除 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + int delete(int id); + + /** + * 更新 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + int update(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 查询 根据主键 id 查询 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + ${classInfo.className} load(int id); + + /** + * 查询 分页查询 + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + List<${classInfo.className}> pageList(int offset,int pagesize); + + /** + * 查询 分页查询 count + * @author ${authorName} + * @date ${.now?string('yyyy/MM/dd')} + **/ + int pageListCount(int offset,int pagesize); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mapper2.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mapper2.ftl new file mode 100644 index 000000000..ee0b5e0a6 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mapper2.ftl @@ -0,0 +1,56 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; +import java.util.List; + +/** + * @description ${classInfo.classComment}Mapper + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Mapper +@Repository +public interface ${classInfo.className}Mapper { + + @Select("select * from ${classInfo.tableName} where ${classInfo.tableName}_id=井{id}") + public ${classInfo.className} getById(Integer id); + + @Options(useGeneratedKeys=true,keyProperty="${classInfo.className?uncap_first}Id") + @Insert("insert into ${classInfo.tableName}" + + " (<#list classInfo.fieldList as fieldItem >${fieldItem.columnName}<#if fieldItem_has_next>,)" + + " values(<#list classInfo.fieldList as fieldItem >${fieldItem.fieldName}<#if fieldItem_has_next>,<#else>)") + public Integer insert(${classInfo.className} ${classInfo.className?uncap_first}); + + @Delete(value = "delete from ${classInfo.tableName} where ${classInfo.tableName}_id=井{${classInfo.className?uncap_first}Id}") + boolean delete(Integer id); + + @Update(value = "update ${classInfo.tableName} set " + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "id">+" ${fieldItem.columnName}=井{${fieldItem.fieldName}}<#if fieldItem_has_next>," + + +" where ${classInfo.tableName}_id=井{${classInfo.className?uncap_first}Id} ") + boolean update(${classInfo.className} ${classInfo.className?uncap_first}); + + + @Results(value = { + <#list classInfo.fieldList as fieldItem > + @Result(property = "${fieldItem.fieldName}", column = "${fieldItem.columnName}")<#if fieldItem_has_next>, + + }) + @Select(value = "select * from ${classInfo.tableName} where ${classInfo.tableName}_id=井{queryParam}") + ${classInfo.className} selectOne(String queryParam); + + @Results(value = { + <#list classInfo.fieldList as fieldItem > + @Result(property = "${fieldItem.fieldName}", column = "${fieldItem.columnName}")<#if fieldItem_has_next>, + + }) + @Select(value = "select * from ${classInfo.tableName} where " + <#list classInfo.fieldList as fieldItem > + +" ${fieldItem.columnName}=井{${fieldItem.fieldName}}<#if fieldItem_has_next> or " + + ) + List<${classInfo.className}> selectList(${classInfo.className} ${classInfo.className?uncap_first}); + +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/model.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/model.ftl new file mode 100644 index 000000000..3e94df707 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/model.ftl @@ -0,0 +1,40 @@ +<#if isAutoImport?exists && isAutoImport==true> +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public class ${classInfo.className} implements Serializable { + + private static final long serialVersionUID = 1L; + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem > + <#if isComment?exists && isComment==true>/** + * ${fieldItem.fieldComment} + */ + private ${fieldItem.fieldClass} ${fieldItem.fieldName}; + + + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + public ${classInfo.className}() { + } + +<#list classInfo.fieldList as fieldItem> + public ${fieldItem.fieldClass} get${fieldItem.fieldName?cap_first}() { + return ${fieldItem.fieldName}; + } + + public void set${fieldItem.fieldName?cap_first}(${fieldItem.fieldClass} ${fieldItem.fieldName}) { + this.${fieldItem.fieldName} = ${fieldItem.fieldName}; + } + + + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mybatis.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mybatis.ftl new file mode 100644 index 000000000..24bfb858b --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/mybatis.ftl @@ -0,0 +1,89 @@ + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + ${fieldItem.columnName}<#if fieldItem_has_next>, + + + + + + INSERT INTO ${classInfo.tableName} + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "id" > + + ${fieldItem.columnName}<#if fieldItem_has_next>, + ${r""} + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "id" > + <#--<#if fieldItem.columnName="addtime" || fieldItem.columnName="updatetime" > + ${r""} + NOW()<#if fieldItem_has_next>, + ${r""} + <#else>--> + + ${r"#{"}${fieldItem.fieldName}${r"}"}<#if fieldItem_has_next>, + ${r""} + <#----> + + + + + + + + DELETE FROM ${classInfo.tableName} + WHERE id = ${r"#{id}"} + + + + UPDATE ${classInfo.tableName} + + <#list classInfo.fieldList as fieldItem > + <#if fieldItem.columnName != "id" && fieldItem.columnName != "AddTime" && fieldItem.columnName != "UpdateTime" > + ${fieldItem.columnName} = ${r"#{"}${fieldItem.fieldName}${r"}"}<#if fieldItem_has_next>,${r""} + + + + WHERE id = ${r"#{"}id${r"}"} + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/service.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/service.ftl new file mode 100644 index 000000000..c31f30b0f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/service.ftl @@ -0,0 +1,36 @@ +<#if isAutoImport?exists && isAutoImport==true> +import java.util.Map; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +public interface ${classInfo.className}Service { + + /** + * 新增 + */ + public Object insert(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 删除 + */ + public Object delete(int id); + + /** + * 更新 + */ + public Object update(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 根据主键 id 查询 + */ + public ${classInfo.className} load(int id); + + /** + * 分页查询 + */ + public Map pageList(int offset, int pagesize); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/service_impl.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/service_impl.ftl new file mode 100644 index 000000000..3a8345de8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/mybatis/service_impl.ftl @@ -0,0 +1,68 @@ +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @description ${classInfo.classComment} + * @author ${authorName} + * @date ${.now?string('yyyy-MM-dd')} + */ +@Service +public class ${classInfo.className}ServiceImpl implements ${classInfo.className}Service { + + @Resource + private ${classInfo.className}Mapper ${classInfo.className?uncap_first}Mapper; + + + @Override + public Object insert(${classInfo.className} ${classInfo.className?uncap_first}) { + + // valid + if (${classInfo.className?uncap_first} == null) { + return ${returnUtilFailure}("必要参数缺失"); + } + + ${classInfo.className?uncap_first}Mapper.insert(${classInfo.className?uncap_first}); + return ${returnUtilSuccess}(); + } + + + @Override + public Object delete(int id) { + int ret = ${classInfo.className?uncap_first}Mapper.delete(id); + return ret>0?${returnUtilSuccess}():${returnUtilFailure}(); + } + + + @Override + public Object update(${classInfo.className} ${classInfo.className?uncap_first}) { + int ret = ${classInfo.className?uncap_first}Mapper.update(${classInfo.className?uncap_first}); + return ret>0?${returnUtilSuccess}():${returnUtilFailure}(); + } + + + @Override + public ${classInfo.className} load(int id) { + return ${classInfo.className?uncap_first}Mapper.load(id); + } + + + @Override + public Map pageList(int offset, int pagesize) { + + List<${classInfo.className}> pageList = ${classInfo.className?uncap_first}Mapper.pageList(offset, pagesize); + int totalCount = ${classInfo.className?uncap_first}Mapper.pageListCount(offset, pagesize); + + // result + Map result = new HashMap(); + result.put("pageList", pageList); + result.put("totalCount", totalCount); + + return result; + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/menu-sql.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/menu-sql.ftl new file mode 100644 index 000000000..2b3193a3f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/menu-sql.ftl @@ -0,0 +1,17 @@ +-- 菜单SQL +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +VALUES ('1', '${classInfo.classComment}', 'generator/${classInfo.className?uncap_first}', NULL, '1', 'config', '6'); + +-- 按钮父菜单ID +set @parentId = @@identity; + +-- 菜单对应按钮SQL +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '查看', null, 'generator:${classInfo.className?uncap_first}:list,generator:${classInfo.className?uncap_first}:info', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '新增', null, 'generator:${classInfo.className?uncap_first}:save', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '修改', null, 'generator:${classInfo.className?uncap_first}:update', '2', null, '6'; +INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) +SELECT @parentId, '删除', null, 'generator:${classInfo.className?uncap_first}:delete', '2', null, '6'; + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-controller.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-controller.ftl new file mode 100644 index 000000000..31a1c39f9 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-controller.ftl @@ -0,0 +1,89 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.controller; +<#if isAutoImport?exists && isAutoImport==true> +import java.util.Arrays; +import java.util.Map; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import ${packageName}.entity.${classInfo.className}Entity; +import ${packageName}.service.${classInfo.className}Service; +import ${packageName}.common.utils.PageUtils; +import ${packageName}.common.utils.R; + + + +/** +* @description ${classInfo.classComment}控制器 +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@RestController +@RequestMapping("generator/${classInfo.className?uncap_first}") +public class ${classInfo.className}Controller { + +@Autowired +private ${classInfo.className}Service ${classInfo.className?uncap_first}Service; + +/** +* 列表 +*/ +@RequestMapping("/list") +@RequiresPermissions("generator:${classInfo.className?uncap_first}:list") +public R list(@RequestParam Map params){ + PageUtils page = ${classInfo.className?uncap_first}Service.queryPage(params); + + return R.ok().put("page", page); +} + + +/** +* 信息 +*/ +@RequestMapping("/info/{${classInfo.className?uncap_first}Id}") +@RequiresPermissions("generator:${classInfo.className?uncap_first}:info") +public R info(@PathVariable("${classInfo.className?uncap_first}Id") int ${classInfo.className?uncap_first}Id){ + ${classInfo.className}Entity ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Service.getById(${classInfo.className?uncap_first}Id); + + return R.ok().put("${classInfo.className?uncap_first}", ${classInfo.className?uncap_first}); +} + +/** +* 保存 +*/ +@RequestMapping("/save") +@RequiresPermissions("generator:${classInfo.className?uncap_first}:save") +public R save(@RequestBody ${classInfo.className}Entity ${classInfo.className?uncap_first}){ + ${classInfo.className?uncap_first}Service.save(${classInfo.className?uncap_first}); + + return R.ok(); +} + +/** +* 修改 +*/ +@RequestMapping("/update") +@RequiresPermissions("generator:${classInfo.className?uncap_first}:update") +public R update(@RequestBody ${classInfo.className}Entity ${classInfo.className?uncap_first}){ + ${classInfo.className?uncap_first}Service.updateById(${classInfo.className?uncap_first}); + + return R.ok(); +} + +/** +* 删除 +*/ +@RequestMapping("/delete") +@RequiresPermissions("generator:${classInfo.className?uncap_first}:delete") +public R delete(@RequestBody int[] ${classInfo.className?uncap_first}Ids){ + ${classInfo.className?uncap_first}Service.removeByIds(Arrays.asList(${classInfo.className?uncap_first}Ids)); + + return R.ok(); +} + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-dao.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-dao.ftl new file mode 100644 index 000000000..15f7e9643 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-dao.ftl @@ -0,0 +1,15 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.mapper; +<#if isAutoImport?exists && isAutoImport==true> +import ${packageName}.entity.${classInfo.className}Entity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* @description ${classInfo.classComment}Mapper +* @author ${authorName} +* @date ${.now?string('yyyy-MM-dd')} +*/ +@Mapper +public interface ${classInfo.className}Dao extends BaseMapper<${classInfo.className}Entity> { + +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-daoxml.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-daoxml.ftl new file mode 100644 index 000000000..c4656036e --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-daoxml.ftl @@ -0,0 +1,15 @@ + + + + + + + + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-entity.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-entity.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-service.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-service.ftl new file mode 100644 index 000000000..719246d22 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/rr-service.ftl @@ -0,0 +1,28 @@ +<#if isWithPackage?exists && isWithPackage==true>package ${packageName}.service; +<#if isAutoImport?exists && isAutoImport==true> +import org.springframework.stereotype.Service; +import java.util.Map; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import ${packageName}.common.utils.PageUtils; +import ${packageName}.common.utils.Query; + +import ${packageName}.dao.${classInfo.className}Dao; +import ${packageName}.entity.${classInfo.className}Entity; + + +@Service("${classInfo.className?uncap_first}Service") +public class ${classInfo.className}Service extends ServiceImpl<${classInfo.className}Dao, ${classInfo.className}Entity> { + + @Override + public PageUtils queryPage(Map params) { + IPage<${classInfo.className}Entity> page = this.page( + new Query<${classInfo.className}Entity>().getPage(params), + new QueryWrapper<${classInfo.className}Entity>() + ); + + return new PageUtils(page); + } + +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/vue-edit.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/vue-edit.ftl new file mode 100644 index 000000000..6f5835baf --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/vue-edit.ftl @@ -0,0 +1,101 @@ + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/vue-list.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/vue-list.ftl new file mode 100644 index 000000000..969d7d808 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/renren-fast/vue-list.ftl @@ -0,0 +1,162 @@ + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/service.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/service.ftl new file mode 100644 index 000000000..b3295ddab --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/service.ftl @@ -0,0 +1,39 @@ +package ${packageService}; +import java.util.Map; + +import ${packageModel}.${classInfo.className}; +import com.jun.plugin.codegenerator.admin.model.ReturnT; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +public interface ${classInfo.className}Service { + + /** + * 新增 + */ + public ReturnT insert(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * 删除 + */ + public ReturnT delete(int id); + + /** + * 更新 + */ + public ReturnT update(${classInfo.className} ${classInfo.className?uncap_first}); + + /** + * Load查询 + */ + public ${classInfo.className} load(int id); + + /** + * 分页查询 + */ + public Map pageList(int offset, int pagesize); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/service_impl.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/service_impl.ftl new file mode 100644 index 000000000..44ca00df8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/service_impl.ftl @@ -0,0 +1,85 @@ +package ${packageServiceImpl}; + +import org.springframework.stereotype.Service; + +import com.jun.plugin.biz.dao.${classInfo.className}Dao; +import ${packageModel}.${classInfo.className}; +import ${packageService}.${classInfo.className}Service; +import com.jun.plugin.codegenerator.admin.model.ReturnT; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** +* ${classInfo.classComment} +* +* Created by wujun on '${.now?string('yyyy-MM-dd HH:mm:ss')}'. +*/ +@Service +public class ${classInfo.className}ServiceImpl implements ${classInfo.className}Service { + + @Resource + private ${classInfo.className}Dao ${classInfo.className?uncap_first}Dao; + + /** + * 新增 + */ + @Override + public ReturnT insert(${classInfo.className} ${classInfo.className?uncap_first}) { + + // valid + if (${classInfo.className?uncap_first} == null) { + return new ReturnT(ReturnT.FAIL_CODE, "必要参数缺失"); + } + + ${classInfo.className?uncap_first}Dao.insert(${classInfo.className?uncap_first}); + return ReturnT.SUCCESS; + } + + /** + * 删除 + */ + @Override + public ReturnT delete(int id) { + int ret = ${classInfo.className?uncap_first}Dao.delete(id); + return ret>0?ReturnT.SUCCESS:ReturnT.FAIL; + } + + /** + * 更新 + */ + @Override + public ReturnT update(${classInfo.className} ${classInfo.className?uncap_first}) { + int ret = ${classInfo.className?uncap_first}Dao.update(${classInfo.className?uncap_first}); + return ret>0?ReturnT.SUCCESS:ReturnT.FAIL; + } + + /** + * Load查询 + */ + @Override + public ${classInfo.className} load(int id) { + return ${classInfo.className?uncap_first}Dao.load(id); + } + + /** + * 分页查询 + */ + @Override + public Map pageList(int offset, int pagesize) { + + List<${classInfo.className}> pageList = ${classInfo.className?uncap_first}Dao.pageList(offset, pagesize); + int totalCount = ${classInfo.className?uncap_first}Dao.pageListCount(offset, pagesize); + + // result + Map result = new HashMap(); + result.put("pageList", pageList); + result.put("totalCount", totalCount); + + return result; + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/bootstrap-ui.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/bootstrap-ui.ftl new file mode 100644 index 000000000..eaefd4312 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/bootstrap-ui.ftl @@ -0,0 +1,13 @@ +
+ + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > +
+ + +
+ + + + +
diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/element-ui.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/element-ui.ftl new file mode 100644 index 000000000..9f9e224d2 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/element-ui.ftl @@ -0,0 +1,16 @@ + + +
+ ${classInfo.classComment} + 提交 + 返回 +
+ <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + + + + + +
+
\ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/layui-edit.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/layui-edit.ftl new file mode 100644 index 000000000..6299a1b24 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/layui-edit.ftl @@ -0,0 +1,64 @@ + + + +
+ + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > +
+ +
+ + <#--${fieldItem.fieldComment}--> +
+
+ + + +
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/layui-list.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/layui-list.ftl new file mode 100644 index 000000000..a3de2993c --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/layui-list.ftl @@ -0,0 +1,221 @@ + + + +
+
+ +
+ 搜索信息 +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + +
+
+ + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/swagger-ui.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/swagger-ui.ftl new file mode 100644 index 000000000..0e506598d --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/ui/swagger-ui.ftl @@ -0,0 +1,9 @@ +@ApiOperation(value = "${classInfo.classComment}", notes = "${classInfo.classComment}") + @ApiImplicitParams({ + <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + <#list classInfo.fieldList as fieldItem > + @ApiImplicitParam(name = "${fieldItem.fieldName}", value = "${fieldItem.fieldComment}", required = false, dataType = "${fieldItem.fieldClass}")<#if fieldItem_has_next>, + + + } + ) diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/beanutil.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/beanutil.ftl new file mode 100644 index 000000000..108e27af9 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/beanutil.ftl @@ -0,0 +1,41 @@ +/** +* ${classInfo.classComment}对象Get Set +* @author ${authorName} ${.now?string('yyyy-MM-dd')} +*/ + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<#list classInfo.fieldList as fieldItem> +// ${fieldItem.fieldComment} +${fieldItem.fieldClass} ${fieldItem.fieldName} = ${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}(); + + +<#list classInfo.fieldList as fieldItem> +// ${fieldItem.fieldComment} +${classInfo.className?uncap_first}.set${fieldItem.fieldName?cap_first}(); + + +<#list classInfo.fieldList as fieldItem> +// ${fieldItem.fieldComment} +${classInfo.className?uncap_first}.set${fieldItem.fieldName?cap_first}(${classInfo.className?uncap_first}2.get${fieldItem.fieldName?cap_first}()); + + +<#list classInfo.fieldList as fieldItem> +// ${fieldItem.fieldComment} +map.put("${fieldItem.fieldName?uncap_first}",${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + + +<#list classInfo.fieldList as fieldItem> +// ${fieldItem.fieldComment} +map.put("${fieldItem.columnName}",${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + + +<#list classInfo.fieldList as fieldItem> +map.put("${fieldItem.fieldComment}",${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + + +<#list classInfo.fieldList as fieldItem> +// ${fieldItem.fieldComment} +map.put("${fieldItem.fieldName?uncap_first}",${classInfo.className?uncap_first}.get${fieldItem.fieldName?cap_first}()); + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/json.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/json.ftl new file mode 100644 index 000000000..596cce40f --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/json.ftl @@ -0,0 +1,13 @@ +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +{ +<#list classInfo.fieldList as fieldItem> + "${fieldItem.fieldName}":"${fieldItem.fieldComment}"<#if fieldItem_has_next>, + +} + +{ +<#list classInfo.fieldList as fieldItem> + "${fieldItem.fieldName}":""<#if fieldItem_has_next>, + +} + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/sql.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/sql.ftl new file mode 100644 index 000000000..126f84dc2 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/sql.ftl @@ -0,0 +1,74 @@ + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> + #SQL横向select + SELECT <#list classInfo.fieldList as fieldItem >t.${fieldItem.columnName}<#if fieldItem_has_next>, + FROM ${classInfo.tableName} t; + + #CSV横向字段名 + <#list classInfo.fieldList as fieldItem >${fieldItem.columnName}<#if fieldItem_has_next>, + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +#LEFT JOIN + SELECT + * + FROM + ${classInfo.tableName} a + LEFT JOIN ${classInfo.tableName} b + ON a.${classInfo.tableName}_id=b.${classInfo.tableName}_id + WHERE 1=1; + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +#INSERT INTO + INSERT INTO ${classInfo.tableName} ( <#list classInfo.fieldList as fieldItem >${fieldItem.columnName}<#if fieldItem_has_next>, ) + VALUES + ( + <#list classInfo.fieldList as fieldItem >''<#if fieldItem_has_next>, + ); + + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +#关联更新 + UPDATE ${classInfo.tableName} a + JOIN ${classInfo.tableName}_join b ON a.${classInfo.tableName}_id = b.${classInfo.tableName}_id + SET <#list classInfo.fieldList as fieldItem > a.${fieldItem.columnName} = b.${fieldItem.columnName}<#if fieldItem_has_next>, + WHERE + b.${classInfo.tableName}_id IS NOT NULL; + + UPDATE ${classInfo.tableName} a,${classInfo.tableName}_join b + SET <#list classInfo.fieldList as fieldItem > a.${fieldItem.columnName} = b.${fieldItem.columnName}<#if fieldItem_has_next>, + WHERE a.${classInfo.tableName}_id = b.${classInfo.tableName}_id; + +#普通update + UPDATE ${classInfo.tableName} + SET + <#list classInfo.fieldList as fieldItem > + ${fieldItem.columnName} = ''<#if fieldItem_has_next>, + + WHERE + <#list classInfo.fieldList as fieldItem > + ${fieldItem.columnName} = ''<#if fieldItem_has_next>, + ; + + + + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +#关联删除 + delete a from ${classInfo.tableName}_del as a inner join ${classInfo.tableName} as b + where a.${classInfo.tableName}_id=b.${classInfo.tableName}_id; + +#普通删除 + DELETE + FROM + ${classInfo.tableName} + WHERE + <#list classInfo.fieldList as fieldItem > + ${fieldItem.columnName} = ''<#if fieldItem_has_next>, + ; + + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/swagger-yml.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/swagger-yml.ftl new file mode 100644 index 000000000..ce22aaa50 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/swagger-yml.ftl @@ -0,0 +1,12 @@ + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +${classInfo.className}: + type: "object" + properties: +<#list classInfo.fieldList as fieldItem > + ${fieldItem.fieldName}: + type: ${fieldItem.swaggerClass} + description: <#if isComment?exists && isComment==true>"${fieldItem.fieldComment}" + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/xml.ftl b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/xml.ftl new file mode 100644 index 000000000..3959cfcb1 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/code-generator/util/xml.ftl @@ -0,0 +1,11 @@ + +<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> +<${classInfo.className}> +<#list classInfo.fieldList as fieldItem> + <${fieldItem.fieldName}>${fieldItem.fieldComment} + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/Controller.java.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/Controller.java.vm new file mode 100644 index 000000000..1768ee9d8 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/Controller.java.vm @@ -0,0 +1,181 @@ +package ${package}.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import java.util.List; +import com.jun.plugin.system.common.utils.DataResult; +import com.jun.plugin.common.aop.annotation.DataScope; +import com.jun.plugin.module.flow.process.BaseFlowController; + +import ${package}.entity.${className}Entity; +import ${package}.mapper.${className}Mapper; +import ${package}.service.${className}Service; + + + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +@Controller +@RequestMapping("/") +@Slf4j +public class ${className}Controller extends BaseFlowController{ + + @Autowired + private ${className}Service ${classname}Service; + + @Autowired + private ${className}Mapper ${classname}Mapper; + + + /** + * 跳转到页面 + */ + @GetMapping("/index/${classname}") + public String ${classname}() { + return "${classNameLower}/list"; + } + + @ApiOperation(value = "新增") + @PostMapping("${classname}/add") + @RequiresPermissions("${classname}:add") + @ResponseBody + public DataResult add(@RequestBody ${className}Entity ${classname}){ + if(this.checkExists(${classname})) { + return DataResult.fail("同名记录信息已存在!"); + } + ${classname}Service.save(${classname}); + return DataResult.success(); + } + + @ApiOperation(value = "删除") + @DeleteMapping("${classname}/delete") + @RequiresPermissions("${classname}:delete") + @ResponseBody + public DataResult delete(@RequestBody @ApiParam(value = "id集合") List ids){ + ${classname}Service.removeByIds(ids); + return DataResult.success(); + } + + @ApiOperation(value = "更新") + @PutMapping("${classname}/update") + @RequiresPermissions("${classname}:update") + @ResponseBody + public DataResult update(@RequestBody ${className}Entity ${classname}){ + ${classname}Service.updateById(${classname}); + return DataResult.success(); + } + + @ApiOperation(value = "查询分页数据") + @PostMapping("${classname}/listByPage") + @RequiresPermissions("${classname}:list") + @ResponseBody + @DataScope + public DataResult findListByPage(@RequestBody ${className}Entity ${classname}){ + Page page = new Page(${classname}.getPage(), ${classname}.getLimit()); + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(${classname}.getCreateIds())) { + queryWrapper.in(${className}Entity::getCreateId, ${classname}.getCreateIds()); + } + //数据权限示例, 需手动添加此条件 end + //queryWrapper.like(${className}Entity::getId, ${classname}.getId()==null?"":${classname}.getId()); + IPage<${className}Entity> iPage = ${classname}Service.page(page, queryWrapper); + //关联流程查询待办、处理人、状态 + List<${className}Entity> records = iPage.getRecords(); + records.forEach(item -> { + if((item.getOrderId()!=null && item.getOrderId().length()>0) && (item.getOrderStatus()==null)) { + this.setFlowStatusInfo(item); + System.err.println(item.getOrderStatus()); + if(item.getOrderState()==0) { + if((item.getOrderStatus()==null || item.getOrderStatus()!=0)) { + item.setOrderStatus(item.getOrderState()); + ${classname}Service.updateById(item); + } + } + }else { + item.setOrderState(item.getOrderStatus()); + } + + }); + return DataResult.success(iPage); + } + + + @ApiOperation(value = "查询下拉列表数据") + @PostMapping("${classname}/listBySelect") + @ResponseBody + @DataScope + public DataResult listBySelect(@RequestBody ${className}Entity ${classname}){ + Page page = new Page(${classname}.getPage(), ${classname}.getLimit()); + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(${classname}.getCreateIds())) { + queryWrapper.in(${className}Entity::getCreateId, ${classname}.getCreateIds()); + } + //数据权限示例, 需手动添加此条件 end + //查询条件示例 + //queryWrapper.like(${className}Entity::getId, ${classname}.getId()); + IPage<${className}Entity> iPage = ${classname}Service.page(page, queryWrapper); + return DataResult.success(iPage); + } + + @ApiOperation(value = "查询单条数据") + @PostMapping("${classname}/findOne") + @ResponseBody + public DataResult findOne(@RequestBody ${className}Entity ${classname}){ + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + //queryWrapper.eq(${className}Entity::getId, ${classname}.getId()); + //${className}Entity one = ${classname}Service.getOne(queryWrapper); + ${className}Entity one = ${classname}Service.getById(${classname}.getId()); + return DataResult.success(one); + } + + @ApiOperation(value = "查询下拉框数据") + @PostMapping("${classname}/findListBySelect") + @ResponseBody + @DataScope + public DataResult findListBySelect(@RequestBody ${className}Entity ${classname}){ + Page page = new Page(${classname}.getPage(), ${classname}.getLimit()); + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(${classname}.getCreateIds())) { + queryWrapper.in(${className}Entity::getCreateId, ${classname}.getCreateIds()); + } + //数据权限示例, 需手动添加此条件 end + //queryWrapper.like(${className}Entity::getId, ${classname}.getId()); + IPage<${className}Entity> iPage = ${classname}Service.page(page, queryWrapper); + log.info("\n this.${classname}Mapper.selectCountUser()="+this.${classname}Mapper.selectCountUser()); + return DataResult.success(iPage); + } + + @PostMapping("${classname}/checkExists") + @ResponseBody + public Boolean checkExists(@RequestBody ${className}Entity ${classname}){ + LambdaQueryWrapper<${className}Entity> queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(${className}Entity::getId, ${classname}.getId());// 这里换成自己查询的关键条件 + ${className}Entity one = ${classname}Service.getOne(queryWrapper.last("LIMIT 1")); + if(one == null) { + return false; + }else { + return true; + } + } + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/Dao.java.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/Dao.java.vm new file mode 100644 index 000000000..36a5f4563 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/Dao.java.vm @@ -0,0 +1,20 @@ +package ${package}.mapper; + +import ${package}.entity.${className}Entity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +public interface ${className}Mapper extends BaseMapper<${className}Entity> { + + @Select("SELECT count(1) from sys_user") + int selectCountUser(); + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/Dao.xml.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/Dao.xml.vm new file mode 100644 index 000000000..9b44ded64 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/Dao.xml.vm @@ -0,0 +1,14 @@ + + + + + + + +#foreach($column in $columns) + +#end + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/Entity.java.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/Entity.java.vm new file mode 100644 index 000000000..c51dc91f3 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/Entity.java.vm @@ -0,0 +1,60 @@ +package ${package}.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jun.plugin.common.entity.BaseFlowEntity; +import org.springframework.data.annotation.Id; + +#if(${hasBigDecimal}) +#end +import java.io.Serializable; + +import lombok.Data; + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +@Data +@TableName("${tableName}") +public class ${className}Entity extends BaseFlowEntity implements Serializable { + private static final long serialVersionUID = 1L; + +##循环,遍历字段信息 +#foreach ($column in $columns) + /** + * $column.comments + */ +##判断是否主键1 +#if($column.columnName == $pk.columnName) + @Id + @TableId("$column.columnName") + private $column.attrType $column.attrname; +#end +##判断是否主键 +#if($column.columnName != $pk.columnName) +##循环列,新增字段描述备注 + @TableField(value = "$column.columnName" ## +#if($column.columnName.toString().contains("creat") || $column.columnName.toString().contains("deleted")) +, fill = FieldFill.INSERT ## +#elseif($column.columnName.toString().contains("update")) +, fill = FieldFill.INSERT_UPDATE ## +#end ) +##循环列,新增字段描述备注dataType +#if($column.dataType == 'datetime') + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +#elseif($column.dataType == 'date') + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") +#end + private $column.attrType $column.attrname; +#end +##循环,结束 +#end + +} diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/Service.java.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/Service.java.vm new file mode 100644 index 000000000..847833676 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/Service.java.vm @@ -0,0 +1,16 @@ +package ${package}.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import ${package}.entity.${className}Entity; + +/** + * ${comments} + * + * @author ${author} + * @email ${email} + * @date ${datetime} + */ +public interface ${className}Service extends IService<${className}Entity> { + +} + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/ServiceImpl.java.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/ServiceImpl.java.vm new file mode 100644 index 000000000..8d8891f2d --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/ServiceImpl.java.vm @@ -0,0 +1,15 @@ +package ${package}.service.impl; + +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import ${package}.mapper.${className}Mapper; +import ${package}.entity.${className}Entity; +import ${package}.service.${className}Service; + + +@Service("${classname}Service") +public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}Entity> implements ${className}Service { + + +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/controller.java.ftl b/jun_api_online/jun_generator/src/main/resources/templates/vm/controller.java.ftl new file mode 100644 index 000000000..b2429b779 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/controller.java.ftl @@ -0,0 +1,78 @@ +package ${package.Controller}; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.web.bind.annotation.RequestMapping; +import ${package.Entity}.${entity}; +import ${package.Service}.${table.serviceName}; +<#if restControllerStyle> + import org.springframework.web.bind.annotation.RestController; +<#else> + import org.springframework.stereotype.Controller; + +import com.laker.admin.framework.model.Response; +import com.laker.admin.framework.model.PageResponse; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +<#if superControllerClassPackage??> + import ${superControllerClassPackage}; + + +/** +*

+ * ${table.comment!} 前端控制器 + *

+* +* @author ${author} +* @since ${date} +*/ +<#if restControllerStyle> + @RestController +<#else> + @Controller + +@RequestMapping("/${cfg.easyModule}/${cfg.easyMain}") +<#if superControllerClass??> + public class ${table.controllerName} extends ${superControllerClass} { +<#else> + public class ${table.controllerName} { + +@Autowired +${table.serviceName} ${table.serviceName?substring(1)?uncap_first}; + +@GetMapping +@ApiOperation(value = "${table.comment!}分页查询") +public PageResponse pageAll(@RequestParam(required = false, defaultValue = "1") long page, +@RequestParam(required = false, defaultValue = "10") long limit) { +Page roadPage = new Page<>(page, limit); +LambdaQueryWrapper<${table.entityName}> queryWrapper = new QueryWrapper().lambda(); +Page pageList = ${table.serviceName?substring(1)?uncap_first}.page(roadPage, queryWrapper); +return PageResponse.ok(pageList.getRecords(), pageList.getTotal()); +} + +@PostMapping +@ApiOperation(value = "新增或者更新${table.comment!}") +public Response saveOrUpdate(@RequestBody ${table.entityName} param) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.saveOrUpdate(param)); +} + +@GetMapping("/{id}") +@ApiOperation(value = "根据id查询${table.comment!}") +public Response get(@PathVariable Long id) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.getById(id)); +} + +@DeleteMapping("/{id}") +@ApiOperation(value = "根据id删除${table.comment!}") +public Response delete(@PathVariable Long id) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.removeById(id)); +} +@DeleteMapping("/batch/{ids}") +@ApiOperation(value = "根据批量删除ids删除") +public Response batchRemove(@PathVariable Long[] ids) { +return Response.ok(${table.serviceName?substring(1)?uncap_first}.removeByIds(CollUtil.toList(ids))); +} +} \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/list.html.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/list.html.vm new file mode 100644 index 000000000..0bf010994 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/list.html.vm @@ -0,0 +1,604 @@ + + + + + Title + + + + + + + + + + + +
+
+
+
+ 在此你可以对${comments}进行编辑!若有操作及使用问题及常见“问题”:请查看操作手册! +
+
+
+###遍历查询条件 +#foreach($column in $columns) +#if($column.columnName != $pk.columnName && $column.isNull == 'NO') +##跳过循环,新增及修改时间字段,注解支持,不展示 +#if($column.columnName.toString().contains("create") || $column.columnName.toString().contains("deleted") || $column.columnName.toString().contains("update")) + #break +#end +#if($column.dataType == 'datetime') +
+ +
+#else +
+ +
+#end +#end +#end +
+ + +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/menu.sql.vm b/jun_api_online/jun_generator/src/main/resources/templates/vm/menu.sql.vm new file mode 100644 index 000000000..0f66241e7 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/menu.sql.vm @@ -0,0 +1,26 @@ +-- 默认上级目录菜单为其他 +INSERT INTO sys_permission (id, name, pid, url,target, type,order_num, deleted, status,create_time,update_time) + VALUES ('${identity}', '${comments}' ,'54', '/index/${classname}','_self', '2', '910',1, 1,now(),now()); +-- 菜单对应按钮SQL +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${selectId}', '${identity}', '列表' , '${classname}/listByPage','${classname}:list', '3',1, 1,now(),now()); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${addId}', '${identity}', '新增' , '${classname}/add','${classname}:add', '3',1, 1,now(),now()); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${updateId}', '${identity}', '修改' , '${classname}/update','${classname}:update', '3',1, 1,now(),now()); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) + VALUES ('${deleteId}', '${identity}', '删除' , '${classname}/delete','${classname}:delete', '3',1, 1,now(),now()); + +-- INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status,create_time,update_time) +-- VALUES ('${deleteId}11', '${identity}', '提交' , '${classname}/submit','${classname}:submit', '3',1, 1,now(),now()); + + + +select +#foreach($column in $columns) + ${column.columnName} as ${column.attrname}, +#end + 1 as gen +from + ${tableName} +where id != null ; \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/web/add.html.ftl b/jun_api_online/jun_generator/src/main/resources/templates/vm/web/add.html.ftl new file mode 100644 index 000000000..d95915f7c --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/web/add.html.ftl @@ -0,0 +1,63 @@ + + + + + Title + + + +
+
+
+ + <#list table.fields as field> + <#if !field.keyFlag && field.propertyName != 'enable'> +
+ +
+ +
+
+ + <#if field.propertyName == 'enable'> +
+ +
+ + +
+
+ + +
+
+
+
+ + +
+
+
+ + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/web/edit.html.ftl b/jun_api_online/jun_generator/src/main/resources/templates/vm/web/edit.html.ftl new file mode 100644 index 000000000..f72341635 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/web/edit.html.ftl @@ -0,0 +1,74 @@ + + + + + + + +
+
+
+ + <#list table.fields as field> + <#if field.keyFlag > + +
+ +
+ +
+
+ + + <#if !field.keyFlag && field.propertyName != 'enable'> +
+ +
+ +
+
+ + <#if field.propertyName == 'enable'> +
+ +
+ + +
+
+ + + +
+
+
+
+ + +
+
+
+ + + + + + + diff --git a/jun_api_online/jun_generator/src/main/resources/templates/vm/web/main.html.ftl b/jun_api_online/jun_generator/src/main/resources/templates/vm/web/main.html.ftl new file mode 100644 index 000000000..a69beae59 --- /dev/null +++ b/jun_api_online/jun_generator/src/main/resources/templates/vm/web/main.html.ftl @@ -0,0 +1,113 @@ + + + + + ${table.comment} + + + +
+
+
+
+ +
+ +
+ + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + diff --git a/jun_api_online/jun_generator/src/test/java/com/jun/plugin/CodeGeneratorMain.java b/jun_api_online/jun_generator/src/test/java/com/jun/plugin/CodeGeneratorMain.java new file mode 100644 index 000000000..cbf72ddaf --- /dev/null +++ b/jun_api_online/jun_generator/src/test/java/com/jun/plugin/CodeGeneratorMain.java @@ -0,0 +1,53 @@ +package com.jun.plugin; + +import com.alibaba.druid.pool.DruidDataSource; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.jun.plugin.common.generator.GeneratorUtil; +import com.jun.plugin.common.generator.GeneratorUtil; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成器,根据DatabaseMetaData及数据表名称生成对应的Model、Mapper、Service、Controller简化基础代码逻辑开发。 + * @author Wujun + */ +public class CodeGeneratorMain { + + public static void main(String[] args) throws Exception { +// String tables = "res_basc,res_basc_arg,api_config"; +// String tables = "git_user"; +// String tables = "app_infoenvt,app_member,app_datasource,app_git_config,git_user,app_deploy_config"; + Map config = Maps.newHashMap(); + config.put("packageName","com.bjc.lcp.app1234"); +// config.put("project_path","D:/workspace/github/jun_code_generator/jun_code_freemarker/"); + config.put("output_path","D:\\workspace\\github\\jun_api_service\\jun_api_service_online\\plugins\\generator\\"); + config.put("template_path","D:\\workspace\\github\\jun_api_service\\jun_api_service_online\\plugins\\generator\\src\\main\\resources\\templates"); + config.put("userDefaultTemplate","false"); + DruidDataSource ds = new DruidDataSource(); + ds.setUrl("jdbc:mysql://localhost:3306/db_qixing_bk?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC&useInformationSchema=true"); + ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); + ds.setUsername("root"); + ds.setPassword(""); + GeneratorUtil.setDataSource(ds); + GeneratorUtil.setTemplates(getTemplates()); + GeneratorUtil.initConfig(config); + GeneratorUtil.genCode("ext_salgrade"); +// GeneratorUtil.genCode(Arrays.asList(tables.split(",")),getTemplates());; + } + + public static List getTemplates() { + List templates = Lists.newArrayList(); + // ************************************************************************************ + templates.add("code-generator/mybatis-plus-single-v2/controller.java.ftl"); + templates.add("code-generator/mybatis-plus-single-v2/entity.java.ftl"); + templates.add("code-generator/mybatis-plus-single-v2/mapper.java.ftl"); + templates.add("code-generator/mybatis-plus-single-v2/service.java.ftl"); + templates.add("code-generator/mybatis-plus-single-v2/dto.java.ftl"); + templates.add("code-generator/mybatis-plus-single-v2/vo.java.ftl"); + templates.add("code-generator/mybatis-plus-single-v2/service.impl.java.ftl"); + return templates; + } + +} diff --git a/jun_api_online/jun_plugin/pom.xml b/jun_api_online/jun_plugin/pom.xml new file mode 100644 index 000000000..a3ea5cad9 --- /dev/null +++ b/jun_api_online/jun_plugin/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + com.jun.plugin + jun_plugin + pom + 1.0 + 组件模块 + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_plugins/aoplog/pom.xml b/jun_api_online/jun_plugins/aoplog/pom.xml new file mode 100644 index 000000000..de41612ac --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.jun.plugin + aoplog + jar + 1.0 + 日志组件 + + + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + 3.5.3.1 + true + + + + + + com.jun.plugin + common + 1.0 + + + org.springframework.boot + spring-boot-starter-aop + + + + org.apache.shiro + shiro-spring + 1.4.0 + + + com.baomidou + mybatis-plus-extension + 3.5.3.2 + compile + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + \ No newline at end of file diff --git a/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/annotation/LogAnnotation.java b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/annotation/LogAnnotation.java new file mode 100644 index 000000000..a56ffaed5 --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/annotation/LogAnnotation.java @@ -0,0 +1,25 @@ +package com.jun.plugin.aoplog.annotation; + +import java.lang.annotation.*; + +/** + * LogAnnotation + * + * @author wenbin + * @version V1.0 + * @date 2020年3月18日 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LogAnnotation { + /** + * 模块 + */ + String title() default ""; + + /** + * 功能 + */ + String action() default ""; +} diff --git a/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/config/LogAutoConfig.java b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/config/LogAutoConfig.java new file mode 100644 index 000000000..078e9cad8 --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/config/LogAutoConfig.java @@ -0,0 +1,17 @@ +package com.jun.plugin.aoplog.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.aoplog") +@MapperScan(basePackages = "com.jun.plugin.aoplog.mapper") +@ServletComponentScan(basePackages = {"com.jun.plugin.aoplog.compoent"}) +public class LogAutoConfig { +} diff --git a/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/controller/SysLogController.java b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/controller/SysLogController.java new file mode 100644 index 000000000..4ed3ab34f --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/controller/SysLogController.java @@ -0,0 +1,59 @@ +package com.jun.plugin.aoplog.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jun.plugin.aoplog.entity.SysLog; +import com.jun.plugin.aoplog.service.LogService; +import com.jun.plugin.common.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 系统操作日志 + * + * @author wenbin + * @version V1.0 + * @date 2020年3月18日 + */ +@RequestMapping("/sys") +@Api(tags = "系统模块-系统操作日志管理") +@RestController +public class SysLogController { + @Resource + private LogService logService; + + @PostMapping("/logs") + @ApiOperation(value = "分页查询系统操作日志接口") + @RequiresPermissions("sys:log:list") + public Result pageInfo(@RequestBody SysLog vo) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + if (!StringUtils.isEmpty(vo.getUsername())) { + queryWrapper.like(SysLog::getUsername, vo.getUsername()); + } + if (!StringUtils.isEmpty(vo.getOperation())) { + queryWrapper.like(SysLog::getOperation, vo.getOperation()); + } + if (!StringUtils.isEmpty(vo.getStartTime())) { + queryWrapper.gt(SysLog::getCreateTime, vo.getStartTime()); + } + if (!StringUtils.isEmpty(vo.getEndTime())) { + queryWrapper.lt(SysLog::getCreateTime, vo.getEndTime()); + } + queryWrapper.orderByDesc(SysLog::getCreateTime); + return Result.success(logService.page(vo.getQueryPage(), queryWrapper)); + } + + @DeleteMapping("/logs") + @ApiOperation(value = "删除日志接口") + @RequiresPermissions("sys:log:deleted") + public Result deleted(@RequestBody List logIds) { + logService.removeByIds(logIds); + return Result.success(); + } +} diff --git a/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/entity/SysLog.java b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/entity/SysLog.java new file mode 100644 index 000000000..a4557bb61 --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/entity/SysLog.java @@ -0,0 +1,55 @@ +package com.jun.plugin.aoplog.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志 + * + * @author wenbin + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysLog extends BaseEntity implements Serializable { + @TableId + private String id; + + private String userId; + + private String username; + + private String operation; + + private Integer time; + + private String method; + + private String params; + + private String ip; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(exist = false) + private String startTime; + + @TableField(exist = false) + private String endTime; + + public Page getQueryPage(){ + Page page = new Page(getPage(), getLimit()); + return page; + } + +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/mapper/SysLogMapper.java b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/mapper/SysLogMapper.java new file mode 100644 index 000000000..8a6f27f6c --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/mapper/SysLogMapper.java @@ -0,0 +1,14 @@ +package com.jun.plugin.aoplog.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.aoplog.entity.SysLog; + +/** + * 操作日志 Mapper + * + * @author wenbin + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysLogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/service/LogService.java b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/service/LogService.java new file mode 100644 index 000000000..1ab6493a2 --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/service/LogService.java @@ -0,0 +1,14 @@ +package com.jun.plugin.aoplog.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.aoplog.entity.SysLog; + +/** + * 系统日志 + * + * @author wenbin + * @version V1.0 + * @date 2020年3月18日 + */ +public interface LogService extends IService { +} diff --git a/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/service/impl/LogServiceImpl.java b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/service/impl/LogServiceImpl.java new file mode 100644 index 000000000..14792e637 --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/java/com/jun/plugin/aoplog/service/impl/LogServiceImpl.java @@ -0,0 +1,18 @@ +package com.jun.plugin.aoplog.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.aoplog.entity.SysLog; +import com.jun.plugin.aoplog.mapper.SysLogMapper; +import com.jun.plugin.aoplog.service.LogService; +import org.springframework.stereotype.Service; + +/** + * 系统日志 + * + * @author wenbin + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +public class LogServiceImpl extends ServiceImpl implements LogService { +} diff --git a/jun_api_online/jun_plugins/aoplog/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_plugins/aoplog/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..906a48344 --- /dev/null +++ b/jun_api_online/jun_plugins/aoplog/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.aoplog.config.LogAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_plugins/fileservice/pom.xml b/jun_api_online/jun_plugins/fileservice/pom.xml new file mode 100644 index 000000000..5ead35996 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/pom.xml @@ -0,0 +1,158 @@ + + + 4.0.0 + + com.jun.plugin + fileservice + 1.0 + jar + 文件服务 + + + + com.jun.plugin + jun_common + 1.0 + + + + + com.tencentcloudapi + tencentcloud-sdk-java-common + 3.1.838 + + + com.qiniu + qiniu-java-sdk + [7.7.0, 7.7.99] + + + + + + com.qiniu + happy-dns-java + 0.1.6 + test + + + junit + junit + 4.12 + test + + + + com.aliyun.oss + aliyun-sdk-oss + 3.17.1 + + + com.qcloud + cos_api + 4.4 + + + org.slf4j + slf4j-log4j12 + + + junit + junit + + + + + com.google.zxing + javase + 3.2.1 + + + + + com.deepoove + poi-tl + 1.9.1 + + + + com.alibaba + easyexcel + 3.0.5 + + + org.springframework.boot + spring-boot-starter-freemarker + + + + org.springframework.boot + spring-boot-configuration-processor + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/FileAutoConfig.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/FileAutoConfig.java new file mode 100644 index 000000000..0d6997883 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/FileAutoConfig.java @@ -0,0 +1,15 @@ +package com.jun.plugin.file.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.file") +@MapperScan(basePackages = "com.jun.plugin.file.mapper") +public class FileAutoConfig { +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/FileProperties.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/FileProperties.java new file mode 100644 index 000000000..7d296a361 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/FileProperties.java @@ -0,0 +1,55 @@ +package com.jun.plugin.file.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +/** + * 文件上传参数配置类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Primary +@Component +@Data +@ConfigurationProperties(prefix = "file") +public class FileProperties { + + + + private String path; + private String url; + private String accessUrl; + + private String qiniuAccessKey; + private String qiniuBucketName; + private String qiniuDomain; + private String qiniuPrefix; + private String qiniuSecretKey; + private String type; + + + + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + + this.url = url; + + //set accessUrl + if (StringUtils.isEmpty(url)) { + this.accessUrl = null; + } + this.accessUrl = url.substring(url.lastIndexOf("/")) + "/**"; + System.out.println("accessUrl=" + accessUrl); + } + + +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/ResourcesConfig.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/ResourcesConfig.java new file mode 100644 index 000000000..a10af84c8 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/config/ResourcesConfig.java @@ -0,0 +1,63 @@ +//package com.jun.plugin.file.config; +// +//import com.jun.plugin.common.constant.Constants; +//import com.jun.plugin.file.common.comfig.FileUploadProperties; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.web.servlet.config.annotation.*; +// +//import javax.annotation.Resource; +// +///** +// * 通用配置 +// * +// */ +//@Slf4j +//@Configuration +////@EnableConfigurationProperties(FileUploadProperties.class) +//public class ResourcesConfig implements WebMvcConfigurer { +// +// @Resource +// private FileUploadProperties fileUploadProperties; +// +// @Override +// public void addCorsMappings(CorsRegistry registry) { +// WebMvcConfigurer.super.addCorsMappings(registry); +// registry.addMapping("/**").allowedHeaders("*").allowedMethods("POST", "GET", "PUT", "DELETE") +// .allowedOrigins("*"); +// } +// +// /** +// * 默认首页的设置,当输入域名是可以自动跳转到默认指定的网页 +// */ +// @Override +// public void addViewControllers(ViewControllerRegistry registry) { +//// registry.addViewController("/").setViewName("forward:" + indexUrl); +// registry.addViewController("/").setViewName("forward:" + "login.html"); +// } +// +// /** +// * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源 +// */ +// +// +// /** +// * @description: 访问静态文件 +// * @date: 2021/4/15 +// */ +// @Override +// public void addResourceHandlers(ResourceHandlerRegistry registry) { +// /** 本地文件上传路径 */ +// registry.addResourceHandler("/files/**").addResourceLocations("file:" + fileUploadProperties.getPath() + "/"); +// +// /** 文件下载映射配置,同下 */ +// registry.addResourceHandler(fileUploadProperties.getAccessUrl()).addResourceLocations("file:" + fileUploadProperties.getPath()); +// +// log.debug("System.getProperty(\"user.dir\")"); +// // 访问路径 +// registry.addResourceHandler("/api/upload/**") +// // 映射真实路径 +// .addResourceLocations("file:" + System.getProperty("user.dir") + "/");// 必须加"/",不然映射不到 +// } +// +//} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/FileControl.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/FileControl.java new file mode 100644 index 000000000..db427aa3b --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/FileControl.java @@ -0,0 +1,129 @@ +package com.jun.plugin.file.controller; + + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.jun.plugin.file.service.FileService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +@Controller +@RequestMapping(value = "/file") +public class FileControl { + @Autowired + private FileService fileService; + + @RequestMapping(value = "/Login") + public String index() { + return "login"; + } + + //http://localhost:8080/public//Qrcode?url=baidu.com&name=wujun + @RequestMapping(value = "/Qrcode") + public void test(HttpServletResponse response,HttpServletRequest request) throws IOException, WriterException { + //生成二维码 + int width = 150; + int height = 150; + String url = request.getParameter("url"); + String name = request.getParameter("name"); + System.out.println(url+"&name="+name); + String format = "png"; + String content = url+"&name="+name; + ServletOutputStream out = response.getOutputStream(); + Map config = new HashMap<>(); + config.put(EncodeHintType.CHARACTER_SET,"UTF-8"); + config.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + config.put(EncodeHintType.MARGIN, 0); + BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,width,height,config); + MatrixToImageWriter.writeToStream(bitMatrix,format,out); + System.out.println("二维码生成完毕,已经输出到页面中。"); + } + +// @RequestMapping(value = "/register") +// @ResponseBody +// public String register(HttpServletRequest request) { +//// 获取账号密码 +// String name = request.getParameter("name"); +// String pass = request.getParameter("pass"); +// //创建一个用户对象 +// User user = new User(name, pass); +// String s = registerService.addOne(user); +// return s; +// } + +// @RequestMapping(value = "/login") +// @ResponseBody +// public String login(HttpServletRequest request) { +// // 获取账号密码 +// String name = request.getParameter("name"); +// String pass = request.getParameter("pass"); +// User user = new User(name, pass); +// String s = loginService.loginService(user); +// return s; +// } + + + //文件上传 + @RequestMapping(value = "/upload") + @ResponseBody + public String upload(HttpServletRequest request, HttpServletResponse response) { + String s = fileService.uploadFile(request); + HashMap map = new HashMap<>(); + map.put("result", s); + //转为json + JSONObject jsonObject = new JSONObject(map); + String res = jsonObject.toString(); + return res; + } + + //文件列表 + @RequestMapping(value = "/filedir") + @ResponseBody + public JSONObject filedir(HttpServletRequest request) { + String res = fileService.fileList(request); + JSONObject jsonObject = JSON.parseObject(res); + jsonObject.remove("message"); + return jsonObject; + } + @RequestMapping(value = "/filelist") + @ResponseBody + public JSONObject filelist(HttpServletRequest request) { + String res = fileService.fileList(request); + JSONObject jsonObject = JSON.parseObject(res); + jsonObject.remove("message"); + return jsonObject; + } +// 文件下载 + @RequestMapping(value = "/filedown") + public void filedown(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException { + fileService.fileDown(request, response); + } + //文件删除 + @RequestMapping(value = "/filedel") + @ResponseBody + public String filedel(HttpServletRequest request,HttpServletResponse response){ + String msg = ""; + msg = fileService.fileDel(request,response); + return msg; + + } +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/QiniuController.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/QiniuController.java new file mode 100644 index 000000000..a68198e87 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/QiniuController.java @@ -0,0 +1,71 @@ +package com.jun.plugin.file.controller; + +import java.io.File; + +import javax.security.auth.message.AuthException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.jun.plugin.file.utils.FileUtils; +import com.jun.plugin.file.utils.QiniuUtils; +import com.jun.plugin.file.utils.ExecuteResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +@Controller +@RequestMapping(value = "") +public class QiniuController { + + private static Logger logger = LoggerFactory.getLogger(QiniuController.class); + + + @RequestMapping("qiniuCommon") + private String qiniuCommon(HttpServletRequest request){ + return "qiniuCommon"; + } + + + /** + * @param request + * @param multipartFile + * @return + */ + @RequestMapping(value = "/qiniuUpload", method = RequestMethod.POST) + @ResponseBody + public String qiniuUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam("imagefile") MultipartFile multipartFile) { + ExecuteResult executeResult = new ExecuteResult(); + + QiniuUtils QiniuUtils = new QiniuUtils(); + try { + /** + * 上传文件扩展名 + */ + String filenameExtension = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."), multipartFile.getOriginalFilename().length()); + + /** + * MultipartFile 转 file 类型 + */ + File file = FileUtils.multipartToFile(multipartFile); + + /** + * 七牛云文件上传 服务 file文件 以及 文件扩展名 + */ + executeResult = QiniuUtils.uploadFile2(file, filenameExtension); + if (!executeResult.isSuccess()) { + return "失败" + executeResult.getErrorMessages(); + } + + } catch (AuthException e) { + logger.error("AuthException", e); + } + + return executeResult.getResult(); + } + +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/SysFilesController.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/SysFilesController.java new file mode 100644 index 000000000..7e093dbca --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/controller/SysFilesController.java @@ -0,0 +1,279 @@ +package com.jun.plugin.file.controller; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.data.PictureRenderData; +import com.jun.plugin.common.Result; +import com.jun.plugin.file.config.FileProperties; +import com.jun.plugin.file.utils.FileUtils; +import com.jun.plugin.file.entity.SysFilesEntity; +import com.jun.plugin.file.service.SysFilesService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.ResourceLoader; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 文件上传 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RestController +@RequestMapping("/sysFiles") +@Api(tags = "文件管理") +@Slf4j +public class SysFilesController { + @Resource + private SysFilesService sysFilesService; + + + @Autowired + FileProperties fileUploadProperties; + + @ApiOperation(value = "新增") + @PostMapping("/upload") + //@RequiresPermissions(value = { "sysFiles:add", "sysContent:update", "sysContent:add" }, logical = Logical.OR) + public Result add(@RequestParam(value = "file") MultipartFile file, @RequestParam(value = "bizid",required = false) String bizid, + @RequestParam(value = "biztype",required = false) String biztype) { + log.info(biztype); + log.info(bizid); + // 判断文件是否空 + if (file == null || file.getOriginalFilename() == null + || "".equalsIgnoreCase(file.getOriginalFilename().trim())) { + return Result.fail("文件为空"); + } + return sysFilesService.saveFile(file, biztype, bizid); + } + + @ApiOperation(value = "删除") + @DeleteMapping("/delete") + //@RequiresPermissions("sysFiles:delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + sysFilesService.removeByIdsAndFiles(ids); + return Result.success(); + } + +// @ApiOperation(value = "查询分页数据") +// @PostMapping("/listByPage") +// //@RequiresPermissions("sysFiles:list") +// public Result findListByPage(@RequestBody SysFilesEntity sysFiles) { +// Page page = new Page(sysFiles.getPage(), sysFiles.getLimit()); +// IPage iPage = sysFilesService.page(page, +// Wrappers.lambdaQuery().orderByDesc(SysFilesEntity::getCreateDate)); +// return Result.success(iPage); +// } + +// @SuppressWarnings({ "rawtypes", "unchecked" }) +// @ApiOperation(value = "查询分页数据") +// @PostMapping("/listByPageUser") +// //@RequiresPermissions("sysFiles:list") +// public Result listByPageUser(@RequestBody SysFilesEntity sysFiles) { +// Page page = new Page(sysFiles.getPage(), sysFiles.getLimit()); +// IPage iPage = sysFilesService.page(page, +// Wrappers.lambdaQuery() +// .eq(SysFilesEntity::getRefBizid, sysFiles.getRefBizid()) +// .eq(SysFilesEntity::getDictBiztype, sysFiles.getDictBiztype()) +// .orderByDesc(SysFilesEntity::getCreateDate)); +// return Result.success(iPage); +// } + + + + + @ApiOperation(value = "生成简历") + @PostMapping("/genResume") +// @RequiresPermissions(value = { "sysFiles:add", "sysContent:update", "sysContent:add" }, logical = Logical.OR) + public Result genResume(@RequestParam(value = "bizid",required = false) String bizid, + @RequestParam(value = "username",required = false) String username, + @RequestParam(value = "realName",required = false) String realName, + @RequestParam(value = "deptName",required = false) String deptName, + @RequestParam(value = "biztype",required = false) String biztype) throws IOException { + Map resume = new HashMap<>(); + Map data = new HashMap<>(); + ResourceLoader resourceLoader = new DefaultResourceLoader(); + org.springframework.core.io.Resource resource1 = resourceLoader.getResource("classpath:files/"+"logo_resume.jpg"); + data.put("pictures", new PictureRenderData(100, 120, resource1.getFile().getAbsolutePath())); + //SysUser user = userMapper.getUserByName(username); + Map m = null;//JSON.parseObject(JSON.toJSONString(user), Map.class); + data.putAll(m); + List> list11=new ArrayList<>(); + System.err.println(JSON.toJSON(data)); + list11.add(data); + resume.put("resume",list11); + org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:files/"+"简历模板2.docx"); + InputStream inputStream =resource.getInputStream() ; + XWPFTemplate template = XWPFTemplate.compile(inputStream).render( resume); + String newFile = fileUploadProperties.getPath()+realName+"简历"+username+".docx"; + File file = new File(newFile); + FileUtils.createFile(file); + template.writeAndClose(new FileOutputStream(newFile)); + log.info(bizid); + // 判断文件是否空 + if (file == null) { + return Result.fail("文件为空"); + } + return sysFilesService.saveFile(file, biztype, bizid); + } + + + + @SuppressWarnings("unchecked") + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPage") +// @RequiresPermissions("sysFiles:list") + public Result findListByPage(@RequestBody SysFilesEntity sysFiles) { + Page page = new Page(sysFiles.getPage(), sysFiles.getLimit()); + IPage iPage = sysFilesService.page(page, + Wrappers.lambdaQuery().orderByDesc(SysFilesEntity::getCreateDate)); + List records = iPage.getRecords(); + String userid = "sessionService.getCurrentUsername()"; + records.forEach(item -> { + if(userid.equalsIgnoreCase(item.getCreator())) { + item.setIsOwner(1); + } + }); + return Result.success(iPage); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPageUser") +// @RequiresPermissions("sysFiles:list") + public Result listByPageUser(@RequestBody SysFilesEntity sysFiles) { + Page page = new Page(sysFiles.getPage(), sysFiles.getLimit()); + IPage iPage = sysFilesService.page(page, + Wrappers.lambdaQuery() + .eq(SysFilesEntity::getRefBizid, sysFiles.getRefBizid()) +// .eq(SysFilesEntity::getDictBiztype, sysFiles.getDictBiztype()) + .orderByDesc(SysFilesEntity::getCreateDate)); + List records = iPage.getRecords(); + String userid = "sessionService.getCurrentUsername()"; + records.forEach(item -> { + if(userid.equalsIgnoreCase(item.getCreator())) { + item.setIsOwner(1); + } + }); + return Result.success(iPage); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPageUserProjectID") + public Result listByPageUserProjectID(@RequestBody SysFilesEntity sysFiles) { + String pid = sysFiles.getRefBizid(); + Page page = new Page(sysFiles.getPage(), sysFiles.getLimit()); + String tmpSQL = getProjectFilesRefIDS(pid); + IPage iPage = sysFilesService.page(page, + Wrappers.lambdaQuery() +// .eq(SysFilesEntity::getRefBizid, sysFiles.getRefBizid()) + .inSql(true, SysFilesEntity::getRefBizid, tmpSQL ) +// .eq(SysFilesEntity::getRefBizid, sysFiles.getRefBizid()) + .orderByDesc(SysFilesEntity::getCreateDate)); + List records = iPage.getRecords(); + String userid = "sessionService.getCurrentUsername()"; + records.forEach(item -> { + if(userid.equalsIgnoreCase(item.getCreator())) { + item.setIsOwner(1); + } + }); + return Result.success(iPage); + } + + @ApiOperation(value = "查询userLogo") + @PostMapping("/getImgByBizid") + public Result getImgByBizid(@RequestBody SysFilesEntity sysFiles) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysFilesEntity::getDictBiztype,sysFiles.getDictBiztype()); + queryWrapper.eq(SysFilesEntity::getRefBizid,sysFiles.getRefBizid()); + queryWrapper.orderByDesc(SysFilesEntity::getCreateDate); + queryWrapper.last(" limit 1 "); + List list = sysFilesService.list(queryWrapper); + String userid = "sessionService.getCurrentUsername()"; + if(list.size()>0){ + return Result.success(list.get(0)); + }else{ + return Result.success(); + } + } + + + private String getProjectFilesRefIDS(String pid) { + String tmpSQL = " select pjc.id -- ,pjc.*\r\n" + + " from pj_project t\r\n" + + " left join pj_contract pjc on t.project_code=pjc.refid_project_code_hide\r\n" + + " where t.id='"+pid+"' \r\n" + + "\r\n union SELECT '"+pid+"' from pj_project" + + " union \r\n" + + " select pjp.id -- ,pjp.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_plan pjp on t.project_code=pjp.ref_project_code\r\n" + + " where t.id='"+pid+"' \r\n" + + "\r\n" + + " union \r\n" + + " select pjd.id -- ,pjd.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_draft pjd on t.project_code=pjd.ref_project_code\r\n" + + " where t.id='"+pid+"' \r\n" + + "\r\n" + + " union \r\n" + + " select pjr.id -- ,pjr.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_recheck pjr on t.project_code=pjr.ref_pcode\r\n" + + " where t.id='"+pid+"' \r\n" + + " union \r\n" + + " select pja.id -- ,pja.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_appraise pja on t.project_code=pja.ref_project_code\r\n" + + " where t.id='"+pid+"' \r\n" + + " union \r\n" + + " select pji.id -- ,pji.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_invoice pji on t.project_code=pji.ref_project_code\r\n" + + " where t.id='"+pid+"' \r\n" + + " union \r\n" + + " select pjm.id -- ,pjm.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_member pjm on t.project_code=pjm.ref_project_code\r\n" + + " where t.id='"+pid+"' \r\n" + + " union \r\n" + + " select pjt.id -- ,pjt.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_prodess_task pjt on t.project_code=pjt.ref_project_code\r\n" + + " where t.id='"+pid+"' \r\n" + + " union \r\n" + + " select pjr1.id -- ,pjr1.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_report pjr1 on t.project_code=pjr1.ref_project_code\r\n" + + " where t.id='"+pid+"' \r\n" + + " union \r\n" + + " select pjrn.id -- ,pjrn.*\r\n" + + " from pj_project t\r\n" + + " left join pj_project_reportnumber pjrn on t.project_code=pjrn.ref_reportnumber_code\r\n" + + " where t.id='"+pid+"' "; + return tmpSQL; + } + +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/entity/SysFilesEntity.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/entity/SysFilesEntity.java new file mode 100644 index 000000000..1f514d575 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/entity/SysFilesEntity.java @@ -0,0 +1,71 @@ +package com.jun.plugin.file.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文件上传 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_files") +public class SysFilesEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * URL地址 + */ + @TableField("url") + private String url; + + /** + * 创建时间 + */ + @TableField(value = "create_date", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createDate; + + @TableField("file_name") + private String fileName; + + @TableField("file_path") + private String filePath; + + @TableField("dict_biztype") + private String dictBiztype; + + @TableField("ref_bizid") + private String refBizid; + + /** + * 创建人 + */ + @TableField(value = "creator", fill = FieldFill.INSERT) + private String creator; + + @TableField("file_size") + private String fileSize; + + + +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/mapper/SysFilesMapper.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/mapper/SysFilesMapper.java new file mode 100644 index 000000000..f48c07782 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/mapper/SysFilesMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.file.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.file.entity.SysFilesEntity; + +/** + * 文件上传 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysFilesMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/FileService.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/FileService.java new file mode 100644 index 000000000..be9f576b9 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/FileService.java @@ -0,0 +1,12 @@ +package com.jun.plugin.file.service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; + +public interface FileService { + String uploadFile(HttpServletRequest request); + String fileList(HttpServletRequest request); + void fileDown(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException; + String fileDel(HttpServletRequest request,HttpServletResponse response); +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/SysFilesService.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/SysFilesService.java new file mode 100644 index 000000000..4fcc5f9a5 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/SysFilesService.java @@ -0,0 +1,37 @@ +package com.jun.plugin.file.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.common.Result; +import com.jun.plugin.file.entity.SysFilesEntity; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; + +/** + * 文件上传 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysFilesService extends IService { + + Result saveFile(MultipartFile file); + + void removeByIdsAndFiles(List ids); + + Result saveFile(MultipartFile file, String biztype, String bizid); + + Result saveOssFile(MultipartFile file); + + + + Result saveFile(File file, String biztype, String bizid); + + + Result saveFile(File file); + +} + diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/impl/FileServiceImpl.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/impl/FileServiceImpl.java new file mode 100644 index 000000000..843a72973 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/impl/FileServiceImpl.java @@ -0,0 +1,363 @@ +package com.jun.plugin.file.service.impl; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; + +import javax.annotation.Resource; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.jun.plugin.common.utils.DateUtils; +import com.jun.plugin.file.config.FileProperties; +import com.jun.plugin.file.entity.SysFilesEntity; +import com.jun.plugin.file.mapper.SysFilesMapper; +import com.jun.plugin.file.service.FileService; +import com.jun.plugin.file.utils.QiniuUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.util.WebUtils; + +import com.alibaba.fastjson2.JSONObject; + +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Service +public class FileServiceImpl implements FileService { + +// @Value("${filepath}") + @Value("${file.path}") + private String file_root; + + @Resource + private FileProperties fileUploadProperties; + + @Resource + SysFilesMapper sysFilesMapper; + + + @Override + public String uploadFile(HttpServletRequest request) { + String messagee = ""; + MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class); + MultipartFile file = multipartRequest.getFile("file"); + String filename = multipartRequest.getFile("file").getOriginalFilename(); + String username = multipartRequest.getParameter("name"); + if(!username.equals("")){ + //完整的文件路径 + File file1 = new File(file_root + username); + //文件路径不存在则刷新页面创建路径 + if(!file1.exists()){ + if(!file1.exists()){ + file1.mkdirs(); + log.info("用户:{}创建了文件夹{}",username,file); + } + // messagee="请刷新再上传"; + + } + //文件是否存在 + File file2 = new File(file_root + username+File.separator, filename); + if(file2.exists()){ + messagee = "文件已存在,无需上传"; + }else { + try{ + file.transferTo(file2); + log.info("用户:{}上传文件{}成功",username,filename); + messagee = "上传成功"; + } catch (IOException e) { + messagee = "上传失败"; + log.info("用户:{}上传文件{}失败",username,filename); + e.printStackTrace(); + } + } + }else { + Cookie[] cookies = request.getCookies(); + String username1 = ""; + if(cookies != null){ + //找到cookie,作为文件上传路径 + for (int i = 0; i <= cookies.length-1; i++) { + if(cookies[i].getName().equals("Junior_file")){ + username1 = cookies[i].getValue(); + break; + }else { + continue; + } + } + File file1 = new File(file_root + username1); + if(!file1.exists()){ + messagee = "请刷新再上传"; + }else { + File file2 = new File(file_root + username1+File.separator, filename); + if(file2.exists()){ + messagee = "文件已存在,无需上传"; + }else { + try { + file.transferTo(file2); + + saveSysFile(file2, filename, file2.getAbsolutePath(),username,"user",username); + messagee = "上传成功"; + log.info("临时用户上传文件{}成功",filename); + } catch (IOException e) { + messagee = "上传失败"; + log.info("临时用户上传文件{}失败",filename); + e.printStackTrace(); + } + } + } + }else { + messagee = "请刷新再上传"; + } + } + return messagee; + } + + private void saveSysFile(File file,String originalFilename,String newFilePathName, String username,String biztype,String bizid) throws IOException { + String createTime = DateUtils.dateTimeNow(); + String newPath = fileUploadProperties.getPath() + createTime + File.separator; + File uploadDirectory = new File(newPath); + if (uploadDirectory.exists()) { + if (!uploadDirectory.isDirectory()) { + uploadDirectory.delete(); + } + } else { + uploadDirectory.mkdir(); + } + String fileName = originalFilename; + String fileNameNew = QiniuUtils.getFileNameByDate(username,fileName); + // QiniuUtils.uploadFile(file, fileNameNew); + String downUrl = QiniuUtils.uploadFileV2(file, fileNameNew); + String URL = QiniuUtils.domain + "/" + fileName; + String url = fileUploadProperties.getUrl() + "/" + createTime + "/" + fileNameNew; + String filesize = QiniuUtils.FormetFileSize(file.length()); + this.saveFilesEntity(originalFilename, file.getAbsolutePath(),url,filesize,biztype, bizid); + } + + private void saveFilesEntity(String fileName, String newFilePathName, String url,String filesize, String biztype, String bizid) { + SysFilesEntity entity = new SysFilesEntity(); + entity.setFileName(fileName); + entity.setFilePath(newFilePathName); + entity.setUrl(url); + entity.setFileSize(filesize); + entity.setDictBiztype(biztype); + entity.setRefBizid(bizid); + sysFilesMapper.insert(entity); + } + + + //文件下载 + @Override + public void fileDown(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException { + String msg = ""; + //获得文件名 + String filename = request.getParameter("filename"); +// 获得文件路径 + String filepath = request.getParameter("name"); + if(!filepath.equals("")){ + File file = new File(file_root + filepath + File.separator+filename); + msg = fileDown(file, response, filename,filepath); + }else { + String filepath1 = getMyCookie(request); + File file = new File(file_root + filepath1 + File.separator + filename); + msg = fileDown(file, response, filename,filepath1); + } + + System.out.println(msg); + } + + //文件删除 + @Override + public String fileDel(HttpServletRequest request,HttpServletResponse response) { + String msg = ""; + String filename = request.getParameter("filename"); + String path = request.getParameter("name"); + if(!path.equals("")){ + File file = new File(file_root + path + File.separator + filename); + msg = fileDelOpt(file); + log.info("用户{}删除文件{}成功",path,filename); + }else { + String path1 = getMyCookie(request); + File file = new File(file_root + path1 + File.separator + filename); + msg = fileDelOpt(file); + log.info("临时用户删除文件{}成功",path,filename); + } + return msg; + } + + @Override + public String fileList(HttpServletRequest request) { + String message = ""; + ArrayList list = new ArrayList<>(); + String username = request.getParameter("name"); + if(!username.equals("")){ + //完整的文件路径 + File file1 = new File(file_root + username); + //文件路径不存在则刷新页面创建路径 + if(!file1.exists()){ + message="文件错误"; + }else { + File[] files = file1.listFiles(); + for (int i = 0; i <=files.length-1; i++) { + HashMap map = new HashMap<>(); + map.put("filename",files[i].getName()); + map.put("filetime",getModifiedTime(files[i])); + map.put("filesize",String.valueOf((((float)Math.round((getFileSize(files[i])/1048576)*100))/100))+" MB"); + list.add(map); + } + message = "文件存在"; + } + }else { + Cookie[] cookies = request.getCookies(); + String username1 = ""; + if(cookies != null){ + //找到cookie,作为文件上传路径 + for (int i = 0; i <= cookies.length-1; i++) { + if(cookies[i].getName().equals("Junior_file")){ + username1 = cookies[i].getValue(); + break; + }else { + continue; + } + } + File file = new File(file_root + username1); + if(!file.exists()){ + message="文件错误"; + }else { + File[] files = file.listFiles(); + for (int i = 0; i <=files.length-1; i++) { + HashMap map = new HashMap<>(); + map.put("filename",files[i].getName()); + map.put("filetime",getModifiedTime(files[i])); + map.put("filesize",String.valueOf((((float)Math.round((getFileSize(files[i])/1048576)*100))/100))+" MB"); + list.add(map); + } + message = "文件存在"; + } + }else { + message="文件错误"; + } + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("message",message); + if(message == "文件存在"){ + jsonObject.put("code",0); + }else { + jsonObject.put("code",404); + } + jsonObject.put("data",list); + String res = jsonObject.toJSONString(); + return res; + } + + //获取文件大小 + private static float getFileSize(File f) { + InputStream fis = null; + try { + fis = new FileInputStream(f); + return fis.available(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return 0; + } + + //获取文件创建时间 + public static String getModifiedTime(File f){ + Calendar cal = Calendar.getInstance(); + long time = f.lastModified(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + cal.setTimeInMillis(time); + //输出:修改时间[2] 2009-08-17 10:32:38 + return formatter.format(cal.getTime()); + } + + //获取cookie + public static String getMyCookie(HttpServletRequest request) { + String cookie = ""; + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + //找到cookie,作为文件上传路径 + for (int i = 0; i <= cookies.length - 1; i++) { + if (cookies[i].getName().equals("Junior_file")) { + cookie = cookies[i].getValue(); + break; + } else { + continue; + } + } + } + return cookie; + } + + //文件下载操作 + public static String fileDown(File file,HttpServletResponse response,String filename,String filepath) throws UnsupportedEncodingException { + String msg = ""; + if(file.exists()){ + //设置响应体,响应头 + response.setContentType("application/force-download;charset=UTF-8"); + //文件中含有逗号等,需要将文件名用引号包起来 + response.addHeader("Content-Disposition", "attachment;fileName=" + "\""+ URLEncoder.encode(filename,"utf-8") +"\""); + +// 通过文件流下载 + byte[] buffer = new byte[1024]; + try (FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis)) { + OutputStream os = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + log.info("用户:{}下载文件{}成功",filepath,filename); + msg = "下载成功"; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + }else { + log.info("临时用户下载文件{}失败",filename); + msg = "下载失败"; + } + return msg; + } + + //文件删除操作 + public static String fileDelOpt(File file){ + String msg = ""; + if(file.exists()){ + try { + file.delete(); + msg = "文件删除成功"; + }catch (Exception e){ + e.printStackTrace(); + msg = "文件删除错误"; + } + }else { + msg = "文件删除错误"; + } + return msg; + } +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/impl/SysFilesServiceImpl.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/impl/SysFilesServiceImpl.java new file mode 100644 index 000000000..23e634a38 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/service/impl/SysFilesServiceImpl.java @@ -0,0 +1,250 @@ +package com.jun.plugin.file.service.impl; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.annotation.Resource; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.utils.DateUtils; +import com.jun.plugin.file.entity.SysFilesEntity; +import com.jun.plugin.file.mapper.SysFilesMapper; +import com.jun.plugin.file.utils.QiniuUtils; +import org.apache.commons.io.FileUtils; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.file.config.FileProperties; +import com.jun.plugin.file.service.SysFilesService; + +/** + * 文件上传 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EnableConfigurationProperties(FileProperties.class) +@Service("sysFilesService") +public class SysFilesServiceImpl extends ServiceImpl implements SysFilesService { + @Resource + private FileProperties fileUploadProperties; + + @Resource + private SysFilesMapper sysFilesMapper; + + private static final ThreadLocal> mapTmp = new ThreadLocal(); + + @Override + public Result saveFile(MultipartFile file) { + //存储文件夹 +// String createTime = DateUtils.format(new Date(), DateUtils.DATEPATTERN); + String createTime = DateUtils.dateTimeNow(); + String newPath = fileUploadProperties.getPath() + createTime + File.separator; + File uploadDirectory = new File(newPath); + if (uploadDirectory.exists()) { + if (!uploadDirectory.isDirectory()) { + uploadDirectory.delete(); + } + } else { + uploadDirectory.mkdir(); + } + try { + String fileName = file.getOriginalFilename(); + //id与filename保持一直,删除文件 + String fileNameNew = UUID.randomUUID().toString().replace("-", "") + getFileType(fileName); + String newFilePathName = newPath + fileNameNew; + String url = fileUploadProperties.getUrl() + "/" + createTime + "/" + fileNameNew; + //创建输出文件对象 + File outFile = new File(newFilePathName); + //拷贝文件到输出文件对象 + FileUtils.copyInputStreamToFile(file.getInputStream(), outFile); + //保存文件记录 + saveFilesEntity(fileName, newFilePathName, url, "filemanager", "",""); + Map resultMap = new HashMap<>(); + resultMap.put("src", url); + return Result.success(resultMap); + } catch (Exception e) { + throw new BusinessException("上传文件失败"); + } + } + + + private void saveFilesEntity(String fileName, String newFilePathName, String url,String filesize, String biztype, String bizid) { + SysFilesEntity entity = new SysFilesEntity(); + entity.setFileName(fileName); + entity.setFilePath(newFilePathName); + entity.setUrl(url); + entity.setFileSize(filesize); + entity.setDictBiztype(biztype); + entity.setRefBizid(bizid); + this.save(entity); + } + + + + + + + +// /** +// * 获取文件后缀名 +// * +// * @param fileName 文件名 +// * @return 后缀名 +// */ +// private String getFileType(String fileName) { +// if (fileName != null && fileName.contains(".")) { +// return fileName.substring(fileName.lastIndexOf(".")); +// } +// return ""; +// } + + @Override + public Result saveFile(MultipartFile file, String biztype, String bizid) { + Map map = Maps.newHashMap(); + map.put("biztype",biztype); + map.put("bizid", bizid); + mapTmp.set(map); + this.saveOssFile(file); + return this.saveFile(file); + } + +// @Override +// public Result saveFile(MultipartFile file, String biztype, String bizid) { +// mapTmp.set(ImmutableMap.builder().put("biztype",biztype).put("bizid", bizid).build()); +//// this.saveOssFile(file); +// return this.saveOssFile(file); +// } + + + + + +// private static final ThreadLocal> mapTmp = new ThreadLocal(); + + + + +// @Override +// @Deprecated +// public Result saveOssFile(MultipartFile file) { +// try { +// String fileName = file.getOriginalFilename(); +// String fileNameNew = QiniuUtils.getFileNameByDate(fileName); +// QiniuUtils.uploadFile(file, fileNameNew); +// String URL = QiniuUtils.domain + "/" + fileName; +// String downUrl = QiniuUtils.downloadURL(fileNameNew);; +// //保存文件记录 +// saveFilesEntity(fileNameNew, URL, downUrl, "filemanager", ""); +// Map resultMap = new HashMap<>(); +// resultMap.put("src", URL); +// return Result.success(resultMap); +// } catch (Exception e) { +// throw new BusinessException("上传文件失败"); +// } +// } + + + @Override + public Result saveOssFile(MultipartFile file) { + try { + String username = "sessionService.getCurrentUsername()"; + String fileName = file.getOriginalFilename(); + String fileNameNew = QiniuUtils.getFileNameByDate(username,fileName); +// QiniuUtils.uploadFile(file, fileNameNew); + String downUrl = QiniuUtils.uploadFileV2(file, fileNameNew); + String URL = QiniuUtils.domain + "/" + fileName; +// String downUrl = QiniuUtils.download(fileNameNew);; + //保存文件记录 + saveFilesEntity(fileNameNew, downUrl, "filemanager", QiniuUtils.FormetFileSize(file.getSize()),"",""); + Map resultMap = new HashMap<>(); + resultMap.put("src", downUrl); + return Result.success(resultMap); + } catch (Exception e) { + e.printStackTrace(); + throw new BusinessException("上传文件失败"); + } + } + @Override + public Result saveFile(File file) { + try { + String username = "sessionService.getCurrentUsername()"; + String fileName = file.getName(); + String fileNameNew = QiniuUtils.getFileNameByDate(username,fileName); +// QiniuUtils.uploadFile(file, fileNameNew); + String downUrl = QiniuUtils.uploadFileV2(file, fileNameNew); + String URL = QiniuUtils.domain + "/" + fileName; +// String downUrl = QiniuUtils.download(fileNameNew);; + //保存文件记录 + saveFilesEntity(fileNameNew, downUrl, "filemanager", QiniuUtils.FormetFileSize(FileUtils.sizeOfAsBigInteger(file).longValue()),"",""); + Map resultMap = new HashMap<>(); + resultMap.put("src", downUrl); + return Result.success(resultMap); + } catch (Exception e) { + e.printStackTrace(); + throw new BusinessException("上传文件失败"); + } + } + + + @Override + public void removeByIdsAndFiles(List ids) { + List list = this.listByIds(ids); + list.forEach(entity -> { + QiniuUtils.deleteFileFromQiniu(entity.getFileName()); + //如果之前的文件存在,删除 + File file = new File(entity.getFilePath()); + if (file.exists()) { + file.delete(); + } + }); + this.removeByIds(ids); + + } + +// @Override +// public void removeByIdsAndFiles(List ids) { +// List list = this.listByIds(ids); +// list.forEach(entity -> { +// //如果之前的文件存在,删除 +// File file = new File(entity.getFilePath()); +// if (file.exists()) { +// file.delete(); +// } +// }); +// this.removeByIds(ids); +// +// } + + /** + * 获取文件后缀名 + * + * @param fileName 文件名 + * @return 后缀名 + */ + private String getFileType(String fileName) { + if (fileName != null && fileName.contains(".")) { + return fileName.substring(fileName.lastIndexOf(".")); + } + return ""; + } + + + + @Override + public Result saveFile(File file, String biztype, String bizid) { + mapTmp.set(ImmutableMap.builder().put("biztype",biztype).put("bizid", bizid).build()); +// this.saveOssFile(file); + return this.saveFile(file); + } + +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/ExecuteResult.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/ExecuteResult.java new file mode 100644 index 000000000..e48d186d3 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/ExecuteResult.java @@ -0,0 +1,97 @@ +package com.jun.plugin.file.utils; + + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by kzyuan on 2017/4/5. + * 业务类执行结果包装类 + * @param + */ +public class ExecuteResult implements Serializable { + private static final long serialVersionUID = 7365417829056921958L; + /** + * 返回结果数据 + */ + private T result; + /** + * 成功提示消息 + */ + private String successMessage; + /** + * 普通的错误信息 + */ + private List errorMessages = new ArrayList(); + /** + * 字段错误信息-以key-value的形式出现 + */ + private Map fieldErrors = new HashMap(); + /** + * 警告信息 + */ + private List warningMessages = new ArrayList(); + + public String getSuccessMessage() { + return successMessage; + } + public void setSuccessMessage(String successMessage) { + this.successMessage = successMessage; + } + /** + * 判断当前执行结果是否正确,如果errorMessages和fieldErrors都为空,则无错 + * @return + */ + public boolean isSuccess() { + return errorMessages.isEmpty() && fieldErrors.isEmpty(); + } + public T getResult() { + return result; + } + public void setResult(T result) { + this.result = result; + } + public List getErrorMessages() { + return errorMessages; + } + public void setErrorMessages(List errorMessages) { + this.errorMessages = errorMessages; + } + public Map getFieldErrors() { + return fieldErrors; + } + public void setFieldErrors(Map fieldErrors) { + this.fieldErrors = fieldErrors; + } + public List getWarningMessages() { + return warningMessages; + } + public void setWarningMessages(List warningMessages) { + this.warningMessages = warningMessages; + } + /** + * 添加一条错误消息到列表中 + * @param errorMessage + */ + public void addErrorMessage(String errorMessage) { + this.errorMessages.add(errorMessage); + } + /** + * 添加一条字段错误信息到列表中 + * @param field 字段名称-key + * @param errorMessage 该字段对应的错误信息-value + */ + public void addFieldError(String field, String errorMessage) { + this.fieldErrors.put(field, errorMessage); + } + /** + * 添加一条警告信息到列表中 + * @param warningMessage + */ + public void addWarningMessage(String warningMessage) { + this.warningMessages.add(warningMessage); + } +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/FileUtils.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/FileUtils.java new file mode 100644 index 000000000..a82384081 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/FileUtils.java @@ -0,0 +1,125 @@ +package com.jun.plugin.file.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +public class FileUtils { + + /** + * 判断文件是否存在,不存在就创建 + * @param file + */ + public static void createFile(File file) { + if (file.exists()) { + System.out.println("File exists"); + } else { + System.out.println("File not exists, create it ..."); + //getParentFile() 获取上级目录(包含文件名时无法直接创建目录的) + if (!file.getParentFile().exists()) { + System.out.println("not exists"); + //创建上级目录 + file.getParentFile().mkdirs(); + } + try { + //在上级目录里创建文件 + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + //file 转换为 MultipartFile + private MultipartFile getMulFileByFile(File file) + { + FileItemFactory factory = new DiskFileItemFactory(16, null); + String textFieldName = "textField"; + int num = file.getAbsolutePath().lastIndexOf("."); + String extFile =FilenameUtils.getExtension(file.getAbsolutePath());// filePath.substring(num); + FileItem item = factory.createItem(textFieldName, "text/plain", true, + "MyFileName" + extFile); + File newfile = file; + int bytesRead = 0; + byte[] buffer = new byte[8192]; + try + { + FileInputStream fis = new FileInputStream(newfile); + OutputStream os = item.getOutputStream(); + while ((bytesRead = fis.read(buffer, 0, 8192)) + != -1) + { + os.write(buffer, 0, bytesRead); + } + os.close(); + fis.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + MultipartFile mfile = new CommonsMultipartFile(item); + return mfile; + + } + + //file 转换为 MultipartFile + private MultipartFile getMulFileByPath(String filePath) + { + FileItemFactory factory = new DiskFileItemFactory(16, null); + String textFieldName = "textField"; + int num = filePath.lastIndexOf("."); + String extFile = filePath.substring(num); + FileItem item = factory.createItem(textFieldName, "text/plain", true, + "MyFileName" + extFile); + File newfile = new File(filePath); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + try + { + FileInputStream fis = new FileInputStream(newfile); + OutputStream os = item.getOutputStream(); + while ((bytesRead = fis.read(buffer, 0, 8192)) + != -1) + { + os.write(buffer, 0, bytesRead); + } + os.close(); + fis.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + + MultipartFile mfile = new CommonsMultipartFile(item); + return mfile; + + } + + + /** + * MultipartFile 转换成File + * + * @param multfile 原文件类型 + * @return File + * @throws IOException + */ + public static File multipartToFile(MultipartFile multfile) { + + CommonsMultipartFile cf = (CommonsMultipartFile)multfile; + //这个myfile是MultipartFile的 + DiskFileItem fi = (DiskFileItem) cf.getFileItem(); + File file = fi.getStoreLocation(); + return file; + } +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/QiniuUtils.java b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/QiniuUtils.java new file mode 100644 index 000000000..7c3ece854 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/java/com/jun/plugin/file/utils/QiniuUtils.java @@ -0,0 +1,466 @@ +package com.jun.plugin.file.utils; + +import java.io.*; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.UUID; + +import org.apache.commons.io.IOUtils; +import org.json.JSONException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import com.qiniu.common.QiniuException; +import com.qiniu.common.Zone; +import com.qiniu.http.Response; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; + +import lombok.extern.slf4j.Slf4j; + +import javax.security.auth.message.AuthException; + +@Component +@Slf4j +public class QiniuUtils { + + public static final String ACCESS_KEY = "ts0n9OF16ekFkDkZTTlpmyPI-tP3HKQDyw_GR4o2"; // 你的access_key + public static final String SECRET_KEY = "c-OjjwV3ZgzCQwxc6W_bsTFKuDg8qeyqohyJU0RL"; // 你的secret_key + public static final String BUCKET_NAME = "qixing-files"; // 你的bucket_name + public static final String domain = "http://qiniu.hbqxcpa.cn"; // 你的bucket_name + public static final long TOKEN_TIME = 3600 * 24 * 365 * 5; // 你的bucket_name + + public static void uploadFile(String filePath, String fileName) throws QiniuException { + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(QiniuUtils.ACCESS_KEY, QiniuUtils.SECRET_KEY); + String token = auth.uploadToken(QiniuUtils.BUCKET_NAME); + Response r = uploadManager.put(filePath, fileName, token); + if (r.isOK()) { + log.info("上传成功!"); + log.info("上传文件路径:" + domain + r.url()); + } else { + log.info("上传失败!"); + } + System.out.println(token); // 输出上传凭证 + System.out.println(r.isOK()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.url()); // 输出上传到七牛云之后的文件名称 + + } + + public static void uploadFile(File file, String fileName) throws QiniuException { + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(QiniuUtils.ACCESS_KEY, QiniuUtils.SECRET_KEY); + String token = auth.uploadToken(QiniuUtils.BUCKET_NAME); + Response r = uploadManager.put(file, fileName, token); + if (r.isOK()) { + log.info("上传成功!"); + log.info("上传文件路径:" + domain + r.url()); + } else { + log.info("上传失败!"); + } + System.out.println(token); // 输出上传凭证 + System.out.println(r.isOK()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.url()); // 输出上传到七牛云之后的文件名称 + + } + + public static void uploadFile(InputStream ins, String fileName) throws QiniuException { + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(QiniuUtils.ACCESS_KEY, QiniuUtils.SECRET_KEY); + String token = auth.uploadToken(QiniuUtils.BUCKET_NAME); + Response r = uploadManager.put(chanageInputStream2byte(ins), fileName, token); + if (r.isOK()) { + log.info("上传成功!"); + log.info("上传文件路径:" + domain + r.url()); + } else { + log.info("上传失败!"); + } + System.out.println(token); // 输出上传凭证 + System.out.println(r.isOK()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.url()); // 输出上传到七牛云之后的文件名称 + } + + public static void uploadFile(MultipartFile file, String fileName) throws IOException { + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(QiniuUtils.ACCESS_KEY, QiniuUtils.SECRET_KEY); + String token = auth.uploadToken(QiniuUtils.BUCKET_NAME); +// try { + Response r = uploadManager.put(file.getBytes(), fileName, token); + if (r.isOK()) { + log.info("上传成功!"); + log.info("上传文件路径:" + domain + r.url()); + } else { + log.info("上传失败!"); + } + System.out.println(token); // 输出上传凭证 + System.out.println(r.isOK()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.url()); // 输出上传到七牛云之后的文件名称 +// } catch (IOException e) { +// e.printStackTrace(); +// } + } + + public static String uploadFileV2(MultipartFile file, String fileName) throws IOException { + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(QiniuUtils.ACCESS_KEY, QiniuUtils.SECRET_KEY); + String token = auth.uploadToken(QiniuUtils.BUCKET_NAME); + Response r = uploadManager.put(file.getBytes(), fileName, token); + if (r.isOK()) { + log.info("上传成功!"); + log.info("上传文件路径:" + domain + r.url()); + } else { + log.info("上传失败!"); + } + System.out.println(token); // 输出上传凭证 + System.out.println(r.isOK()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.url()); // 输出上传到七牛云之后的文件名称 + String URL = QiniuUtils.domain + "/" + fileName; + String downloadRUL = auth.privateDownloadUrl(URL, TOKEN_TIME); + log.info("下载文件路径:" + downloadRUL); + return downloadRUL; + } + public static String uploadFileV2(File file, String fileName) throws IOException { + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(QiniuUtils.ACCESS_KEY, QiniuUtils.SECRET_KEY); + String token = auth.uploadToken(QiniuUtils.BUCKET_NAME); + FileInputStream input = new FileInputStream(file); + Response r = uploadManager.put(IOUtils.toByteArray(input), fileName, token); + if (r.isOK()) { + log.info("上传成功!"); + log.info("上传文件路径:" + domain + r.url()); + } else { + log.info("上传失败!"); + } + System.out.println(token); // 输出上传凭证 + System.out.println(r.isOK()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); // 输出上传到七牛云之后的文件名称 + System.out.println(r.url()); // 输出上传到七牛云之后的文件名称 + String URL = QiniuUtils.domain + "/" + fileName; + String downloadRUL = auth.privateDownloadUrl(URL, TOKEN_TIME); + log.info("下载文件路径:" + downloadRUL); + return downloadRUL; + } + + public static String downloadURL(String fileName) { + // 密钥配置 + Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY); + // 构造私有空间的需要生成的下载的链接 + String URL = QiniuUtils.domain + "/" + fileName; + log.info("下载原始文件路径:" + URL); + // 调用privateDownloadUrl方法生成下载链接,第二个参数可以设置Token的过期时间 + String downloadRUL = auth.privateDownloadUrl(URL, TOKEN_TIME); + log.info("下载文件路径:" + downloadRUL); + System.out.println(downloadRUL); + return downloadRUL; + } + + public static byte[] chanageInputStream2byte(InputStream fis) { + byte[] buffer = null; + try { + // FileInputStream fis = new FileInputStream(tradeFile); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int n; + while ((n = fis.read(b)) != -1) { + bos.write(b, 0, n); + } + fis.close(); + bos.close(); + buffer = bos.toByteArray(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return buffer; + } + + public static String FormetFileSize(Long fileLength) { + String fileSizeString = ""; + DecimalFormat df = new DecimalFormat("#.00"); + if (fileLength != null) { + if (fileLength < 1024) { + fileSizeString = df.format((double) fileLength) + "B"; + } else if (fileLength < 1048576) { + fileSizeString = df.format((double) fileLength / 1024) + "K"; + } else if (fileLength < 1073741824) { + fileSizeString = df.format((double) fileLength / 1048576) + "M"; + } else { + fileSizeString = df.format((double) fileLength / 1073741824) + "G"; + } + } + return fileSizeString; + } + + public static String getFileNameByDate(String filename) { + String filenameExtension = ""; + String filenamePre = ""; + if (filename.contains(".")) { + filenameExtension = filename.substring(filename.indexOf(".") + 1, filename.length()); + filenamePre = filename.substring(0, filename.indexOf(".")); + } else { + filenamePre = filename; + } + SimpleDateFormat time = new SimpleDateFormat("yyyyMMddHHmmss"); + String filenameNew = filenamePre + "-" + time.format(new Date()) + "." + filenameExtension; + log.info(filenameNew); + return filenameNew; + + } + + public static String getFileNameByDate(String username , String filename) { + String filenameExtension = ""; + String filenamePre = ""; + if (filename.contains(".")) { + filenameExtension = filename.substring(filename.indexOf(".") + 1, filename.length()); + filenamePre = filename.substring(0, filename.indexOf(".")); + } else { + filenamePre = filename; + } + SimpleDateFormat time = new SimpleDateFormat("yyyyMMddHHmmss"); + String filenameNew =username+"/" + filenamePre + "-" + time.format(new Date()) +"-"+ username+ "." + filenameExtension; + log.info(filenameNew); + return filenameNew; + + } + + // 删除文件 + public static int deleteFileFromQiniu(String fileName) { + // 构造一个带指定Zone对象的配置类 + @SuppressWarnings("deprecation") + Configuration cfg = new Configuration(Zone.zone0()); + String key = fileName; + Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY); + BucketManager bucketManager = new BucketManager(auth, cfg); + try { + Response delete = bucketManager.delete(BUCKET_NAME, key); + return delete.statusCode; + } catch (QiniuException ex) { + // 如果遇到异常,说明删除失败 + ex.printStackTrace(); + System.err.println(ex.code()); + System.err.println(ex.response.toString()); + } + return -1; + } + + + public static void main(String[] args) { + try { +// uploadFile("D:\\11111108599.zip", "11111108599.zip"); +// uploadFile(new File("D:\\quickstart-master.tar.gz"), "quickstart-master.tar.gz"); +// download("11111108599.zip"); +// getFileNameByDate("11111108599.tar.gz"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + // ***************************************************************************************************************** + // ***************************************************************************************************************** + // ***************************************************************************************************************** + + private static Logger logger = LoggerFactory.getLogger(QiniuUtils.class); + String bucketName = "bucketName"; +// private String bucketName = propertyUtil.getProperty("bucketName"); +// private String domain = propertyUtil.getProperty("domain"); +// private String ACCESS_KEY = propertyUtil.getProperty("ACCESS_KEY"); +// private String SECRET_KEY = propertyUtil.getProperty("SECRET_KEY"); + + //通过文件路径上传文件 + public ExecuteResult uploadFile(String localFile) throws AuthException, JSONException { + File file = new File(localFile); + /** + * 文件后缀名 文件扩展名 + */ + String filenameExtension = localFile.substring(localFile.lastIndexOf("."), localFile.length()); + return uploadFile2(file, filenameExtension); + } + + //通过File上传 + public ExecuteResult uploadFile2(File file, String filename) throws AuthException, JSONException { + ExecuteResult executeResult = new ExecuteResult(); +// String uptoken = getUpToken(); + // 可选的上传选项,具体说明请参见使用手册。 +// PutExtra extra = new PutExtra(); +// PutRet ret = IoApi.putFile(uptoken,filename , extra); + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(ACCESS_KEY,SECRET_KEY); + String token = auth.uploadToken(bucketName); + Response r; + try { + r = uploadManager.put(file, filename, token); + System.out.println(token); //输出上传凭证 + System.out.println(r.isOK()); //输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); //输出上传到七牛云之后的文件名称 + if (r.isOK()) { + executeResult.setSuccessMessage("上传成功!"); + executeResult.setResult(domain+r.url()); + } else { + executeResult.addErrorMessage("上传失败"); + } + } catch (QiniuException e) { + e.printStackTrace(); + } + + + return executeResult; + } + public String getFileNameByDateAndUUID(String filenameExtension) { + SimpleDateFormat time = new SimpleDateFormat("yyyy/MM/dd"); + String filename = time.format(new Date()) + "/" + UUID.randomUUID() + filenameExtension; + return filename; + + } + + /** + * 从 inputstream 中写入七牛 + * + * @param content 要写入的内容 + * @return + * @throws AuthException + * @throws JSONException + */ + public boolean uploadFile2(String content ,String fileName) throws AuthException, JSONException { + // 读取的时候按的二进制,所以这里要同一 + ByteArrayInputStream inputStream = new ByteArrayInputStream(content.getBytes()); + // 可选的上传选项,具体说明请参见使用手册。 + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(ACCESS_KEY,SECRET_KEY); + String token = auth.uploadToken(bucketName); + + Response r; + try { + r = uploadManager.put(QiniuUtils.chanageInputStream2byte(inputStream), fileName, token); +// Response r = uploadManager.put(inputStream, key, token); + System.out.println(token); //输出上传凭证 + System.out.println(r.isOK()); //输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); //输出上传到七牛云之后的文件名称 + if (r.isOK()) { + return true; + } else { + return false; + } + } catch (QiniuException e) { + e.printStackTrace(); + } + return false; + } + public boolean uploadFile2(InputStream ins,String fileName) throws AuthException, JSONException { + com.qiniu.storage.Configuration cfg = new Configuration(); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(ACCESS_KEY,SECRET_KEY); + String token = auth.uploadToken(bucketName); + Response r; + try { + r = uploadManager.put(QiniuUtils.chanageInputStream2byte(ins), fileName, token); + //Response r = uploadManager.put(inputStream, key, token); + System.out.println(token); //输出上传凭证 + System.out.println(r.isOK()); //输出上传到七牛云之后的文件名称 + System.out.println(r.toString()); //输出上传到七牛云之后的文件名称 + if (r.isOK()) { + return true; + } else { + return false; + } + } catch (QiniuException e) { + e.printStackTrace(); + } + return false; + } + + public static byte[] chanageInputStream2byte2(InputStream fis){ + byte[] buffer = null; + try + { +// FileInputStream fis = new FileInputStream(tradeFile); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int n; + while ((n = fis.read(b)) != -1) + { + bos.write(b, 0, n); + } + fis.close(); + bos.close(); + buffer = bos.toByteArray(); + }catch (FileNotFoundException e){ + e.printStackTrace(); + }catch (IOException e){ + e.printStackTrace(); + } + return buffer; + } + public static byte[] File2byte(File tradeFile){ + byte[] buffer = null; + try + { + FileInputStream fis = new FileInputStream(tradeFile); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int n; + while ((n = fis.read(b)) != -1) + { + bos.write(b, 0, n); + } + fis.close(); + bos.close(); + buffer = bos.toByteArray(); + }catch (FileNotFoundException e){ + e.printStackTrace(); + }catch (IOException e){ + e.printStackTrace(); + } + return buffer; + } + + //获得下载地址 +// public String getDownloadFileUrl(String filename) throws Exception { +// Mac mac = getMac(); +// String baseUrl = URLUtils.makeBaseUrl(domain, filename); +// GetPolicy getPolicy = new GetPolicy(); +// String downloadUrl = getPolicy.makeRequest(baseUrl, mac); +// return downloadUrl; +// } +// +// //删除文件 +// public void deleteFile(String filename) { +// Mac mac = getMac(); +// RSClient client = new RSClient(mac); +// client.delete(domain, filename); +// } +// +// //获取凭证 +// private String getUpToken() throws AuthException, JSONException { +// Mac mac = getMac(); +// PutPolicy putPolicy = new PutPolicy(bucketName); +// String uptoken = putPolicy.token(mac); +// return uptoken; +// } +// +// private Mac getMac() { +// Mac mac = new Mac(ACCESS_KEY, SECRET_KEY); +// return mac; +// } + +} diff --git a/jun_api_online/jun_plugins/fileservice/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_plugins/fileservice/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..e6c14c4e2 --- /dev/null +++ b/jun_api_online/jun_plugins/fileservice/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.file.config.FileAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_plugins/pom.xml b/jun_api_online/jun_plugins/pom.xml new file mode 100644 index 000000000..06c8e1e45 --- /dev/null +++ b/jun_api_online/jun_plugins/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + com.jun.plugin + jun_plugins + pom + 1.0 + 组件模块 + + + aoplog + fileservice + snakerflow + quartz + sms + shiro + + + \ No newline at end of file diff --git a/jun_api_online/jun_plugins/quartz/pom.xml b/jun_api_online/jun_plugins/quartz/pom.xml new file mode 100644 index 000000000..f59965a64 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + com.jun.plugin + quartz + 1.0 + jar + + 定时任务 + + + + org.quartz-scheduler + quartz + 2.3.2 + + + com.mchange + c3p0 + + + com.zaxxer + HikariCP-java6 + + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + com.jun.plugin + jun_common + 1.0 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/config/QuartzAutoConfig.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/config/QuartzAutoConfig.java new file mode 100644 index 000000000..14313e27d --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/config/QuartzAutoConfig.java @@ -0,0 +1,15 @@ +package com.jun.plugin.quartz.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.quartz") +@MapperScan(basePackages = "com.jun.plugin.quartz.mapper") +public class QuartzAutoConfig { +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/controller/SysJobController.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/controller/SysJobController.java new file mode 100644 index 000000000..fdb4d7f5c --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/controller/SysJobController.java @@ -0,0 +1,166 @@ +package com.jun.plugin.quartz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.quartz.utils.ScheduleJob; +import com.jun.plugin.quartz.entity.SysJobEntity; +import com.jun.plugin.quartz.service.SysJobService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.quartz.TriggerUtils; +import org.quartz.impl.triggers.CronTriggerImpl; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 定时任务 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "定时任务") +@RestController +@RequestMapping("/sysJob") +public class SysJobController { + @Resource + private SysJobService sysJobService; + + @ApiOperation(value = "新增") + @PostMapping("/add") + //@RequiresPermissions("sysJob:add") + public Result add(@RequestBody SysJobEntity sysJob) { + if (isValidExpression(sysJob.getCronExpression())) { + return Result.fail("cron表达式有误"); + } + Result result = ScheduleJob.judgeBean(sysJob.getBeanName()); + sysJobService.saveJob(sysJob); + return Result.success(result); + } + + @ApiOperation(value = "删除") + @DeleteMapping("/delete") + //@RequiresPermissions("sysJob:delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + sysJobService.delete(ids); + return Result.success(); + } + + @ApiOperation(value = "更新") + @PutMapping("/update") + //@RequiresPermissions("sysJob:update") + public Result update(@RequestBody SysJobEntity sysJob) { + if (isValidExpression(sysJob.getCronExpression())) { + return Result.fail("cron表达式有误"); + } + Result result = ScheduleJob.judgeBean(sysJob.getBeanName()); + sysJobService.updateJobById(sysJob); + return Result.success(result); + } + + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPage") + //@RequiresPermissions("sysJob:list") + public Result findListByPage(@RequestBody SysJobEntity sysJob) { + Page page = new Page(sysJob.getPage(), sysJob.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + if (!StringUtils.isEmpty(sysJob.getBeanName())) { + queryWrapper.like(SysJobEntity::getBeanName, sysJob.getBeanName()); + } + IPage iPage = sysJobService.page(page, queryWrapper); + return Result.success(iPage); + } + + + /** + * 立即执行任务 + */ + @ApiOperation(value = "立即执行任务") + @PostMapping("/run") + //@RequiresPermissions("sysJob:run") + public Result run(@RequestBody List ids) { + sysJobService.run(ids); + + return Result.success(); + } + + /** + * 暂停定时任务 + */ + @ApiOperation(value = "暂停定时任务") + @PostMapping("/pause") + //@RequiresPermissions("sysJob:pause") + public Result pause(@RequestBody List ids) { + sysJobService.pause(ids); + + return Result.success(); + } + + /** + * 恢复定时任务 + */ + @ApiOperation(value = "恢复定时任务") + @PostMapping("/resume") + //@RequiresPermissions("sysJob:resume") + public Result resume(@RequestBody List ids) { + sysJobService.resume(ids); + return Result.success(); + } + + /** + * 判断cron表达式 + * + * @param cronExpression cron表达式 + * @return 是否有误 + */ + public static boolean isValidExpression(String cronExpression) { + CronTriggerImpl trigger = new CronTriggerImpl(); + try { + trigger.setCronExpression(cronExpression); + Date date = trigger.computeFirstFireTime(null); + return date == null || !date.after(new Date()); + } catch (Exception e) { + return true; + } + } + + + @ApiOperation(value = "获取运行时间") + @PostMapping("/getRecentTriggerTime") + //@RequiresPermissions("sysJob:add") + public Result getRecentTriggerTime(String cron) { + List list = new ArrayList<>(); + try { + CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); + cronTriggerImpl.setCronExpression(cron); + // 这个是重点,一行代码搞定 + List dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 5); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (Date date : dates) { + list.add(dateFormat.format(date)); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + return Result.success(list); + } + + +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/controller/SysJobLogController.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/controller/SysJobLogController.java new file mode 100644 index 000000000..f4761591a --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/controller/SysJobLogController.java @@ -0,0 +1,57 @@ +package com.jun.plugin.quartz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.common.Result; +import com.jun.plugin.quartz.service.SysJobLogService; +import com.jun.plugin.quartz.entity.SysJobLogEntity; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + + +/** + * 定时任务日志 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "定时任务日志") +@RestController +@RequestMapping("/sysJobLog") +public class SysJobLogController { + @Resource + private SysJobLogService sysJobLogService; + + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPage") + //@RequiresPermissions("sysJob:list") + public Result findListByPage(@RequestBody SysJobLogEntity sysJobLog) { + Page page = new Page(sysJobLog.getPage(), sysJobLog.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + if (!StringUtils.isEmpty(sysJobLog.getJobId())) { + queryWrapper.like(SysJobLogEntity::getJobId, sysJobLog.getJobId()); + } + queryWrapper.orderByDesc(SysJobLogEntity::getCreateTime); + IPage iPage = sysJobLogService.page(page, queryWrapper); + return Result.success(iPage); + } + + @ApiOperation(value = "清空定时任务日志") + @DeleteMapping("/delete") + //@RequiresPermissions("sysJob:delete") + public Result delete() { + sysJobLogService.remove(Wrappers.emptyWrapper()); + return Result.success(); + } + +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/entity/SysJobEntity.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/entity/SysJobEntity.java new file mode 100644 index 000000000..27b7f6eee --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/entity/SysJobEntity.java @@ -0,0 +1,76 @@ +package com.jun.plugin.quartz.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 定时任务 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_job") +public class SysJobEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 任务调度参数key + */ + public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY"; + /** + * 任务id + */ + @TableId("id") + private String id; + + /** + * spring bean名称 + */ + @TableField("bean_name") + private String beanName; + + /** + * 参数 + */ + @TableField("params") + private String params; + + /** + * cron表达式 + */ + @TableField("cron_expression") + private String cronExpression; + + /** + * 任务状态 0:正常 1:暂停 + */ + @TableField("status") + private Integer status; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/entity/SysJobLogEntity.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/entity/SysJobLogEntity.java new file mode 100644 index 000000000..f98815024 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/entity/SysJobLogEntity.java @@ -0,0 +1,79 @@ +package com.jun.plugin.quartz.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 定时任务日志 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_job_log") +public class SysJobLogEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 任务日志id + */ + @TableId("id") + private String id; + + /** + * 任务id + */ + @TableField("job_id") + private String jobId; + + /** + * spring bean名称 + */ + @TableField("bean_name") + private String beanName; + + /** + * 参数 + */ + @TableField("params") + private String params; + + /** + * 任务状态 0:成功 1:失败 + */ + @TableField("status") + private Integer status; + + /** + * 失败信息 + */ + @TableField("error") + private String error; + + /** + * 耗时(单位:毫秒) + */ + @TableField("times") + private Integer times; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/mapper/SysJobLogMapper.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/mapper/SysJobLogMapper.java new file mode 100644 index 000000000..49823ce35 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/mapper/SysJobLogMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.quartz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.quartz.entity.SysJobLogEntity; + +/** + * 定时任务日志、 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysJobLogMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/mapper/SysJobMapper.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/mapper/SysJobMapper.java new file mode 100644 index 000000000..3206015eb --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/mapper/SysJobMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.quartz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.quartz.entity.SysJobEntity; + +/** + * 定时任务 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysJobMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/SysJobLogService.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/SysJobLogService.java new file mode 100644 index 000000000..69c881d40 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/SysJobLogService.java @@ -0,0 +1,16 @@ +package com.jun.plugin.quartz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.quartz.entity.SysJobLogEntity; + +/** + * 定时任务 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysJobLogService extends IService { + +} + diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/SysJobService.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/SysJobService.java new file mode 100644 index 000000000..cddb8576f --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/SysJobService.java @@ -0,0 +1,67 @@ +package com.jun.plugin.quartz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.quartz.entity.SysJobEntity; + +import java.util.List; + +/** + * 定时任务 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysJobService extends IService { + + /** + * 保存job + * + * @param sysJob sysJob + */ + void saveJob(SysJobEntity sysJob); + + /** + * 更新job + * + * @param sysJob sysJob + */ + void updateJobById(SysJobEntity sysJob); + + /** + * 删除job + * + * @param ids ids + */ + void delete(List ids); + + /** + * 运行一次job + * + * @param ids ids + */ + void run(List ids); + + /** + * 暂停job + * + * @param ids ids + */ + void pause(List ids); + + /** + * 恢复job + * + * @param ids ids + */ + void resume(List ids); + + /** + * 批量更新状态 + * + * @param ids ids + * @param status status + */ + void updateBatch(List ids, int status); +} + diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/impl/SysJobLogServiceImpl.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 000000000..cef77c514 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,21 @@ +package com.jun.plugin.quartz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.quartz.service.SysJobLogService; +import com.jun.plugin.quartz.entity.SysJobLogEntity; +import com.jun.plugin.quartz.mapper.SysJobLogMapper; + +import org.springframework.stereotype.Service; + +/** + * 定时任务 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service("sysJobLogService") +public class SysJobLogServiceImpl extends ServiceImpl implements SysJobLogService { + + +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/impl/SysJobServiceImpl.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/impl/SysJobServiceImpl.java new file mode 100644 index 000000000..0e484ead1 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/service/impl/SysJobServiceImpl.java @@ -0,0 +1,116 @@ +package com.jun.plugin.quartz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.quartz.utils.ScheduleUtils; +import com.jun.plugin.quartz.entity.SysJobEntity; +import com.jun.plugin.quartz.mapper.SysJobMapper; +import com.jun.plugin.quartz.service.SysJobService; + +import org.quartz.CronTrigger; +import org.quartz.Scheduler; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; + +/** + * 定时任务 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service("sysJobService") +public class SysJobServiceImpl extends ServiceImpl implements SysJobService { + @Resource + private Scheduler scheduler; + @Resource + private SysJobMapper sysJobMapper; + + /** + * 项目启动时,初始化定时器 + */ + @PostConstruct + public void init() { + List scheduleJobList = this.list(); + for (SysJobEntity scheduleJob : scheduleJobList) { + CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getId()); + //如果不存在,则创建 + if (cronTrigger == null) { + ScheduleUtils.createScheduleJob(scheduler, scheduleJob); + } else { + ScheduleUtils.updateScheduleJob(scheduler, scheduleJob); + } + } + } + + @Override + public void saveJob(SysJobEntity sysJob) { + sysJob.setStatus(Constant.SCHEDULER_STATUS_NORMAL); + this.save(sysJob); + + ScheduleUtils.createScheduleJob(scheduler, sysJob); + } + + @Override + public void updateJobById(SysJobEntity sysJob) { + SysJobEntity sysJobEntity = this.getById(sysJob.getId()); + if (sysJobEntity == null) { + throw new BusinessException("获取定时任务异常"); + } + sysJob.setStatus(sysJobEntity.getStatus()); + ScheduleUtils.updateScheduleJob(scheduler, sysJob); + + this.updateById(sysJob); + } + + @Override + public void delete(List ids) { + for (String jobId : ids) { + ScheduleUtils.deleteScheduleJob(scheduler, jobId); + } + sysJobMapper.deleteBatchIds(ids); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void run(List ids) { + for (String jobId : ids) { + ScheduleUtils.run(scheduler, this.getById(jobId)); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void pause(List ids) { + for (String jobId : ids) { + ScheduleUtils.pauseJob(scheduler, jobId); + } + + updateBatch(ids, Constant.SCHEDULER_STATUS_PAUSE); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void resume(List ids) { + for (String jobId : ids) { + ScheduleUtils.resumeJob(scheduler, jobId); + } + + updateBatch(ids, Constant.SCHEDULER_STATUS_NORMAL); + } + + @Override + public void updateBatch(List ids, int status) { + ids.parallelStream().forEach(id -> { + SysJobEntity sysJobEntity = new SysJobEntity(); + sysJobEntity.setId(id); + sysJobEntity.setStatus(status); + baseMapper.updateById(sysJobEntity); + }); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/task/TestTask11.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/task/TestTask11.java new file mode 100644 index 000000000..f7b91780c --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/task/TestTask11.java @@ -0,0 +1,23 @@ +package com.jun.plugin.quartz.task; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * Queartz JOB 测试定时任务(演示Demo,可删除) + * testTask为spring bean的名称, 方法名称必须是run + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Component("testTask11") +public class TestTask11 { + private Logger logger = LoggerFactory.getLogger(getClass()); + + public void run(String params){ + //@TODO,新增定时任务,更新项目管理功能的当前处理人跟当前处理流程节点; + logger.debug("TestTask 111111111111111 定时任务正在执行,每分钟执行一次,参数为:{}", params); + } +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/utils/ScheduleJob.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/utils/ScheduleJob.java new file mode 100644 index 000000000..db2b8b796 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/utils/ScheduleJob.java @@ -0,0 +1,110 @@ +package com.jun.plugin.quartz.utils; + +import com.jun.plugin.common.Result; +import com.jun.plugin.common.util.SpringContextUtil; +import com.jun.plugin.quartz.entity.SysJobEntity; +import com.jun.plugin.quartz.entity.SysJobLogEntity; +import com.jun.plugin.quartz.service.SysJobLogService; +import org.apache.commons.lang3.StringUtils; +import org.quartz.JobExecutionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.lang.reflect.Method; + + +/** + * 定时任务 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public class ScheduleJob extends QuartzJobBean { + private Logger logger = LoggerFactory.getLogger(getClass()); + + final SysJobLogService sysJobLogService; + + public ScheduleJob(SysJobLogService sysJobLogService) { + this.sysJobLogService = sysJobLogService; + } + + @Override + protected void executeInternal(JobExecutionContext context) { + SysJobEntity scheduleJob = (SysJobEntity) context.getMergedJobDataMap() + .get(SysJobEntity.JOB_PARAM_KEY); + + //获取spring bean + SysJobLogService scheduleJobLogService = (SysJobLogService) SpringContextUtil.getBean("sysJobLogService"); + + //数据库保存执行记录 + SysJobLogEntity log = new SysJobLogEntity(); + log.setJobId(scheduleJob.getId()); + log.setBeanName(scheduleJob.getBeanName()); + log.setParams(scheduleJob.getParams()); + + //任务开始时间 + long startTime = System.currentTimeMillis(); + + try { + //执行任务 + logger.debug("任务准备执行,任务ID:" + scheduleJob.getId()); + + Object target = SpringContextUtil.getBean(scheduleJob.getBeanName()); + assert target != null; + Method method = target.getClass().getDeclaredMethod("run", String.class); + method.invoke(target, scheduleJob.getParams()); + + //任务执行总时长 + long times = System.currentTimeMillis() - startTime; + log.setTimes((int) times); + //任务状态 0:成功 1:失败 + log.setStatus(0); + + logger.debug("任务执行完毕,任务ID:" + scheduleJob.getId() + " 总共耗时:" + times + "毫秒"); + } catch (Exception e) { + logger.error("任务执行失败,任务ID:" + scheduleJob.getId(), e); + + //任务执行总时长 + long times = System.currentTimeMillis() - startTime; + log.setTimes((int) times); + + //任务状态 0:成功 1:失败 + log.setStatus(1); + log.setError(StringUtils.substring(e.toString(), 0, 2000)); + } finally { + assert scheduleJobLogService != null; + scheduleJobLogService.save(log); + } + } + + /** + * 判断bean是否有效 + * + * @param beanName beanName + * @return 返回信息 + */ + public static Result judgeBean(String beanName) { + + if (org.springframework.util.StringUtils.isEmpty(beanName)) { + return Result.fail("spring bean名称不能为空"); + } + + Object target = SpringContextUtil.getBean(beanName); + if (target == null) { + return Result.fail("spring bean不存在,请检查"); + } + Method method; + try { + method = target.getClass().getDeclaredMethod("run", String.class); + } catch (Exception e) { + return Result.fail("spring bean中的run方法不存在,请检查"); + } + if (method == null) { + return Result.fail("spring bean中的run方法不存在,请检查"); + } + + return Result.success(); + } +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/utils/ScheduleUtils.java b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/utils/ScheduleUtils.java new file mode 100644 index 000000000..dda2988da --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/java/com/jun/plugin/quartz/utils/ScheduleUtils.java @@ -0,0 +1,151 @@ +package com.jun.plugin.quartz.utils; + +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.exception.BusinessException; +import org.quartz.*; + +import com.jun.plugin.quartz.entity.SysJobEntity; + +/** + * 定时任务工具类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public class ScheduleUtils { + private final static String JOB_NAME = "TASK_"; + + /** + * 获取触发器key + */ + public static TriggerKey getTriggerKey(String jobId) { + return TriggerKey.triggerKey(JOB_NAME + jobId); + } + + /** + * 获取jobKey + */ + public static JobKey getJobKey(String jobId) { + return JobKey.jobKey(JOB_NAME + jobId); + } + + /** + * 获取表达式触发器 + */ + public static CronTrigger getCronTrigger(Scheduler scheduler, String jobId) { + try { + return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId)); + } catch (SchedulerException e) { + throw new BusinessException("获取定时任务CronTrigger出现异常"); + } + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, SysJobEntity scheduleJob) { + try { + //构建job信息 + JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getId())).build(); + + //表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()) + .withMisfireHandlingInstructionDoNothing(); + + //按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getId())).withSchedule(scheduleBuilder).build(); + + //放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(SysJobEntity.JOB_PARAM_KEY, scheduleJob); + + scheduler.scheduleJob(jobDetail, trigger); + + //暂停任务 + if (Constant.SCHEDULER_STATUS_PAUSE.equals(scheduleJob.getStatus())) { + pauseJob(scheduler, scheduleJob.getId()); + } + } catch (SchedulerException e) { + throw new BusinessException("创建定时任务失败"); + } + } + + /** + * 更新定时任务 + */ + public static void updateScheduleJob(Scheduler scheduler, SysJobEntity scheduleJob) { + try { + TriggerKey triggerKey = getTriggerKey(scheduleJob.getId()); + + //表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()) + .withMisfireHandlingInstructionDoNothing(); + + CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getId()); + + //按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + + //参数 + trigger.getJobDataMap().put(SysJobEntity.JOB_PARAM_KEY, scheduleJob); + + scheduler.rescheduleJob(triggerKey, trigger); + + //暂停任务 + if (Constant.SCHEDULER_STATUS_PAUSE.equals(scheduleJob.getStatus())) { + pauseJob(scheduler, scheduleJob.getId()); + } + + } catch (SchedulerException e) { + throw new BusinessException("更新定时任务失败"); + } + } + + /** + * 立即执行任务 + */ + public static void run(Scheduler scheduler, SysJobEntity scheduleJob) { + try { + //参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(SysJobEntity.JOB_PARAM_KEY, scheduleJob); + + scheduler.triggerJob(getJobKey(scheduleJob.getId()), dataMap); + } catch (SchedulerException e) { + throw new BusinessException("立即执行定时任务失败"); + } + } + + /** + * 暂停任务 + */ + public static void pauseJob(Scheduler scheduler, String jobId) { + try { + scheduler.pauseJob(getJobKey(jobId)); + } catch (SchedulerException e) { + throw new BusinessException("暂停定时任务失败"); + } + } + + /** + * 恢复任务 + */ + public static void resumeJob(Scheduler scheduler, String jobId) { + try { + scheduler.resumeJob(getJobKey(jobId)); + } catch (SchedulerException e) { + throw new BusinessException("暂停定时任务失败"); + } + } + + /** + * 删除定时任务 + */ + public static void deleteScheduleJob(Scheduler scheduler, String jobId) { + try { + scheduler.deleteJob(getJobKey(jobId)); + } catch (SchedulerException e) { + throw new BusinessException("删除定时任务失败"); + } + } +} diff --git a/jun_api_online/jun_plugins/quartz/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_plugins/quartz/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..6ff9d6880 --- /dev/null +++ b/jun_api_online/jun_plugins/quartz/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.quartz.config.QuartzAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_plugins/shiro/pom.xml b/jun_api_online/jun_plugins/shiro/pom.xml new file mode 100644 index 000000000..04726ce2b --- /dev/null +++ b/jun_api_online/jun_plugins/shiro/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.jun.plugin + shiro + 1.0 + jar + Shiro组件 + + + + com.jun.plugin + jun_common + 1.0 + + + + org.apache.shiro + shiro-spring + 1.4.0 + + + com.github.theborakompanioni + thymeleaf-extras-shiro + 2.0.0 + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/CustomHashedCredentialsMatcher.java b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/CustomHashedCredentialsMatcher.java new file mode 100644 index 000000000..c59bb6c58 --- /dev/null +++ b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/CustomHashedCredentialsMatcher.java @@ -0,0 +1,46 @@ +package com.jun.plugin.shiro; + +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.common.service.RedisService; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.credential.SimpleCredentialsMatcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; + +import lombok.extern.slf4j.Slf4j; + +/** + * 认证 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Slf4j +public class CustomHashedCredentialsMatcher extends SimpleCredentialsMatcher { + + @Lazy + @Autowired + private RedisService redisDb; + @Value("${spring.redis.key.prefix.userToken}") + private String userTokenPrefix; + + @Override + public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) { + String accessToken = (String) token.getPrincipal(); + if (!redisDb.exists(userTokenPrefix + accessToken)) { + log.error("-------------------------------------------------------------------------------"); + log.error("userTokenPrefix + accessToken:"+userTokenPrefix + accessToken); + log.error("userTokenPrefix :"+userTokenPrefix ); + log.error("accessToken:"+ accessToken); + log.error("-------------------------------------------------------------------------------"); + SecurityUtils.getSubject().logout(); + throw new BusinessException(BaseResponseCode.TOKEN_ERROR); + } + return true; + } +} diff --git a/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/CustomRealm.java b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/CustomRealm.java new file mode 100644 index 000000000..c9b7f2166 --- /dev/null +++ b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/CustomRealm.java @@ -0,0 +1,89 @@ +package com.jun.plugin.shiro; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.common.service.RedisService; +//import com.jun.plugin.system.service.PermissionService; +//import com.jun.plugin.system.service.RoleService; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 授权 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Slf4j +public class CustomRealm extends AuthorizingRealm { +// @Lazy +// @Autowired +// private PermissionService permissionService; +// @Lazy +// @Autowired +// private RoleService roleService; + @Lazy + @Autowired + private RedisService redisService; + @Value("${spring.redis.key.prefix.permissionRefresh}") + private String redisPermissionRefreshKey; + @Value("${spring.redis.key.prefix.userToken}") + private String userTokenPrefix; + @Lazy + @Autowired + private RedisService redisDb; + + + /** + * 执行授权逻辑 + */ + @Override + @SuppressWarnings("unchecked") + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); + + String sessionInfoStr = redisDb.get(userTokenPrefix + principalCollection.getPrimaryPrincipal()); + if (StringUtils.isEmpty(sessionInfoStr)) { + throw new BusinessException(BaseResponseCode.TOKEN_ERROR); + } + JSONObject redisSession = JSON.parseObject(sessionInfoStr); + if (redisSession == null) { + throw new BusinessException(BaseResponseCode.TOKEN_ERROR); + } + + if (redisSession.get(Constant.ROLES_KEY) != null) { + authorizationInfo.addRoles((Collection) redisSession.get(Constant.ROLES_KEY)); + } + if (redisSession.get(Constant.PERMISSIONS_KEY) != null) { + authorizationInfo.addStringPermissions((Collection) redisSession.get(Constant.PERMISSIONS_KEY)); + } + return authorizationInfo; + } + + + /** + * 执行认证逻辑 + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + return new SimpleAuthenticationInfo(authenticationToken.getPrincipal(), authenticationToken.getPrincipal(), getName()); + } +} diff --git a/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/ShiroAutoConfig.java b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/ShiroAutoConfig.java new file mode 100644 index 000000000..9a3e0bfa1 --- /dev/null +++ b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/ShiroAutoConfig.java @@ -0,0 +1,17 @@ +package com.jun.plugin.shiro; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.shiro") +@MapperScan(basePackages = "com.jun.plugin.shiro.mapper") +@ServletComponentScan(basePackages = {"com.jun.plugin.shiro.compoent"}) +public class ShiroAutoConfig { +} diff --git a/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/ShiroConfig.java b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/ShiroConfig.java new file mode 100644 index 000000000..1dfcd8a15 --- /dev/null +++ b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/ShiroConfig.java @@ -0,0 +1,150 @@ +package com.jun.plugin.shiro; + +import com.jun.plugin.shiro.compoent.CustomAccessControlFilter; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +//import com.jun.plugin.system.common.comfig.FileUploadProperties; + +import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; + +import javax.servlet.Filter; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * ShiroConfig + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Configuration +//@EnableConfigurationProperties(FileUploadProperties.class) +public class ShiroConfig { + +// @Resource +// private FileUploadProperties fileUploadProperties; + + @Value("${shiro.enable}") + private boolean shiroEnable; + + @Bean(name = "shiroDialect") + public ShiroDialect shiroDialect() { + return new ShiroDialect(); + } + + @Bean + public CustomHashedCredentialsMatcher customHashedCredentialsMatcher() { + return new CustomHashedCredentialsMatcher(); + } + + /** + * 创建realm + */ + @Bean + public CustomRealm customRealm() { + CustomRealm customRealm = new CustomRealm(); + customRealm.setCredentialsMatcher(customHashedCredentialsMatcher()); + return customRealm; + } + + @Bean + public SecurityManager securityManager() { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + //关联realm + securityManager.setRealm(customRealm()); + return securityManager; + } + + + @Bean + public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { + + //整个shiro执行过程: 过滤器、认证、授权 + + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + if(shiroEnable){ + //设置安全管理器 + LinkedHashMap filtersMap = new LinkedHashMap<>(); + //用来校验token + filtersMap.put("token", new CustomAccessControlFilter()); + //filtersMap.put("jwt", new JwtFilter()); // TODO JWT认证,Wujun 添加自己的过滤器并且取名为jwt + shiroFilterFactoryBean.setFilters(filtersMap); + + Map filterRuleMap = new LinkedHashMap<>(); + // 配置不会被拦截的链接 顺序判断 + filterRuleMap.put("/*.html", "anon"); + filterRuleMap.put("/sys/user/token", "anon"); + filterRuleMap.put("/sys/user/login", "anon"); + filterRuleMap.put("/sys/getVerify", "anon"); + filterRuleMap.put("/sys/checkVerify", "anon"); + filterRuleMap.put("/sysDict/getType/*", "anon"); + filterRuleMap.put("/sms/sendCode", "anon"); + filterRuleMap.put("/index/**", "anon"); + filterRuleMap.put("/admin/**", "anon"); + filterRuleMap.put("/flow/**", "anon"); + filterRuleMap.put("/ext/**", "anon"); + filterRuleMap.put("/configInfo/**", "anon"); + filterRuleMap.put("/pages/*.html", "anon"); + filterRuleMap.put("/**/*.ttf", "anon"); + filterRuleMap.put("/**/*.wottf", "anon"); + filterRuleMap.put("/assets/**", "anon"); + filterRuleMap.put("/prj/**", "anon"); + filterRuleMap.put("/**/*.html", "anon"); + filterRuleMap.put("/**/*.js", "anon"); + filterRuleMap.put("/**/*.css", "anon"); + filterRuleMap.put("/**/*.json", "anon"); + filterRuleMap.put("/static/**", "anon"); + filterRuleMap.put("/rest/**", "anon"); + filterRuleMap.put("/doc.html", "anon"); + filterRuleMap.put("/swagger-resources/**", "anon"); + filterRuleMap.put("/v2/api-docs", "anon"); + filterRuleMap.put("/v2/api-docs-ext", "anon"); + filterRuleMap.put("/webjars/**", "anon"); + filterRuleMap.put("/druid/**", "anon"); + filterRuleMap.put("/favicon.ico", "anon"); + filterRuleMap.put("/captcha.jpg", "anon"); + filterRuleMap.put("/csrf", "anon"); + filterRuleMap.put("/public/**", "anon"); + //文件上传可直接访问 +// filterRuleMap.put(fileUploadProperties.getAccessUrl(), "anon"); + filterRuleMap.put("/images/**", "anon"); + filterRuleMap.put("/js/**", "anon"); + filterRuleMap.put("/layui/**", "anon"); + filterRuleMap.put("/css/**", "anon"); + filterRuleMap.put("/layui-ext/**", "anon"); + filterRuleMap.put("/api/**", "anon"); + filterRuleMap.put("/lib/**", "anon"); + filterRuleMap.put("/component/**", "anon"); + filterRuleMap.put("/**", "token,authc");// TODO 所有请求通过我们自己的JWT Filter + //filterRuleMap.put("/**", "token,authc,jwt");// TODO 所有请求通过我们自己的JWT Filter + shiroFilterFactoryBean.setLoginUrl("/login.html"); + shiroFilterFactoryBean.setUnauthorizedUrl("/401"); // 可设置无需鉴权的路径 + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterRuleMap); + } + return shiroFilterFactoryBean; + } + + /** + * 开启shiro aop注解支持. + * 使用代理方式;所以需要开启代码支持; + * + * @return org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } + + +} + diff --git a/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/compoent/CustomAccessControlFilter.java b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/compoent/CustomAccessControlFilter.java new file mode 100644 index 000000000..319fc12c0 --- /dev/null +++ b/jun_api_online/jun_plugins/shiro/src/main/java/com/jun/plugin/shiro/compoent/CustomAccessControlFilter.java @@ -0,0 +1,149 @@ +package com.jun.plugin.shiro.compoent; + +import com.alibaba.fastjson2.JSON; + +import com.jun.plugin.common.Result; +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.common.util.HttpRequestUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.springframework.util.CollectionUtils; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + + +/** + * 自定义过滤器 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Slf4j +public class CustomAccessControlFilter extends AccessControlFilter { + + + @Override + protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) { + return false; + } + + @Override + protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + StringBuffer url = request.getRequestURL(); + String uri = request.getRequestURI(); + if(url.toString().endsWith(".js") || url.toString().endsWith(".css")){ + return true; + } + if(uri.equals("/")){ + return true; + } + try { + Subject subject = getSubject(servletRequest, servletResponse); + System.out.println(subject.isAuthenticated() + ""); + System.out.println(HttpRequestUtil.isAjaxRequest(request)); + log.info(request.getMethod()); + log.info(request.getRequestURL().toString()); + //从header中获取token + String token = request.getHeader(Constant.ACCESS_TOKEN); + //如果header中不存在token,则从参数中获取token + if (StringUtils.isEmpty(token)) { + token = request.getParameter(Constant.ACCESS_TOKEN); + if (StringUtils.isEmpty(token)) { + Map urlPara = getParam(request); + token = urlPara.get(Constant.ACCESS_TOKEN)==null?null:urlPara.get(Constant.ACCESS_TOKEN).toString(); + } + } + if (StringUtils.isEmpty(token)) { + throw new BusinessException(BaseResponseCode.TOKEN_ERROR); + } + UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(token, token); + getSubject(servletRequest, servletResponse).login(usernamePasswordToken); + } catch (BusinessException exception) { + if (HttpRequestUtil.isAjaxRequest(request)) { + customResponse(exception.getMessageCode(), exception.getDetailMessage(), servletResponse); + } else if (exception.getMessageCode() == BaseResponseCode.TOKEN_ERROR.getCode()) { + servletRequest.getRequestDispatcher("/login.html").forward(servletRequest, servletResponse); + } else if (exception.getMessageCode() == BaseResponseCode.UNAUTHORIZED_ERROR.getCode()) { + servletRequest.getRequestDispatcher("/index/403").forward(servletRequest, servletResponse); + } else { + servletRequest.getRequestDispatcher("/index/500").forward(servletRequest, servletResponse); + } + return false; + } catch (AuthenticationException e) { + if (HttpRequestUtil.isAjaxRequest(request)) { + if (e.getCause() instanceof BusinessException) { + BusinessException exception = (BusinessException) e.getCause(); + customResponse(exception.getMessageCode(), exception.getDetailMessage(), servletResponse); + } else { + customResponse(BaseResponseCode.SYSTEM_BUSY.getCode(), BaseResponseCode.SYSTEM_BUSY.getMsg(), servletResponse); + } + } else { + servletRequest.getRequestDispatcher("/index/403").forward(servletRequest, servletResponse); + } + return false; + } catch (Exception e) { + if (HttpRequestUtil.isAjaxRequest(request)) { + if (e.getCause() instanceof BusinessException) { + BusinessException exception = (BusinessException) e.getCause(); + customResponse(exception.getMessageCode(), exception.getDetailMessage(), servletResponse); + } else { + customResponse(BaseResponseCode.SYSTEM_BUSY.getCode(), BaseResponseCode.SYSTEM_BUSY.getMsg(), servletResponse); + } + } else { + servletRequest.getRequestDispatcher("/index/500").forward(servletRequest, servletResponse); + } + return false; + } + return true; + } + + private static Map getParam(HttpServletRequest request) { + StringBuffer url = request.getRequestURL(); + if (request.getQueryString() != null) { + url.append("?"); + url.append(request.getQueryString()); + } + Map result = new HashMap<>(); + MultiValueMap urlMvp = UriComponentsBuilder.fromHttpUrl(url.toString()).build().getQueryParams(); + urlMvp.forEach((key, value) -> { + String firstValue = CollectionUtils.isEmpty(value) ? null : value.get(0); + result.put(key, firstValue); + }); + return result; + } + + private void customResponse(int code, String msg, ServletResponse response) { + try { + Result result = Result.getResult(code, msg); + + response.setContentType("application/json; charset=utf-8"); + response.setCharacterEncoding("UTF-8"); + + String userJson = JSON.toJSONString(result); + OutputStream out = response.getOutputStream(); + out.write(userJson.getBytes(StandardCharsets.UTF_8)); + out.flush(); + } catch (IOException e) { + log.error("error={}", e, e); + } + } + +} diff --git a/jun_api_online/jun_plugins/shiro/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_plugins/shiro/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..8b1ab0e1e --- /dev/null +++ b/jun_api_online/jun_plugins/shiro/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.shiro.ShiroAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_plugins/sms/pom.xml b/jun_api_online/jun_plugins/sms/pom.xml new file mode 100644 index 000000000..cc60aa91c --- /dev/null +++ b/jun_api_online/jun_plugins/sms/pom.xml @@ -0,0 +1,140 @@ + + + 4.0.0 + + com.jun.plugin + sms + 1.0 + jar + 短信组件 + + + + com.jun.plugin + jun_common + 1.0 + + + com.jun.plugin + jun_system + 1.0 + + + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.841 + + + + com.qiniu + qiniu-java-sdk + [7.7.0, 7.7.99] + + + + + + com.qiniu + happy-dns-java + 0.1.6 + test + + + com.aliyun.oss + aliyun-sdk-oss + 3.17.1 + + + com.qcloud + cos_api + 4.4 + + + org.slf4j + slf4j-log4j12 + + + junit + junit + + + + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/config/SmsAutoConfig.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/config/SmsAutoConfig.java new file mode 100644 index 000000000..13c7532d3 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/config/SmsAutoConfig.java @@ -0,0 +1,17 @@ +package com.jun.plugin.sms.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.sms") +@MapperScan(basePackages = "com.jun.plugin.sms.mapper") +@ServletComponentScan(basePackages = {"com.jun.plugin.sms.compoent"}) +public class SmsAutoConfig { +} diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/controller/SmsApiController.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/controller/SmsApiController.java new file mode 100644 index 000000000..8166d6447 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/controller/SmsApiController.java @@ -0,0 +1,134 @@ +package com.jun.plugin.sms.controller; + + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.common.service.RedisService; +import com.jun.plugin.common.util.PasswordUtils; +import com.jun.plugin.sms.service.SendSmsImpl; +import com.jun.plugin.system.entity.SysUser; +import com.jun.plugin.system.mapper.SysUserMapper; +import com.jun.plugin.system.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Random; + +@RestController +@RequestMapping("/sms") +//@CrossOrigin +public class SmsApiController { + @Autowired + public SendSmsImpl sendSms; + +// @Autowired +// public RedisTemplate redisTemplate; + + @Lazy + @Resource + private RedisService redisService; + @Resource + private SysUserMapper sysUserMapper; + @Resource + private UserService userService; + @Resource + private HttpSessionService httpSessionService; + + + public Random random = new Random(); + + @RequestMapping("/sendCode") + public Result sendCode(@RequestParam(value = "phone",required = true) String phone) { + //调用发送的方法即可 + + //1、连接Redis,查找手机验证码是否存在 + //String code = (String)redisTemplate.opsForValue().get(phone); + //String code = redisService.getRedisTemplate().opsForValue().get(phone); + String code = redisService.get(phone); + //==================================================== + // 1、1如果存在的话,说明在5分钟内已经发送过验证码了,不能再发了 + if (!StringUtils.isEmpty(code)) { + System.out.println("已存在,还没有过期,不能再次发送"); + return new Result(401, phone+":"+code+" 已存在,还没有过期"); + } + //===================================================== + + //1。2 如果不存在的话,那么redis创建键值对生成验证码并存储,设置过期时间 + String newCode = ""; + // 生成6位随机验证码 + for (int i = 0; i < 4; i++) { + newCode += random.nextInt(10); + } + String param[]= {newCode,"5"}; + // 将6位随机验证码对手机号进行发送 + boolean idSend = sendSms.send(phone,"1621170",param); + + //===================================================== + + // 因为有短信轰炸的情况,短信服务对每次发送限制次数,所以有发送不成功的情况,要考虑 + + if(idSend){//如果发送成功将验证码存储到redis中 + //redisTemplate.opsForValue().set(phone, newCode, 300,TimeUnit.SECONDS); + redisService.setAndExpire(phone, newCode, 300); + //redisService.getRedisTemplate().expire(phone, 60*5, TimeUnit.SECONDS); + System.out.println("发送成功!"); + return new Result(0, phone+":"+newCode+" 发送成功!"); + }else{ + System.out.println("发送失败!"); + return new Result(500, phone+":"+newCode+ "发送失败!"); + } + } + + + @RequestMapping("/verifyUser") + public Result verifyUser(@RequestParam(value = "username",required = true) String username, + @RequestParam(value = "phone",required = true) String phone, + @RequestParam(value = "captcha",required = true) String captcha) { + SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username).eq(SysUser::getPhone, phone)); + if (sysUserOne == null) { + return new Result(500, "用户名不存在或者手机号不存在或者用户名与手机号不匹配(请联系管理员处理)!"); + }else{ + return new Result(0, "请重置密码!"); + } + } + + @RequestMapping("/resetPassword") + public Result resetPassword(@RequestParam(value = "username",required = true) String username, + @RequestParam(value = "phone",required = true) String phone, + @RequestParam(value = "captcha",required = true) String captcha, + @RequestParam(value = "passwd",required = true) String passwd, + @RequestParam(value = "comPassword",required = true) String comPassword) { + SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username).eq(SysUser::getPhone, phone)); + if (sysUser == null) { + return new Result(500, "用户名不存在或者手机号不存在或者用户名与手机号不匹配(请联系管理员处理)!"); + }else{ + } + if(passwd.equals(comPassword)) { + String userId = httpSessionService.getCurrentUserId(); + String code = redisService.get(phone); + if (StringUtils.isEmpty(code)) { + return new Result(500, phone+":"+code+" 验证码不存在,验证码已过期"); + } + if (sysUser.getPassword().equals(PasswordUtils.encode(passwd, sysUser.getSalt()))) { + new Result(500, "新密码不能与旧密码相同"); + } + sysUser.setPassword(PasswordUtils.encode(passwd, sysUser.getSalt())); + sysUserMapper.updateById(sysUser); + //退出用户 + httpSessionService.abortAllUserByToken(); + return new Result(0, "密码重置成功!"); + //return new Result(500, "密码重置失败!"); + }else { + return new Result(500, "两次输入密码不一致!"); + } + + } +} + + diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/service/SendSms.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/service/SendSms.java new file mode 100644 index 000000000..a2a07e3e4 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/service/SendSms.java @@ -0,0 +1,12 @@ +package com.jun.plugin.sms.service; + +public interface SendSms { /** + * + * @param phoneNum 短信发送的手机号 + * @param templateCode 使用的短信模板id + * @param code 发送的手机验证码 + * @return 返回是否发送成功 + */ + public boolean send(String phoneNum,String templateCode, String[] param); + } + diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/service/SendSmsImpl.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/service/SendSmsImpl.java new file mode 100644 index 000000000..a5db6ece1 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/service/SendSmsImpl.java @@ -0,0 +1,118 @@ +package com.jun.plugin.sms.service; + + +import org.springframework.stereotype.Service; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +//导入可选配置类 +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +// 导入对应SMS模块的client +import com.tencentcloudapi.sms.v20210111.SmsClient; +// 导入要请求接口对应的request response类 +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +@Service +public class SendSmsImpl implements SendSms{ + + /** + * @param phoneNum 短信发送的手机号 + * @param templateCode 使用的短信模板id + * @return 返回是否发送成功 + */ + + @Override + public boolean send(String phoneNum, String templateCode, String[] param) { + + try { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及你的财产安全。 + * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */ + Credential cred = new Credential("AKIDb4KMAkBTZTAbmiQu98sOjpgHfokS2XzO", "NfpspgP1YzJYghbP6hAXnx1yrgJkxvd5"); + + // 实例化一个http选项,可选,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理(无需要直接忽略) + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* SDK默认使用POST方法。 + * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + httpProfile.setReqMethod("POST"); + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + httpProfile.setConnTimeout(60); + /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + + /* 非必要步骤: + * 实例化一个客户端配置对象,可以指定超时时间等配置 */ + ClientProfile clientProfile = new ClientProfile(); + /* SDK默认用TC3-HMAC-SHA256进行签名 + * 非必要请不要修改这个字段 */ + clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */ + SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile); + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + SendSmsRequest req = new SendSmsRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + String sdkAppId = "1400595817"; + req.setSmsSdkAppId(sdkAppId); + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 + String signName = "新博技术"; + req.setSignName(signName); + + /* 模板 ID: 必须填写已审核通过的模板 ID */ + // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 + String templateId = templateCode; + req.setTemplateId(templateId); + + /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */ + String[] templateParamSet = param; + req.setTemplateParamSet(templateParamSet); + + /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] + * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */ + String[] phoneNumberSet = {"+86"+phoneNum}; + req.setPhoneNumberSet(phoneNumberSet); + + + + /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */ + SendSmsResponse res = client.SendSms(req); + + // 输出json格式的字符串回包 + System.out.println(SendSmsResponse.toJsonString(res)); + return true; + + // 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义 + // System.out.println(res.getRequestId()); + + } catch (TencentCloudSDKException e) { + e.printStackTrace(); + } + return false; + } + +} + diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/AddSmsTemplate.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/AddSmsTemplate.java new file mode 100644 index 000000000..c29bc1049 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/AddSmsTemplate.java @@ -0,0 +1,90 @@ +package com.jun.plugin.sms.utils; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +//导入可选配置类 +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +// 导入 SMS 模块的 client +import com.tencentcloudapi.sms.v20210111.SmsClient; +// 导入要请求接口对应的 request response 类 +import com.tencentcloudapi.sms.v20210111.models.AddSmsTemplateRequest; +import com.tencentcloudapi.sms.v20210111.models.AddSmsTemplateResponse; +/** +* Tencent Cloud Sms AddSmsTemplate +* +*/ +public class AddSmsTemplate +{ + public static void main( String[] args ) + { + try { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey + * 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值 + * 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人 + * CAM 密钥查询:https://console.cloud.tencent.com/cam/capi + */ + Credential cred = new Credential("secretId", "secretKey"); + // 实例化一个 http 选项,可选,无特殊需求时可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理 + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* SDK 默认使用 POST 方法 + * 如需使用 GET 方法,可以在此处设置,但 GET 方法无法处理较大的请求 */ + httpProfile.setReqMethod("POST"); + /* SDK 有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + httpProfile.setConnTimeout(60); + /* SDK 会自动指定域名,通常无需指定域名,但访问金融区的服务时必须手动指定域名 + * 例如 SMS 的上海金融区域名为 sms.ap-shanghai-fsi.tencentcloudapi.com */ + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + /* 非必要步骤: + * 实例化一个客户端配置对象,可以指定超时时间等配置 */ + ClientProfile clientProfile = new ClientProfile(); + /* SDK 默认使用 TC3-HMAC-SHA256 进行签名 + * 非必要请不要修改该字段 */ + clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + /* 实例化 SMS 的 client 对象 + * 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 */ + SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile); + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 您可以直接查询 SDK 源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用 IDE 进行开发,可以方便地跳转查阅各个接口和数据结构的文档说明 */ + AddSmsTemplateRequest req = new AddSmsTemplateRequest(); + /* 填充请求参数,这里 request 对象的成员变量即对应接口的入参 + * 您可以通过官网接口文档或跳转到 request 对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台:https://console.cloud.tencent.com/smsv2 + * sms helper:https://cloud.tencent.com/document/product/382/3773 */ + /* 模板名称*/ + String templatename = "腾讯云"; + req.setTemplateName(templatename); + /* 模板内容 */ + String templatecontent = "{1}为您的登录验证码,请于{2}分钟内填写,如非本人操作,请忽略本短信。"; + req.setTemplateContent(templatecontent); + /* 短信类型:0表示普通短信, 1表示营销短信 */ + long smstype = 0; + req.setSmsType(smstype); + /* 是否国际/港澳台短信:0:表示国内短信,1:表示国际/港澳台短信。 */ + long international = 0; + req.setInternational(international); + /* 模板备注:例如申请原因,使用场景等 */ + String remark = "xxx"; + req.setRemark(remark); + /* 通过 client 对象调用 AddSmsTemplate 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 AddSmsTemplateResponse 类的实例,与请求对象对应 */ + AddSmsTemplateResponse res = client.AddSmsTemplate(req); + // 输出 JSON 格式的字符串回包 + System.out.println(AddSmsTemplateResponse.toJsonString(res)); + // 可以取出单个值,您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义 + System.out.println(res.getRequestId()); + } catch (TencentCloudSDKException e) { + e.printStackTrace(); + } + } +} diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/PullSmsSendStatus.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/PullSmsSendStatus.java new file mode 100644 index 000000000..e91750c48 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/PullSmsSendStatus.java @@ -0,0 +1,93 @@ +package com.jun.plugin.sms.utils; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; + +//导入可选配置类 +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; + +// 导入对应SMS模块的client +import com.tencentcloudapi.sms.v20210111.SmsClient; + +// 导入要请求接口对应的request response类 +import com.tencentcloudapi.sms.v20210111.models.PullSmsReplyStatusRequest; +import com.tencentcloudapi.sms.v20210111.models.PullSmsReplyStatusResponse; +import com.tencentcloudapi.sms.v20210111.models.PullSmsSendStatusRequest; +import com.tencentcloudapi.sms.v20210111.models.PullSmsSendStatusResponse; + +/** + * Tencent Cloud Sms PullSmsSendStatus + * + */ +public class PullSmsSendStatus { + public static void main(String[] args) { + try { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及你的财产安全。 + * CAM密匙查询: https://console.cloud.tencent.com/cam/capi*/ + Credential cred = new Credential("secretId", "secretKey"); + + // 实例化一个http选项,可选,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理 + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* SDK默认使用POST方法。 + * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + httpProfile.setReqMethod("POST"); + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + httpProfile.setConnTimeout(60); + /* SDK会自动指定域名。通常是不需要特地指定域名的,但是如果你访问的是金融区的服务 + * 则必须手动指定域名,例如sms的上海金融区域名: sms.ap-shanghai-fsi.tencentcloudapi.com */ + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + + /* 非必要步骤: + * 实例化一个客户端配置对象,可以指定超时时间等配置 */ + ClientProfile clientProfile = new ClientProfile(); + /* SDK默认用TC3-HMAC-SHA256进行签名 + * 非必要请不要修改这个字段 */ + clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,或者引用预设的常量 */ + SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile); + + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + PullSmsSendStatusRequest req = new PullSmsSendStatusRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * sms helper: https://cloud.tencent.com/document/product/382/3773 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + String sdkAppId = "1400009099"; + req.setSmsSdkAppId(sdkAppId); + + // 设置拉取最大条数,最多100条 + Long limit = 5L; + req.setLimit(limit); + + /* 通过 client 对象调用 PullSmsSendStatus 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 PullSmsSendStatusResponse 类的实例,与请求对象对应 */ + PullSmsSendStatusResponse res = client.PullSmsSendStatus(req); + + // 输出json格式的字符串回包 + System.out.println(PullSmsSendStatusResponse.toJsonString(res)); + + } catch (TencentCloudSDKException e) { + e.printStackTrace(); + } + } +} diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/SendSms.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/SendSms.java new file mode 100644 index 000000000..9c9478fbf --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/SendSms.java @@ -0,0 +1,156 @@ +package com.jun.plugin.sms.utils; + +import javax.annotation.Resource; + +import com.jun.plugin.common.service.HttpSessionService; +import org.springframework.stereotype.Component; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +//导入可选配置类 +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +// 导入对应SMS模块的client +import com.tencentcloudapi.sms.v20210111.SmsClient; +// 导入要请求接口对应的request response类 +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; + +/** + * Tencent Cloud Sms Sendsms + * + */ +@Component +public class SendSms { + @Resource + private HttpSessionService httpSessionService; + + public static void main(String[] args) { + // 验证码V1 + Sms smsv1 = new Sms(); + smsv1.setSdkAppId("1400595817"); + smsv1.setSignName("新博技术"); + smsv1.setSessionContext("session01"); + smsv1.setTemplateId("1199339"); + smsv1.setPhoneNumberSet(new String[]{"18572807207"});; + smsv1.setTemplateParamSet(new String[]{"3456","5"}); + + // 流程审批提醒 + Sms smsflow = new Sms(); + smsflow.setSdkAppId("1400595817"); + smsflow.setSignName("新博技术"); + smsflow.setSessionContext("session01"); + smsflow.setTemplateId("1199343"); + smsflow.setPhoneNumberSet(new String[]{"18572807207"});; + smsflow.setTemplateParamSet(null); + SendSms.send(smsflow); + } + + public static void send(Sms sms) { + try { + /* + * 必要步骤: 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及你的财产安全。 CAM密匙查询: https://console.cloud.tencent.com/cam/capi + */ + //密匙已禁用,后续抽到配置文件prod里面,不提交 + Credential cred = new Credential("AKIDb4KMAkBTZTAbmiQu98sOjpgHfokS2XzO", + "NfpspgP1YzJYghbP6hAXnx1yrgJkxvd5"); + + // 实例化一个http选项,可选,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理 + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* + * SDK默认使用POST方法。 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 + */ + httpProfile.setReqMethod("POST"); + /* + * SDK有默认的超时时间,非必要请不要进行调整 如有需要请在代码中查阅以获取最新的默认值 + */ + httpProfile.setConnTimeout(60); + /* + * SDK会自动指定域名。通常是不需要特地指定域名的,但是如果你访问的是金融区的服务 则必须手动指定域名,例如sms的上海金融区域名: + * sms.ap-shanghai-fsi.tencentcloudapi.com + */ + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + + /* + * 非必要步骤: 实例化一个客户端配置对象,可以指定超时时间等配置 + */ + ClientProfile clientProfile = new ClientProfile(); + /* + * SDK默认用TC3-HMAC-SHA256进行签名 非必要请不要修改这个字段 + */ + clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + /* + * 实例化要请求产品(以sms为例)的client对象 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,或者引用预设的常量 + */ + SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile); + /* + * 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 + */ + SendSmsRequest req = new SendSmsRequest(); + + /* + * 填充请求参数,这里request对象的成员变量即对应接口的入参 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: 帮助链接: 短信控制台: https://console.cloud.tencent.com/smsv2 sms helper: + * https://cloud.tencent.com/document/product/382/3773 + */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + String sdkAppId = sms.getSdkAppId();//""; + req.setSmsSdkAppId(sdkAppId); + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */ + String signName = sms.getSignName(); + req.setSignName(signName); + + /* 国际/港澳台短信 SenderId: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */ + String senderid = ""; + req.setSenderId(senderid); + + /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ + String sessionContext = sms.getSessionContext(); + req.setSessionContext(sessionContext); + + /* 短信号码扩展号: 默认未开通,如需开通请联系 [sms helper] */ + String extendCode = ""; + req.setExtendCode(extendCode); + + /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */ + String templateId = sms.getTemplateId(); + req.setTemplateId(templateId); + + /* + * 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] 示例如:+8613711112222, 其中前面有一个+号 + * ,86为国家码,13711112222为手机号,最多不要超过200个手机号 + */ + String[] phoneNumberSet = sms.getPhoneNumberSet(); + req.setPhoneNumberSet(phoneNumberSet); + + /* 模板参数: 若无模板参数,则设置为空 */ + String[] templateParamSet = sms.getTemplateParamSet(); + req.setTemplateParamSet(templateParamSet); + + /* + * 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 返回的 res 是一个 SendSmsResponse + * 类的实例,与请求对象对应 + */ + System.out.println("短信发送入参:"+SendSmsResponse.toJsonString(req)); + SendSmsResponse res = client.SendSms(req); + + // 输出json格式的字符串回包 + System.out.println("短信返回参数:"+SendSmsResponse.toJsonString(res)); + + // 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义 + System.out.println(res.getRequestId()); + + } catch (TencentCloudSDKException e) { + e.printStackTrace(); + } + } +} diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/SendStatusStatistics.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/SendStatusStatistics.java new file mode 100644 index 000000000..5ee0e5b37 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/SendStatusStatistics.java @@ -0,0 +1,101 @@ +package com.jun.plugin.sms.utils; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; + +//导入可选配置类 +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; + +// 导入对应SMS模块的client +import com.tencentcloudapi.sms.v20210111.SmsClient; + +// 导入要请求接口对应的request response类 +import com.tencentcloudapi.sms.v20210111.models.SendStatusStatisticsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendStatusStatisticsResponse; + +/** + * Tencent Cloud Sms SendStatusStatistics + * + */ +public class SendStatusStatistics { + public static void main(String[] args) { + try { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及你的财产安全。 + * CAM密匙查询: https://console.cloud.tencent.com/cam/capi*/ + Credential cred = new Credential("secretId", "secretKey"); + + // 实例化一个http选项,可选,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理 + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* SDK默认使用POST方法。 + * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + httpProfile.setReqMethod("POST"); + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + httpProfile.setConnTimeout(60); + /* SDK会自动指定域名。通常是不需要特地指定域名的,但是如果你访问的是金融区的服务 + * 则必须手动指定域名,例如sms的上海金融区域名: sms.ap-shanghai-fsi.tencentcloudapi.com */ + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + + /* 非必要步骤: + * 实例化一个客户端配置对象,可以指定超时时间等配置 */ + ClientProfile clientProfile = new ClientProfile(); + /* SDK默认用TC3-HMAC-SHA256进行签名 + * 非必要请不要修改这个字段 */ + clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,或者引用预设的常量 */ + SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile); + + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + SendStatusStatisticsRequest req = new SendStatusStatisticsRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * sms helper: https://cloud.tencent.com/document/product/382/3773 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + String sdkAppId = "1400009099"; + req.setSmsSdkAppId(sdkAppId); + + // 设置拉取最大条数,最多100条 + Long limit = 5L; + req.setLimit(limit); + /* 偏移量 注:目前固定设置为0 */ + Long offset = 0L; + req.setOffset(offset); + /* 开始时间,yyyymmddhh 需要拉取的起始时间,精确到小时 */ + String beginTime = "2019071100"; + req.setBeginTime(beginTime); + /* 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时 + * 注:EndTime 必须大于 beginTime */ + String endTime = "2019071123"; + req.setEndTime(endTime); + + /* 通过 client 对象调用 SendStatusStatistics 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 SendStatusStatisticsResponse 类的实例,与请求对象对应 */ + SendStatusStatisticsResponse res = client.SendStatusStatistics(req); + + // 输出json格式的字符串回包 + System.out.println(SendStatusStatisticsResponse.toJsonString(res)); + + } catch (TencentCloudSDKException e) { + e.printStackTrace(); + } + } +} diff --git a/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/Sms.java b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/Sms.java new file mode 100644 index 000000000..afd812e26 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/java/com/jun/plugin/sms/utils/Sms.java @@ -0,0 +1,14 @@ +package com.jun.plugin.sms.utils; + +import lombok.Data; + +@Data +public class Sms { + private String sdkAppId; + private String signName; + private String sessionContext; + private String templateId; + private String[] phoneNumberSet; + private String[] templateParamSet; + +} diff --git a/jun_api_online/jun_plugins/sms/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_plugins/sms/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..84d8aecd2 --- /dev/null +++ b/jun_api_online/jun_plugins/sms/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.sms.config.SmsAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/pom.xml b/jun_api_online/jun_plugins/snakerflow/pom.xml new file mode 100644 index 000000000..c27363efc --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + com.jun.plugin + snakerflow + 1.0 + jar + Snaker工作流 + + + + com.jun.plugin + jun_common + 1.0 + + + + + + com.github.snakerflow-starter + snakerflow-spring-boot-starter + 1.0.8 + + + mybatis-plus-boot-starter + com.baomidou + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/SnakerflowFacetsController.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/SnakerflowFacetsController.java new file mode 100644 index 000000000..4343dc3d1 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/SnakerflowFacetsController.java @@ -0,0 +1,551 @@ +package com.jun.plugin.snakerflow; + +import static org.snaker.engine.access.QueryFilter.DESC; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +//import com.jun.plugin.bizservice.service.BizCommonService; +import com.jun.plugin.snakerflow.ext.mapper.ExtLogMapper; +import com.jun.plugin.snakerflow.module.PageResponse; +import com.jun.plugin.snakerflow.module.Response; +import com.jun.plugin.snakerflow.process.SnakerEngineFacets; +import com.jun.plugin.snakerflow.process.SnakerHelper; +import org.apache.commons.lang.StringUtils; +import org.snaker.engine.SnakerEngine; +import org.snaker.engine.access.Page; +import org.snaker.engine.access.QueryFilter; +import org.snaker.engine.entity.HistoryOrder; +import org.snaker.engine.entity.HistoryTask; +import org.snaker.engine.entity.Order; +import org.snaker.engine.entity.Process; +import org.snaker.engine.entity.Task; +import org.snaker.engine.entity.WorkItem; +import org.snaker.engine.helper.AssertHelper; +import org.snaker.engine.helper.StreamHelper; +import org.snaker.engine.helper.StringHelper; +import org.snaker.engine.model.ProcessModel; +import org.snaker.engine.model.TaskModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +//import com.jun.plugin.system.entity.SysUser; +//import com.jun.plugin.system.mapper.SysUserMapper; +//import com.jun.plugin.system.service.HttpSessionService; +//import com.laker.admin.framework.aop.Metrics; +//import com.laker.admin.module.flow.SnakerflowFacetsController; +//import com.laker.admin.module.sys.entity.SysUser; +//import com.laker.admin.module.sys.service.ISysUserService; +//import com.jun.plugin.system.service.UserService; + +//import cn.dev33.satoken.annotation.SaCheckPermission; +//import cn.dev33.satoken.stp.StpUtil; +//import cn.dev33.satoken.annotation.SaCheckPermission; +//import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +//import com.laker.admin.framework.aop.Metrics; +//import com.laker.admin.framework.model.PageResponse; +//import com.laker.admin.framework.model.Response; +//import com.laker.admin.module.flow.process.SnakerEngineFacets; +//import com.laker.admin.module.flow.process.SnakerHelper; +//import com.laker.admin.module.sys.entity.SysUser; +//import com.laker.admin.module.sys.service.ISysUserService; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +@RestController +@RequestMapping("/flow") +@Slf4j +public class SnakerflowFacetsController { + +// @Resource +// HttpSessionService sessionService; + + @Autowired + private SnakerEngineFacets snakerEngineFacets; + +// @Resource +// private UserService sysUserService; + +// @Autowired +// private SysUserMapper sysuer; + + @Autowired + private ExtLogMapper bizCommonMapper; +// @Autowired +// private BizCommonService bizCommonService; + + /** + * ---------------------------------------------流程定义-------------------------------------------- + */ + /** + * 根据流程文件名称,在线部署流程 http://qixing.vip321.vip/flow/process/deploy/leave.snaker + * http://localhost:8081/flow/process/deploy/leave.snaker + * + * @return + */ + @ApiOperation(value = "根据流程文件名称,在线部署流程", tags = "流程引擎-流程部署") + @RequestMapping(value = "/process/deploy/{filename}", method = RequestMethod.GET) + // @Metrics + public Response processdeploy(@PathVariable("filename") String filename) { + snakerEngineFacets.initFlowsByName(filename); + return Response.ok(); + } + + /** + * 获取流程定义,获取流程定义的XML,根据流程ID + */ + @GetMapping("/getXml") + public Response processEdit(String id) { + Process process = snakerEngineFacets.getEngine().process().getProcessById(id); + if (process.getDBContent() != null) { + try { + return Response.ok(new String(process.getDBContent(), "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return Response.error("500", "xml异常"); + } + + /** + * 获取流程定义JOSN,根据流程定义的名称 + * + * @param processId + * @return + */ + @GetMapping(value = "/process/modelJson"/*, produces = "application/json;charset=UTF-8"*/) +// @GetMapping(value = "/process/modelJson", produces = "text/plain;charset=UTF-8") + @ApiOperation(value = "根据流程定义名称获取流程定义json", tags = "流程引擎-流程") + // @Metrics + public void getProcess(@RequestParam(required = false) String processId) throws IOException { + HttpServletResponse response = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse(); + assert response != null; + String json = ""; + if (StrUtil.isBlank(processId)) { + json = ""; + } + Process process = snakerEngineFacets.getEngine().process().getProcessById(processId); + AssertHelper.notNull(process); + ProcessModel processModel = process.getModel(); + if (processModel != null) { + json = SnakerHelper.getModelJson(processModel); + +// return json; + } + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(json); +// return null; + } + + /** + * 流程定义清单,查询列表 + */ + @ApiOperation(value = "根据给定的参数列表args分页查询process", tags = "流程引擎-流程") + @RequestMapping(value = "/process/list", method = RequestMethod.GET) + public Response processList(Page page, String displayName, String limit) { + QueryFilter filter = new QueryFilter(); + if (StringHelper.isNotEmpty(displayName)) { + filter.setDisplayName(displayName); + } + if (StringHelper.isNotEmpty(limit)) { + page.setPageSize(Integer.valueOf(limit)); + } + filter.orderBy("create_Time").order(DESC); + snakerEngineFacets.getEngine().process().getProcesss(page, filter); + return PageResponse.ok(JSONUtil.parse(page.getResult()), page.getTotalCount()); + } + + /** + * 根据流程定义ID,删除流程定义 + * + * @param id + * @return + */ + @ApiOperation(value = "根据流程定义ID,删除流程定义", tags = "流程引擎-流程") + @RequestMapping(value = "/process/delete/{id}", method = RequestMethod.GET) + // @Metrics + // @SaCheckPermission("flow.delete") + public Response processDelete(@PathVariable("id") String id) { + snakerEngineFacets.getEngine().process().undeploy(id); + return Response.ok(); + } + + /** + * 保存流程定义[web流程设计器] + * + * @param model + * @return + */ + @ApiOperation(value = "保存流程定义[web流程设计器]", tags = "流程引擎-流程") + @RequestMapping(value = "/process/deployXml", method = RequestMethod.POST) + // @SaCheckPermission("flow.update") + public boolean processDeploy(String model, String id, + @RequestParam(required = false, defaultValue = "false") boolean xmlHearder) { + InputStream input = null; + try { + String xml = ""; + if (!xmlHearder) { + xml = "\n"; + } + xml = xml + SnakerHelper.convertXml(model); + System.out.println("model xml=\n" + xml); + input = StreamHelper.getStreamFromString(xml); + if (StringUtils.isNotEmpty(id)) { + snakerEngineFacets.getEngine().process().redeploy(id, input); + } else { + snakerEngineFacets.getEngine().process().deploy(input); + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return true; + } + + /** + * + * @param processId + * @param orderId + * @return + */ + @ApiOperation(value = "流程定义+流程状态", tags = "流程引擎-流程") + @RequestMapping(value = "/process/json", method = RequestMethod.GET) + // @Metrics + public Object json(String processId, String orderId) { + if (StrUtil.isBlank(processId)) { + processId = snakerEngineFacets.getEngine().query().getHistOrder(orderId).getProcessId(); + } + Process process = snakerEngineFacets.getEngine().process().getProcessById(processId); + AssertHelper.notNull(process); + ProcessModel model = process.getModel(); + Map jsonMap = new HashMap(); + if (model != null) { + jsonMap.put("process", SnakerHelper.getModelJson(model)); + } + + if (StringUtils.isNotEmpty(orderId)) { + List tasks = snakerEngineFacets.getEngine().query() + .getActiveTasks(new QueryFilter().setOrderId(orderId)); + List historyTasks = snakerEngineFacets.getEngine().query() + .getHistoryTasks(new QueryFilter().setOrderId(orderId)); + jsonMap.put("state", SnakerHelper.getStateJson(model, tasks, historyTasks)); + } + log.info(jsonMap.get("state")); + // {"historyRects":{"rects":[{"paths":["TO 任务1"],"name":"开始"},{"paths":["TO + // 分支"],"name":"任务1"},{"paths":["TO 任务3","TO 任务4","TO 任务2"],"name":"分支"}]}} + return jsonMap; + } + + /** + * --------------------------------------------- 任务相关 + * --------------------------------------------- + */ + /** + * 根据当前用户查询待办任务列表 + */ + @GetMapping("/task/todoList") + @ApiOperation(value = "根据当前用户查询待办任务列表", tags = "流程引擎-任务") + public PageResponse userTaskTodoList(String username) { + if (org.springframework.util.StringUtils.isEmpty(username)) { + username = "sessionService.getCurrentUsername()"; + } + String usercode = "sessionService.getCurrentUsername()"; + Page page = new Page<>(30); + snakerEngineFacets.getEngine().query().getWorkItems(page, new QueryFilter().setOperator(username)); + return PageResponse.ok(page.getResult(), page.getTotalCount()); + } + + /** + * 根据当前用户查询待办任务列表 + */ + @GetMapping("/task/doneList") + @ApiOperation(value = "根据当前用户查询已办任务列表", tags = "流程引擎-任务") + public PageResponse userTaskdoneList() { + Page page = new Page<>(30); + snakerEngineFacets.getEngine().query().getHistoryWorkItems(page, + new QueryFilter().setOperator("sessionService.getCurrentUsername()")); + List items = page.getResult(); + return PageResponse.ok(page.getResult(), page.getTotalCount()); + } + + @GetMapping("/task/actor/add") + @ApiOperation(value = "根据流程实例id和任务名称,增加任务参与者", tags = "流程引擎-任务") + public Response addTaskActor(@RequestParam("orderId") String orderId, @RequestParam("taskName") String taskName, + @RequestParam("operator") String operator) { + List tasks = snakerEngineFacets.getEngine().query().getActiveTasks(new QueryFilter().setOrderId(orderId)); + for (Task task : tasks) { + if (task.getTaskName().equalsIgnoreCase(taskName) && StringUtils.isNotEmpty(operator)) { + snakerEngineFacets.getEngine().task().addTaskActor(task.getId(), operator); + } + } + return Response.ok(); + } + + @GetMapping("/task/tip") + @ApiOperation(value = "根据流程实例id和任务名称,查找当前任务的到达时间和待执行人", tags = "流程引擎-任务") + public Response taskTip(String orderId, String taskName) { + List tasks = snakerEngineFacets.getEngine().query().getActiveTasks(new QueryFilter().setOrderId(orderId)); + StringBuilder builder = new StringBuilder(); + String createTime = ""; + String finishTime = ""; + String taskOperatorFlag = ""; + String taskOperatorMsg = ""; + boolean find = false; + for (Task task : tasks) { + if (task.getTaskName().equalsIgnoreCase(taskName)) { + String[] actors = snakerEngineFacets.getEngine().query().getTaskActorsByTaskId(task.getId()); + String.join(",",actors); + for (String actor : actors) { +// SysUser sysUser = sysuer.getUserByName(actor); +// if (sysUser!=null) { +// String name = sysUser.getRealName(); +// if (!builder.toString().contains(name)) { +// builder.append(name).append(","); +// } +// }else{ +// //builder.append("用户【"+actor+"】不存在 ").append(","); +// +// } + find = true; + } + createTime = task.getCreateTime(); + taskOperatorFlag = String.valueOf(task.getVariableMap().get("taskOperatorFlag")); + taskOperatorMsg = String.valueOf(task.getVariableMap().get("taskOperatorMsg")); + } + } + if (!find) { + List historyTasks = snakerEngineFacets.getEngine().query() + .getHistoryTasks(new QueryFilter().setOrderId(orderId)); + for (HistoryTask task : historyTasks) { + if (task.getTaskName().equalsIgnoreCase(taskName)) { + String[] actors = snakerEngineFacets.getEngine().query().getHistoryTaskActorsByTaskId(task.getId()); + for (String actor : actors) { +// // SysUser sysUser = sysUserService.getById(String.valueOf(actor)); +// SysUser sysUser = sysuer.getUserByName(actor); +// if (sysUser != null) { +// String nickName = sysUser.getRealName(); +// if (!builder.toString().contains(nickName)) { +// builder.append(nickName).append(","); +// } +// } + } + createTime = task.getCreateTime(); + finishTime = task.getFinishTime(); + taskOperatorFlag = String.valueOf(task.getVariableMap().get("taskOperatorFlag")); + taskOperatorMsg = String.valueOf(task.getVariableMap().get("taskOperatorMsg")); + } + } + } + if (builder.length() > 0) { + builder.deleteCharAt(builder.length() - 1); + } + Map data = new HashMap(); + data.put("actors", builder.toString()); + data.put("createTime", createTime); + data.put("finishTime", finishTime); + data.put("taskOperatorFlag", taskOperatorFlag); + data.put("taskOperatorMsg", taskOperatorMsg); + return Response.ok(data); + } + + /** + * 活动任务的驳回 + */ + @GetMapping("/task/reject") + @ApiOperation(value = "\t 【审批任务】驳回,根据任务主键ID,操作人ID,参数列表执行任务,并且根据nodeName跳转到任意节点\n" + + "\t 1、nodeName为null时,则跳转至上一步处理\n" + "\t 2、nodeName不为null时,则任意跳转,即动态创建转移", tags = "流程引擎-任务") + public Response activeTaskReject(String taskId, String nodeName, String reason) { + Dict rejectReason = Dict.create() + // 拒绝原因,建议单独搞个 审核表 审核的comment file单独存储 + .set("rejectReason", reason); + Map args = new HashMap(8); + args.put("taskOperator", "sessionService.getCurrentUsername()"); + args.put("taskOperatorMsg", "驳回原因,填写有问题,不能XXX,需要XXX!"); + args.put("taskOperatorFlag", "处理结果:驳回"); + snakerEngineFacets.executeAndJump(taskId, "sessionService.getCurrentUsername()", args, nodeName); + return Response.ok(); + } + + /** + * 活动任务的驳回-驳回到发起人 + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + @GetMapping("/task/rejectToCreate") + @ApiOperation(value = "【任务驳回】驳回到发起人", tags = "流程引擎-任务") + public Response activeTaskReject(String taskId, String taskOperatorFlag, String taskOperatorMsg, + String operatorNextid, String operatorNext) { + List workItems = snakerEngineFacets.getEngine().query().getWorkItems(null, + new QueryFilter().setTaskId(taskId)); + if (CollUtil.isEmpty(workItems)) { + Response.error("500", "不存在任务喽"); + } + WorkItem workItem = workItems.get(0); + Process process = snakerEngineFacets.getEngine().process().getProcessById(workItem.getProcessId()); + ProcessModel model = process.getModel(); + // 获取开始节点下面的第一个节点 + String name = model.getStart().getOutputs().get(0).getTarget().getName(); + Map args = new HashMap(8); + args.put("taskOperator", "sessionService.getCurrentUsername()"); + args.put("taskOperatorName", operatorNext); + args.put("taskOperatorMsg", taskOperatorMsg); + args.put("taskOperatorFlag", taskOperatorFlag); + snakerEngineFacets.executeAndJump(taskId, "sessionService.getCurrentUsername()", args, name); + return Response.ok(); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @RequestMapping(value = "/task/approval", method = RequestMethod.GET) + @ApiOperation(value = "【审批任务】同意", tags = "流程引擎-任务") + public Response doApproval(String taskId, String flag, String taskOperatorFlag, String taskOperatorMsg, + String operatorNextid, String operatorNext, String processName, String processId) { + Task task1 = snakerEngineFacets.getEngine().query().getTask(taskId);// 查询当前任务节点信息 + String orderId = task1.getOrderId(); + String taskName = task1.getTaskName(); + String processNameEn = String.valueOf(task1.getVariableMap().get("processName"));// 获取流程名称 + String businessId = String.valueOf(task1.getVariableMap().get("businessId"));// 获取流程名称 + Process process = snakerEngineFacets.getEngine().process().getProcessByName(processNameEn);// 获取流程实例信息 + List tm = process.getModel().getNode(task1.getTaskName()).getNextModels(TaskModel.class);// 获取流程下一环节节点信息 + if (!"0".equals(flag) && tm.size() > 0 && operatorNextid != null && operatorNextid.length() < 1) {// flag:0|1,判断节点的分支属性;下一环节处理人 + return Response.error("1010", "流程审批人不能为空(驳回及非最终环节)!"); + } + if (tm == null || tm.size() == 0) { + log.info("流程结束!" + processNameEn, "orderId=" + orderId); + //@TODO wujun 改定时任务处理 + String errMsg = ""; + //bizCommonService.doAfterFlowFinish(processNameEn, orderId, businessId, taskName); + if (errMsg.length() > 0) { + Response.error("2022", errMsg); + } + } + Map args = new HashMap(8); + args.put("taskOperator", "sessionService.getCurrentUsername()"); + args.put("taskOperatorName", operatorNext); + args.put("taskOperatorMsg", taskOperatorMsg); + args.put("taskOperatorFlag", taskOperatorFlag); + try { + args.put("flag", Integer.valueOf(flag)); + } catch (NumberFormatException e) { + log.error("flag Integer.valueOf(flag) NumberFormatException 暂不处理 "); + e.printStackTrace(); + } + List tasks = snakerEngineFacets.execute(taskId, "sessionService.getCurrentUsername()", args); + for (Task task : tasks) { + snakerEngineFacets.getEngine().task().addTaskActor(task.getId(), operatorNextid.split(",")); + } + return Response.ok(); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @RequestMapping(value = "/task/submit", method = { RequestMethod.GET, RequestMethod.POST }) + @ApiOperation(value = "【提交任务】", tags = "流程引擎-任务") + public Response doSubmitTask(@RequestBody Map param) { + String processName = MapUtil.getStr(param, "processName"); + String taskNewName = MapUtil.getStr(param, "taskNewName"); + String taskOperatorMsg = MapUtil.getStr(param, "taskOperatorMsg"); + String operatorNextid = MapUtil.getStr(param, "operatorNextid"); + String operatorNext = MapUtil.getStr(param, "operatorNext"); + String taskOperatorFlag = MapUtil.getStr(param, "taskOperatorFlag"); + String businessId = MapUtil.getStr(param, "businessId"); +// SysUser user = sysUserService.getById(sessionService.getCurrentUserId()); + // + String orderName = taskNewName; + List> list = WorkflowsConfig.getList(); + for (Map item : list) { + if (processName.equalsIgnoreCase(item.get("processName"))) { +// String step1 = item.get("step1"); +// String step2 = item.get("step2"); + String tname = item.get("tname"); +// String process = item.get("process"); + String taskName = item.get("taskName"); + if (orderName == null || orderName.length() < 1) { + //@TODO wujun +// orderName = user.getRealName() + taskName /* + PrimaryKeyService.getOrderIdPrefix(new Date()) */; + } + Map args = new HashMap(8); + args.put("taskOperator", "sessionService.getCurrentUsername()"); + args.put("step1", "sessionService.getCurrentUsername()"); + args.put("step2", operatorNextid.split(",")); + args.put("processName", processName); + args.put("tname", tname); + args.put("businessId", businessId); + args.put("taskOperatorMsg", taskOperatorMsg); + args.put("taskOperatorFlag", taskOperatorFlag); + args.put(SnakerEngine.ID, orderName); + Order order = snakerEngineFacets.startAndExecute(processName, null, "sessionService.getCurrentUsername()", + args); + if (businessId.contains(",")) { + for (String id : businessId.split(",")) { + bizCommonMapper.updateRecordByColumnValue(tname, "order_id", order.getId(), id); + } + } else { + bizCommonMapper.updateRecordByColumnValue(tname, "order_id", order.getId(), businessId); + } + return Response.ok(); + } + } + return Response.error("2010", "流程配置有问题!"); + } + + /** + * 历史任务撤回,这玩意只能撤回刚发出的且没有被处理的 + * + * @param taskId + * @return + */ + @GetMapping("/task/undo") + @ApiOperation(value = "根据任务主键id、操作人撤回任务", tags = "流程引擎-任务") + public Response historyTaskUndo(String taskId) { + snakerEngineFacets.getEngine().task().withdrawTask(taskId, "sessionService.getCurrentUsername()"); + return Response.ok(); + } + + @GetMapping("/task/transferMajor") + @ApiOperation(value = "转办", tags = "流程引擎-任务") + public Response transferMajor(String taskId, String nextOperator) { + snakerEngineFacets.transferMajor(taskId, "sessionService.getCurrentUsername()", nextOperator.split(",")); + return Response.ok(); + } + + /** + * ------------------ 流程 + */ + /** + * 流程实例管理 + */ + @ApiOperation(value = "流程分页查询", tags = "流程引擎-流程实例") + @RequestMapping(value = "/order/list", method = RequestMethod.GET) + public Response orderList(Page page, String displayName) { + QueryFilter filter = new QueryFilter(); + if (StringHelper.isNotEmpty(displayName)) { + filter.setDisplayName(displayName); + } + filter.orderBy("create_Time").order(DESC); + snakerEngineFacets.getEngine().query().getHistoryOrders(page, filter); + return PageResponse.ok(JSONUtil.parse(page.getResult()), page.getTotalCount()); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/StatisticsController.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/StatisticsController.java new file mode 100644 index 000000000..c0485dbcc --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/StatisticsController.java @@ -0,0 +1,49 @@ +package com.jun.plugin.snakerflow; + +import java.util.List; + +import javax.annotation.Resource; + +import com.jun.plugin.snakerflow.module.Response; +import com.jun.plugin.snakerflow.process.SnakerEngineFacets; +import org.snaker.engine.access.QueryFilter; +import org.snaker.engine.entity.HistoryTask; +import org.snaker.engine.entity.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +//import com.laker.admin.module.ext.mapper.ExtLogMapper; +//import com.jun.plugin.system.service.HttpSessionService; + +//import cn.dev33.satoken.stp.StpUtil; +//import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.lang.Dict; + +@RestController +@RequestMapping("/sys/statistics") +public class StatisticsController { + @Autowired + private SnakerEngineFacets snakerEngineFacets; +// @Resource +// HttpSessionService sessionService; +// @Autowired +// ExtLogMapper extLogMapper; + + + @GetMapping("/console") + public Response get() { + //获取当前登陆人 + String userId = "admin";//sessionService.getCurrentUsername(); + List activeTasks = snakerEngineFacets.getEngine().query() + .getActiveTasks(new QueryFilter().setOperator(userId)); + List historyTasks = snakerEngineFacets.getEngine().query() + .getHistoryTasks(new QueryFilter().setOperator(userId)); + Dict res = Dict.create().set("todo", activeTasks.size()) + .set("done", historyTasks.size()) + .set("ip", "IP地址") + .set("online", 0); + return Response.ok(res); + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/WorkflowsConfig.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/WorkflowsConfig.java new file mode 100644 index 000000000..8f9abbb43 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/WorkflowsConfig.java @@ -0,0 +1,23 @@ +package com.jun.plugin.snakerflow; + +import java.util.List; +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "workflows") +public class WorkflowsConfig { + + public static List> list; //static 才能拿配置值 + + public static List> getList() { + return list; + } + + public void setList(List> list) { + WorkflowsConfig.list = list; + } + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/config/SankerflowAutoConfig.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/config/SankerflowAutoConfig.java new file mode 100644 index 000000000..622003bdd --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/config/SankerflowAutoConfig.java @@ -0,0 +1,15 @@ +package com.jun.plugin.snakerflow.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.snakerflow") +@MapperScan(basePackages = "com.jun.plugin.snakerflow.**.mapper") +public class SankerflowAutoConfig { +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/controller/ExtLeaveController.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/controller/ExtLeaveController.java new file mode 100644 index 000000000..00dfdccc8 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/controller/ExtLeaveController.java @@ -0,0 +1,131 @@ +package com.jun.plugin.snakerflow.ext.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import com.jun.plugin.snakerflow.ext.entity.ExtLeave; +import com.jun.plugin.snakerflow.ext.service.IExtLeaveService; +import com.jun.plugin.snakerflow.module.PageResponse; +import com.jun.plugin.snakerflow.module.Response; +import org.snaker.engine.SnakerEngine; +import org.snaker.engine.entity.Order; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.snakerflow.process.BaseFlowController; +import com.jun.plugin.snakerflow.process.SnakerEngineFacets; +//import com.jun.plugin.system.entity.SysUser; +//import com.jun.plugin.system.service.HttpSessionService; +//import com.jun.plugin.system.service.UserService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import io.swagger.annotations.ApiOperation; + +/** + *

+ * 前端控制器 + *

+ * + * + * @since 2021-08-19 + */ +@RestController +@RequestMapping("/ext/leave") +//@Metrics +public class ExtLeaveController extends BaseFlowController{ +// @Resource +// HttpSessionService sessionService; + @Autowired + IExtLeaveService extLeaveService; + @Autowired + private SnakerEngineFacets snakerEngineFacets; +// @Autowired +// private UserService sysUserService; + + @GetMapping + @ApiOperation(value = "分页查询") + public PageResponse pageAll(@RequestParam(required = false, defaultValue = "1") long page, + @RequestParam(required = false, defaultValue = "10") long limit) { + Page roadPage = new Page<>(page, limit); + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); + queryWrapper.orderByDesc(ExtLeave::getCreateTime); + Page pageList = extLeaveService.page(roadPage, queryWrapper); + List records = pageList.getRecords(); + records.forEach(extLeave -> { + if(extLeave.getOrderId()!=null && extLeave.getOrderId().length()>0) { + //extLeave.setCreateUser(sysUserService.getById(extLeave.getCreateBy())); + this.setFlowStatusInfo(extLeave); + } + + }); + return PageResponse.ok(records, pageList.getTotal()); + } + + @SuppressWarnings("unchecked") + @PostMapping + @ApiOperation(value = "发起请假") + @Transactional(rollbackFor = Exception.class) + public Response saveOrUpdate(@RequestBody ExtLeave param) { + if (param.getLeaveId() == null) { + param.setLeaveUserId(String.valueOf("sessionService.getCurrentUsername()")); + Map args = new HashMap(8); + args.put("day", param.getLeaveDay()); + Order leave = this.doCreateTask("leave", args); + param.setOrderId(leave.getId()); + extLeaveService.saveOrUpdate(param); + } else { + extLeaveService.saveOrUpdate(param); + } + return Response.ok(); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public Order doCreateTask(String processName, Map map) { + Map args = new HashMap(8); + args.putAll(map); + // 当前登录人 + args.put("step1", "sessionService.getCurrentUsername()"); + // 部门经理岗位的人 去用户表查询当前登录人同部门 and 岗位 = 部门经理 + args.put("step2", new String[]{"admin","wangwei"}); + // 总经理岗位的人 去用户表查询当前登录人同部门 and 岗位 = 总经理 +// args.put("step3", "admin"); + + args.put("process", "admin"); + //SysUser user = sysUserService.getById(sessionService.getCurrentUserId()); + args.put(SnakerEngine.ID, /*user.getRealName()*/ "admin" + "-" + DateUtil.now() + "的请假申请!!!"); + Order order = snakerEngineFacets.startAndExecute(processName, 0, "sessionService.getCurrentUsername()", args); + return order; + } + + @GetMapping("/{id}") + @ApiOperation(value = "根据id查询") + public Response get(@PathVariable Long id) { + return Response.ok(extLeaveService.getById(id)); + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "根据id删除") + public Response delete(@PathVariable Long id) { + return Response.ok(extLeaveService.removeById(id)); + } + + @DeleteMapping("/batch/{ids}") + @ApiOperation(value = "根据批量删除ids删除") + public Response batchRemove(@PathVariable Long[] ids) { + return Response.ok(extLeaveService.removeByIds(CollUtil.toList(ids))); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/controller/ExtLogController.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/controller/ExtLogController.java new file mode 100644 index 000000000..536eb72d0 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/controller/ExtLogController.java @@ -0,0 +1,85 @@ +package com.jun.plugin.snakerflow.ext.controller; + +import java.util.List; + +import com.jun.plugin.snakerflow.ext.entity.ExtLog; +import com.jun.plugin.snakerflow.ext.service.IExtLogService; +import com.jun.plugin.snakerflow.module.PageResponse; +import com.jun.plugin.snakerflow.module.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.snakerflow.ext.mapper.ExtLogMapper; +import com.jun.plugin.snakerflow.ext.vo.LogStatisticsTop10Vo; +import com.jun.plugin.snakerflow.ext.vo.LogStatisticsVo; + +import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiOperation; + +/** + *

+ * 日志 前端控制器 + *

+ * + * + * @since 2021-08-16 + */ +@RestController +@RequestMapping("/ext/log") +//@Metrics +public class ExtLogController { + @Autowired + IExtLogService extLogService; + + @Autowired + ExtLogMapper extLogMapper; + +// @Autowired +// ISysUserService sysUserService; + + @GetMapping + @ApiOperation(value = "日志分页查询") + //@SaCheckPermission("log.list") + public PageResponse pageAll(@RequestParam(required = false, defaultValue = "1") long page, + @RequestParam(required = false, defaultValue = "10") long limit, + String keyWord) { + Page roadPage = new Page<>(page, limit); + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); + if (StrUtil.isNotBlank(keyWord)) { + queryWrapper.like(ExtLog::getRequest, keyWord); + } + queryWrapper.orderByDesc(ExtLog::getCreateTime); + Page pageList = extLogService.page(roadPage, queryWrapper); + List records = pageList.getRecords(); + records.forEach(extLog -> { + if (extLog.getUserId() != null) { +// 设置日志用户名称 +// SysUser sysUser = sysUserService.getById(extLog.getUserId()); +// extLog.setUser(sysUser); + } + + }); + return PageResponse.ok(records, pageList.getTotal()); + } + + + @GetMapping("/visits7day") + @ApiOperation(value = "7天访问量") + public Response visits7day() { + List logStatisticsVo = extLogMapper.selectStatistics7Day(); + return Response.ok(logStatisticsVo); + } + + @GetMapping("/visitsTop10IP") + @ApiOperation(value = "visitsTop10IP") + public PageResponse visitsTop10IP() { + List logStatisticsVo = extLogMapper.selectStatisticsVisitsTop10IP(); + return PageResponse.ok(logStatisticsVo, 10L); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/entity/ExtLeave.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/entity/ExtLeave.java new file mode 100644 index 000000000..37228292a --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/entity/ExtLeave.java @@ -0,0 +1,71 @@ +package com.jun.plugin.snakerflow.ext.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jun.plugin.snakerflow.process.BaseFlowStatus; +//import com.jun.plugin.system.entity.SysUser; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * + * @since 2021-08-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ExtLeave extends BaseFlowStatus implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "leave_id", type = IdType.AUTO) + private Long leaveId; + + /** + * 请假天数 + */ + private Integer leaveDay; + + /** + * 请假原因 + */ + private String leaveReason; + + /** + * 请假人id + */ + private String leaveUserId; + +// @TableField(exist = false) +// private SysUser createUser; + + /** + * 创建人 + */ + @TableField(value = "create_by" ,fill = FieldFill.INSERT) + private Long createBy; + + /** + * 创建人部门 + */ + @TableField(value = "create_dept_id" ,fill = FieldFill.INSERT) + private Long createDeptId; + + /** + * 创建时间 + */ +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(value = "create_time" ,fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/entity/ExtLog.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/entity/ExtLog.java new file mode 100644 index 000000000..a215af90e --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/entity/ExtLog.java @@ -0,0 +1,80 @@ +package com.jun.plugin.snakerflow.ext.entity; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +//import com.jun.plugin.system.entity.SysUser; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 日志 + *

+ * + * + * @since 2021-08-16 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ExtLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "log_id", type = IdType.AUTO) + private Long logId; + + /** + * 用户id + */ + private Long userId; +// @TableField(exist = false) +// private SysUser user; + + /** + * ip地址 + */ + private String ip; + + private String city; + + /** + * 浏览器或者app信息 + */ + private String client; + private String uri; + private String method; + + /** + * 请求 + */ + private String request; + + /** + * 响应 + */ + private String response; + + private Boolean status; + + /** + * 耗时ms + */ + private Integer cost; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime createTime; + + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/mapper/ExtLeaveMapper.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/mapper/ExtLeaveMapper.java new file mode 100644 index 000000000..2f955717a --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/mapper/ExtLeaveMapper.java @@ -0,0 +1,16 @@ +package com.jun.plugin.snakerflow.ext.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.snakerflow.ext.entity.ExtLeave; + +/** + *

+ * Mapper 接口 + *

+ * + * + * @since 2021-08-19 + */ +public interface ExtLeaveMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/mapper/ExtLogMapper.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/mapper/ExtLogMapper.java new file mode 100644 index 000000000..00cde9172 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/mapper/ExtLogMapper.java @@ -0,0 +1,55 @@ +package com.jun.plugin.snakerflow.ext.mapper; + +import java.util.List; + +import com.jun.plugin.snakerflow.ext.entity.ExtLog; +import com.jun.plugin.snakerflow.ext.vo.LogStatisticsTop10Vo; +import com.jun.plugin.snakerflow.ext.vo.LogStatisticsVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 日志 Mapper 接口 + *

+ * + * + * @since 2021-08-16 + */ +@Mapper +public interface ExtLogMapper extends BaseMapper { + + + @Select("select DATE_FORMAT(create_time,'%Y-%m-%d') date,count(*) value from ext_log where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= create_time group by date ORDER BY create_time ") + List selectStatistics7Day(); + + @Select("SELECT\n" + + "\tw.ip,\n" + + "\tcity,\n" + + "\tcount( * ) \n" + + "\tVALUE\t\n" + + "FROM\n" + + "\text_log w \n" + + "WHERE\n" + + "\tDATE_SUB( CURDATE( ), INTERVAL 1 day ) <= w.create_time \n" + + "GROUP BY\n" + + "\tw.ip \n" + + "ORDER BY\n" + + "\t\n" + + "VALUE\n" + + "DESC \n" + + "LIMIT 10") + List selectStatisticsVisitsTop10IP(); + + @Select("SELECT count(DISTINCT ip) from ext_log") + int selectDistinctIp(); + + @Update(" update ${tableName} set ${columnName} = #{columnValue} where id = #{id} ") + int updateRecordByColumnValue(@Param("tableName") String tableName, @Param("columnName") String columnName, + @Param("columnValue") String columnValue, @Param("id") String id); + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/IExtLeaveService.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/IExtLeaveService.java new file mode 100644 index 000000000..395ea1fa2 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/IExtLeaveService.java @@ -0,0 +1,16 @@ +package com.jun.plugin.snakerflow.ext.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.snakerflow.ext.entity.ExtLeave; + +/** + *

+ * 服务类 + *

+ * + * + * @since 2021-08-19 + */ +public interface IExtLeaveService extends IService { + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/IExtLogService.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/IExtLogService.java new file mode 100644 index 000000000..d16066c09 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/IExtLogService.java @@ -0,0 +1,16 @@ +package com.jun.plugin.snakerflow.ext.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.snakerflow.ext.entity.ExtLog; + +/** + *

+ * 日志 服务类 + *

+ * + * + * @since 2021-08-16 + */ +public interface IExtLogService extends IService { + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/impl/ExtLeaveServiceImpl.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/impl/ExtLeaveServiceImpl.java new file mode 100644 index 000000000..414f2cb94 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/impl/ExtLeaveServiceImpl.java @@ -0,0 +1,21 @@ +package com.jun.plugin.snakerflow.ext.service.impl; + +import com.jun.plugin.snakerflow.ext.entity.ExtLeave; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.snakerflow.ext.mapper.ExtLeaveMapper; +import com.jun.plugin.snakerflow.ext.service.IExtLeaveService; + +/** + *

+ * 服务实现类 + *

+ * + * + * @since 2021-08-19 + */ +@Service +public class ExtLeaveServiceImpl extends ServiceImpl implements IExtLeaveService { + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/impl/ExtLogServiceImpl.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/impl/ExtLogServiceImpl.java new file mode 100644 index 000000000..a56c3ca08 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/service/impl/ExtLogServiceImpl.java @@ -0,0 +1,21 @@ +package com.jun.plugin.snakerflow.ext.service.impl; + +import com.jun.plugin.snakerflow.ext.entity.ExtLog; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.snakerflow.ext.mapper.ExtLogMapper; +import com.jun.plugin.snakerflow.ext.service.IExtLogService; + +/** + *

+ * 日志 服务实现类 + *

+ * + * + * @since 2021-08-16 + */ +@Service +public class ExtLogServiceImpl extends ServiceImpl implements IExtLogService { + +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/vo/LogStatisticsTop10Vo.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/vo/LogStatisticsTop10Vo.java new file mode 100644 index 000000000..1c9d92c90 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/vo/LogStatisticsTop10Vo.java @@ -0,0 +1,11 @@ +package com.jun.plugin.snakerflow.ext.vo; + +import lombok.Data; + +@Data +public class LogStatisticsTop10Vo { + + private String ip; + private String city; + private Integer value; +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/vo/LogStatisticsVo.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/vo/LogStatisticsVo.java new file mode 100644 index 000000000..92c5e55b0 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/ext/vo/LogStatisticsVo.java @@ -0,0 +1,10 @@ +package com.jun.plugin.snakerflow.ext.vo; + +import lombok.Data; + +@Data +public class LogStatisticsVo { + + private String date; + private Integer value; +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyCustomHandler.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyCustomHandler.java new file mode 100644 index 000000000..7ffefa5cd --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyCustomHandler.java @@ -0,0 +1,29 @@ +package com.jun.plugin.snakerflow.module; + +import lombok.extern.slf4j.Slf4j; +import org.snaker.engine.core.Execution; +import org.snaker.engine.entity.Task; +import org.snaker.engine.handlers.IHandler; + +import java.util.List; +import java.util.Map; + +/** + * 自定义模型操作处理类,用于完成流程的全自动编排 + * https://yunmel.gitbooks.io/snakerflow/content/4xiang-xi-shuo-ming/418-zi-ding-yi-jie-dian.html + */ +@Slf4j +public class EasyCustomHandler implements IHandler { + @Override + public void handle(Execution execution) { + // 获取参数 + Map args = execution.getArgs(); + args.forEach((s, o) -> System.out.println(s + ":" + o)); + List tasks = execution.getTasks(); + tasks.forEach(task -> { + System.out.println(task.getTaskName()); + }); + + + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyGlobalCreateTaskInterceptor.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyGlobalCreateTaskInterceptor.java new file mode 100644 index 000000000..88adf44a1 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyGlobalCreateTaskInterceptor.java @@ -0,0 +1,37 @@ + +package com.jun.plugin.snakerflow.module; + +import lombok.extern.slf4j.Slf4j; +import org.snaker.engine.SnakerInterceptor; +import org.snaker.engine.core.Execution; +import org.snaker.engine.entity.Task; +import org.springframework.stereotype.Component; + +/** + * Easy Admin 全局拦截器(只拦截创建任务) 可用于任务到达时的短信提醒 + * 无需其他配置 + */ +@Component +@Slf4j +public class EasyGlobalCreateTaskInterceptor implements SnakerInterceptor { + /** + * 拦截产生的任务对象,打印日志 + */ + @Override + public void intercept(Execution execution) { + for (Task task : execution.getTasks()) { + StringBuffer buffer = new StringBuffer(100); + buffer.append("创建任务[标识=").append(task.getId()); + buffer.append(",名称=").append(task.getDisplayName()); + buffer.append(",创建时间=").append(task.getCreateTime()); + buffer.append(",参与者={"); + if (task.getActorIds() != null) { + for (String actor : task.getActorIds()) { + buffer.append(actor).append(";"); + } + } + buffer.append("}]"); + log.info(buffer.toString()); + } + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyPartEndProcessInterceptor.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyPartEndProcessInterceptor.java new file mode 100644 index 000000000..1dfbbeadb --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/EasyPartEndProcessInterceptor.java @@ -0,0 +1,37 @@ + +package com.jun.plugin.snakerflow.module; + +import lombok.extern.slf4j.Slf4j; +import org.snaker.engine.SnakerInterceptor; +import org.snaker.engine.core.Execution; +import org.snaker.engine.entity.Task; + +/** + * Easy Admin 局部拦截器,这里需要配置在 xml中,postInterceptors = com.laker.admin.framework.ext.snakerflow.EasyPartEndProcessInterceptor + * 这里以流程结束拦截为例,例如配置 某些流程结束 短信通知报告发起人 + * 不需要注解了,反射实例化的 + */ +@Slf4j +public class EasyPartEndProcessInterceptor implements SnakerInterceptor { + /** + * 拦截产生的任务对象,打印日志 + */ + @Override + public void intercept(Execution execution) { + + for (Task task : execution.getTasks()) { + StringBuffer buffer = new StringBuffer(100); + buffer.append("创建任务[标识=").append(task.getId()); + buffer.append(",名称=").append(task.getDisplayName()); + buffer.append(",创建时间=").append(task.getCreateTime()); + buffer.append(",参与者={"); + if (task.getActorIds() != null) { + for (String actor : task.getActorIds()) { + buffer.append(actor).append(";"); + } + } + buffer.append("}]"); + log.info(buffer.toString()); + } + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/GeneralCompletion.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/GeneralCompletion.java new file mode 100644 index 000000000..a570a303d --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/GeneralCompletion.java @@ -0,0 +1,28 @@ +package com.jun.plugin.snakerflow.module; + +import lombok.extern.slf4j.Slf4j; +import org.snaker.engine.Completion; +import org.snaker.engine.entity.HistoryOrder; +import org.snaker.engine.entity.HistoryTask; +import org.springframework.stereotype.Component; + +/** + * 任务、实例完成时触发动作的接口 + */ +@Component +@Slf4j +public class GeneralCompletion implements Completion { + + @Override + public void complete(HistoryTask task) { + + log.info("The task[{}] has been user[{}] has completed", task, task.getOperator()); + } + + @Override + public void complete(HistoryOrder order) { + + + log.info("The order[{}] has completed", order); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/PageResponse.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/PageResponse.java new file mode 100644 index 000000000..7752fd32c --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/PageResponse.java @@ -0,0 +1,31 @@ +package com.jun.plugin.snakerflow.module; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @author longli + */ +@ApiModel +public class PageResponse extends Response { + + @ApiModelProperty(notes = "数量") + private Long count; + + public PageResponse(String code, String msg, T data, Long count) { + super(code, msg, data); + this.count = count; + } + + public static PageResponse ok(T data, Long count) { + return new PageResponse<>("0", "", data, count); + } + + public Long getCount() { + return count; + } + + public void setCount(Long count) { + this.count = count; + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/Response.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/Response.java new file mode 100644 index 000000000..d7bd257a6 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/module/Response.java @@ -0,0 +1,58 @@ +package com.jun.plugin.snakerflow.module; + +import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.slf4j.MDC; +import org.springframework.context.annotation.DependsOn; + +/** + * @author longli + */ +@Data +@AllArgsConstructor +@ApiModel +@DependsOn +public class Response { + @ApiModelProperty(notes = "响应码,非0 即为异常", example = "0") + private final String code; + @ApiModelProperty(notes = "响应消息", example = "提交成功") + private final String msg; + @ApiModelProperty(notes = "响应数据") + private final T data; + @ApiModelProperty(notes = "请求id") + private final String requestId; + + @ApiModelProperty(notes = "请求id") + private final Boolean success; + + public Response(String code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + this.success = StrUtil.equals("0", code); + this.requestId = MDC.get("requestId"); + } + + public static Response ok(T data) { + return new Response<>("0", "操作成功", data); + } + + public static Response ok() { + return new Response("0", "操作成功", null); + } + + public static Response error(T data) { + return new Response<>("400", "", data); + } + + public static Response error(String code, String msg, T data) { + return new Response<>(code, msg, data); + } + + public static Response error(String code, String msg) { + return new Response<>(code, msg, null); + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/BaseFlowController.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/BaseFlowController.java new file mode 100644 index 000000000..b820d3b33 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/BaseFlowController.java @@ -0,0 +1,115 @@ +package com.jun.plugin.snakerflow.process; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Resource; + +import org.snaker.engine.access.QueryFilter; +import org.snaker.engine.entity.HistoryOrder; +import org.snaker.engine.entity.WorkItem; +import org.springframework.beans.factory.annotation.Autowired; + +//import com.jun.plugin.module.ext.mapper.BizCommonMapper; +import com.jun.plugin.common.entity.BaseFlowEntity; +//import com.jun.plugin.system.mapper.SysUserMapper; +//import com.jun.plugin.system.service.HttpSessionService; + +//import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; + +public class BaseFlowController { +// @Resource +// HttpSessionService sessionService; + @Autowired + private SnakerEngineFacets snakerEngineFacets; +// @Autowired +// private UserService sysUserService; +// @Autowired +// private SysUserMapper sysuer; + +// @Autowired +// private BizCommonMapper bizCommonMapper; + + protected void setFlowStatusInfo(BaseFlowStatus baseFlowStatus) { + String orderId = baseFlowStatus.getOrderId(); + // 流程实例状态 + HistoryOrder histOrder = snakerEngineFacets.getEngine().query().getHistOrder(orderId); + if(histOrder!=null) { + baseFlowStatus.setOrderState(histOrder.getOrderState()); + } + List workItems = snakerEngineFacets.getEngine().query().getWorkItems(null, new QueryFilter().setOrderId(orderId)); + if (CollUtil.isNotEmpty(workItems)) { + WorkItem workItem = workItems.get(0); + // 当前流程实例任务节点名称 + baseFlowStatus.setTaskName(workItem.getTaskName()); +// List historyTasks = snakerEngineFacets.getEngine().query().getHistoryTasks(new QueryFilter() +// .setOrderId(orderId) +// .setOperator(sessionService.getCurrentUsername()) +// .orderBy("create_time") +// .order(QueryFilter.DESC)); +// if (CollUtil.isNotEmpty(historyTasks)) { +// baseFlowStatus.setCreateTaskId(historyTasks.get(0).getId()); +// } + // 当前流程实例任务操作人 + String[] actors = snakerEngineFacets.getEngine().query().getTaskActorsByTaskId(workItem.getTaskId()); + if (ArrayUtil.isNotEmpty(actors)) { +// List res = new ArrayList<>(); +// for (String actor : actors) { +// //SysUser user = sysUserService.getById(Long.valueOf(actor)); +// SysUser user = sysuer.getUserByName(actor); +// if (user != null) { +// res.add(user.getRealName()); +// } +// } + String taskOperatorName = StrUtil.join(",", Arrays.asList(actors)); + baseFlowStatus.setTaskOperatorName(taskOperatorName); + if(taskOperatorName.contains("sessionService.getCurrentUserRealname())")) { + baseFlowStatus.setIsOwner(1); + } + } + } + } + + protected void setFlowStatusInfo(BaseFlowEntity baseFlowEntity) { + String orderId = baseFlowEntity.getOrderId(); + // 流程实例状态 + HistoryOrder histOrder = snakerEngineFacets.getEngine().query().getHistOrder(orderId); + if(histOrder!=null) { + baseFlowEntity.setOrderState(histOrder.getOrderState()); + } + List workItems = snakerEngineFacets.getEngine().query().getWorkItems(null, new QueryFilter().setOrderId(orderId)); + if (CollUtil.isNotEmpty(workItems)) { + WorkItem workItem = workItems.get(0); + // 当前流程实例任务节点名称 + baseFlowEntity.setTaskName(workItem.getTaskName()); +// List historyTasks = snakerEngineFacets.getEngine().query().getHistoryTasks(new QueryFilter() +// .setOrderId(orderId) +// .setOperator(sessionService.getCurrentUsername()) +// .orderBy("create_time") +// .order(QueryFilter.DESC)); +// if (CollUtil.isNotEmpty(historyTasks)) { +// baseFlowEntity.setCreateTaskId(historyTasks.get(0).getId()); +// } + // 当前流程实例任务操作人 + String[] actors = snakerEngineFacets.getEngine().query().getTaskActorsByTaskId(workItem.getTaskId()); + if (ArrayUtil.isNotEmpty(actors)) { +// List res = new ArrayList<>(); +// for (String actor : actors) { +// //SysUser user = sysUserService.getById(Long.valueOf(actor)); +// SysUser user = sysuer.getUserByName(actor); +// if (user != null) { +// res.add(user.getRealName()); +// } +// } + String taskOperatorName = StrUtil.join(",", Arrays.asList(actors)); + baseFlowEntity.setTaskOperatorName(taskOperatorName); + if(taskOperatorName.contains("sessionService.getCurrentUserRealname()")) { // 这个可能有问题,必须要是自己创建的数据 +// baseFlowEntity.setIsOwner(1); + } + } + } + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/BaseFlowStatus.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/BaseFlowStatus.java new file mode 100644 index 000000000..0089e147b --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/BaseFlowStatus.java @@ -0,0 +1,50 @@ +package com.jun.plugin.snakerflow.process; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * + */ +@Data +public class BaseFlowStatus { + /** + * 当前流程实例id + */ + private String orderId; + /** + * 当前流程所处任务节点名称 + */ + @TableField(exist = false) + private String taskName; + + /** + * 第一个任务id,用于撤回流程 + */ + @TableField(exist = false) + private String createTaskId; + /** + * 当前流程所处任务操作人名称 + */ + @TableField(exist = false) + private String taskOperatorName; + /** + * 当前流程所处任务操作人 + */ + @TableField(exist = false) + private String taskOperatorId; + /** + * 流程实例状态(0:结束;1:活动) --工作流逻辑状态,这个是实时到工作流里面去查询的 + */ + @TableField(exist = false) + private Integer orderState; + + /** + * 流程实例状态(0:结束;1:活动) --数据库里面的流程状态,主要是标记已完成的工作流 + */ + @TableField(value = "order_status") + private Integer orderStatus; + + @TableField(exist = false) + private Integer isOwner; +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerEngineFacets.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerEngineFacets.java new file mode 100644 index 000000000..9d0cc9c51 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerEngineFacets.java @@ -0,0 +1,224 @@ +package com.jun.plugin.snakerflow.process; + +import org.snaker.engine.SnakerEngine; +import org.snaker.engine.access.QueryFilter; +import org.snaker.engine.entity.Order; +import org.snaker.engine.entity.Process; +import org.snaker.engine.entity.Task; +import org.snaker.engine.model.TaskModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * SnakerEngineFacets封装snakerflow基本操作,可以直接使用 + * + * @author zhaoguoqing + * @since 0.1 + */ +@Component +public class SnakerEngineFacets { + @Autowired + private SnakerEngine engine; + + /** + * 初始化状态机流程 + * + * @return 流程主键 + */ + public String initFlows() { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream stream = classLoader.getResourceAsStream("flows/leave.snaker"); + String deploy = engine.process().deploy(stream); + return deploy; + } + + /** + * 初始化状态机流程 + * + * @return 流程主键 + */ + public String initFlowsByName(String filename) { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream stream = classLoader.getResourceAsStream("flows/"+filename); + String deploy = engine.process().deploy(stream); + return deploy; + } + + /** + * 获得所有有效流程 + * + * @return List + */ + public List getAllProcess() { + QueryFilter filter = new QueryFilter(); + return engine.process().getProcesss(filter); + } + + /** + * 通过orderId 获得流程 + * + * @param orderId 流程实例Id + * @return List + */ + public List getProcessByOrderId(String orderId) { + QueryFilter filter = new QueryFilter(); + filter.setOrderId(orderId); + return engine.process().getProcesss(filter); + } + + /** + * 获得执行引擎 + * + * @return SnakerEngine + */ + public SnakerEngine getEngine() { + return engine; + } + + /** + * 获得所有流程的名字 + * + * @return List + */ + public List getAllProcessNames() { + List list = engine.process().getProcesss(new QueryFilter()); + List names = new ArrayList<>(); + for (Process entity : list) { + if (names.contains(entity.getName())) { + continue; + } else { + names.add(entity.getName()); + } + } + return names; + } + + /** + * 通过processId发起一个流程实例 + * + * @param processId 流程ID + * @param operator 操作人 + * @param args 自定义参数 + * @return Order流程实例 + */ + public Order startInstanceById(String processId, String operator, Map args) { + return engine.startInstanceById(processId, operator, args); + } + + /** + * 通过process name发起一个流程实例 + * + * @param name 流程 name + * @param operator 操作人 + * @param args 自定义参数 + * @return Order流程实例 + */ + public Order startInstanceByName(String name, Integer version, String operator, Map args) { + return engine.startInstanceByName(name, version, operator, args); + } + + /** + * 执行流程实例 + * + * @param name 流程 name + * @param version 版本 + * @param operator 操作人 + * @param args 自定义参数 + * @return Order流程实例 + */ + public Order startAndExecute(String name, Integer version, String operator, Map args) { + Order order = engine.startInstanceByName(name, version, operator, args); + List tasks = engine.query().getActiveTasks(new QueryFilter().setOrderId(order.getId())); + List newTasks = new ArrayList(); + if (tasks != null && tasks.size() > 0) { + Task task = tasks.get(0); + newTasks.addAll(engine.executeTask(task.getId(), operator, args)); + } + return order; + } + + /** + * 执行流程实例 + * + * @param processId 流程Id + * @param operator 操作人 + * @param args 自定义参数 + * @return Order流程实例 + */ + public Order startAndExecute(String processId, String operator, Map args) { + Order order = engine.startInstanceById(processId, operator, args); + List tasks = engine.query().getActiveTasks(new QueryFilter().setOrderId(order.getId())); + List newTasks = new ArrayList(); + if (tasks != null && tasks.size() > 0) { + Task task = tasks.get(0); + newTasks.addAll(engine.executeTask(task.getId(), operator, args)); + } + return order; + } + + /** + * 通过taskId执行 + * + * @param taskId 任务Id + * @param operator 操作人 + * @param args 自定义参数 + * @return List + */ + public List execute(String taskId, String operator, Map args) { + return engine.executeTask(taskId, operator, args); + } + + /** + * 流程跳转 + * + * @param taskId 任务Id + * @param operator 操作人 + * @param args 自定义参数 + * @param nodeName 跳转到的节点名称 + * @return List + */ + public List executeAndJump(String taskId, String operator, Map args, String nodeName) { + return engine.executeAndJumpTask(taskId, operator, args, nodeName); + } + + /** + * 通过orderId获取对应的流程task + * + * @param orderId 流程实例Id + * @return List + */ + public List getTasks(String orderId) { + return engine.query().getActiveTasks(new QueryFilter().setOrderId(orderId)); + } + + /** + * 转办 主办 + * @param taskId + * @param operator + * @param actors + * @return + */ + public List transferMajor(String taskId, String operator, String... actors) { + List tasks = engine.task().createNewTask(taskId, TaskModel.TaskType.Major.ordinal(), actors); + engine.task().complete(taskId, operator); + return tasks; + } + + /** + * 转办 协办 + * @param taskId + * @param operator + * @param actors + * @return + */ + public List transferAidant(String taskId, String operator, String... actors) { + List tasks = engine.task().createNewTask(taskId, TaskModel.TaskType.Aidant.ordinal(), actors); + engine.task().complete(taskId, operator); + return tasks; + } +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerHelper.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerHelper.java new file mode 100644 index 000000000..805ae4def --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerHelper.java @@ -0,0 +1,269 @@ +/* + * Copyright 2014-2015 snakerflow.com + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ +package com.jun.plugin.snakerflow.process; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang.StringUtils; +import org.snaker.engine.entity.HistoryTask; +import org.snaker.engine.entity.Task; +import org.snaker.engine.model.*; + +import java.beans.PropertyDescriptor; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Snaker的帮助类 + * + * @author yuqs + * @since 0.1 + */ +public class SnakerHelper { + private static Map, String> mapper = new HashMap, String>(); + + static { + mapper.put(TaskModel.class, "task"); + mapper.put(CustomModel.class, "custom"); + mapper.put(DecisionModel.class, "decision"); + mapper.put(EndModel.class, "end"); + mapper.put(ForkModel.class, "fork"); + mapper.put(JoinModel.class, "join"); + mapper.put(StartModel.class, "start"); + mapper.put(SubProcessModel.class, "subprocess"); + } + + public static String getStateJson(ProcessModel model, List activeTasks, List historyTasks) { + StringBuffer buffer = new StringBuffer(); + buffer.append("{'activeRects':{'rects':["); + if (activeTasks != null && activeTasks.size() > 0) { + for (Task task : activeTasks) { + buffer.append("{'paths':[],'name':'"); + buffer.append(task.getTaskName()); + buffer.append("'},"); + } + buffer.deleteCharAt(buffer.length() - 1); + } + buffer.append("]}, 'historyRects':{'rects':["); + if (historyTasks != null && historyTasks.size() > 0) { + for (HistoryTask historyTask : historyTasks) { + NodeModel parentModel = model.getNode(historyTask.getTaskName()); + if (parentModel == null) continue; + buffer.append("{'name':'").append(parentModel.getName()).append("','paths':["); + buffer.append("]},"); + } + buffer.deleteCharAt(buffer.length() - 1); + } + buffer.append("]}}"); + return buffer.toString(); + } + + public static String getModelJson(ProcessModel model) { + StringBuffer buffer = new StringBuffer(); + List tms = new ArrayList(); + for (NodeModel node : model.getNodes()) { + for (TransitionModel tm : node.getOutputs()) { + tms.add(tm); + } + } + buffer.append("{"); + buffer.append(getNodeJson(model.getNodes())); + buffer.append(getPathJson(tms)); + buffer.append("props:{props:{name:{name:'name',value:'"); + buffer.append(convert(model.getName())); + buffer.append("'},displayName:{name:'displayName',value:'"); + buffer.append(convert(model.getDisplayName())); + buffer.append("'},expireTime:{name:'expireTime',value:'"); + buffer.append(convert(model.getExpireTime())); + buffer.append("'},instanceUrl:{name:'instanceUrl',value:'"); + buffer.append(convert(model.getInstanceUrl())); + buffer.append("'},instanceNoClass:{name:'instanceNoClass',value:'"); + buffer.append(convert(model.getInstanceNoClass())); + buffer.append("'}}}}"); + return buffer.toString(); + } + + public static String getNodeJson(List nodes) { + StringBuffer buffer = new StringBuffer(); + buffer.append("states: {"); + for (NodeModel node : nodes) { + buffer.append(node.getName()); + buffer.append(getBase(node)); + buffer.append(getLayout(node)); + buffer.append(getProperty(node)); + buffer.append(","); + } + buffer.deleteCharAt(buffer.length() - 1); + buffer.append("},"); + return buffer.toString(); + } + + public static String getPathJson(List tms) { + StringBuffer buffer = new StringBuffer(); + buffer.append("paths:{"); + for (TransitionModel tm : tms) { + buffer.append(tm.getName()); + buffer.append(":{from:'"); + buffer.append(tm.getSource().getName()); + buffer.append("',to:'"); + buffer.append(tm.getTarget().getName()); + buffer.append("', dots:["); + if (StringUtils.isNotEmpty(tm.getG())) { + String[] bendpoints = tm.getG().split(";"); + for (String bendpoint : bendpoints) { + buffer.append("{"); + String[] xy = bendpoint.split(","); + buffer.append("x:").append(getNumber(xy[0])); + buffer.append(",y:").append(xy[1]); + buffer.append("},"); + } + buffer.deleteCharAt(buffer.length() - 1); + } + buffer.append("],text:{text:'"); + buffer.append(tm.getDisplayName()); + buffer.append("'},textPos:{"); + if (StringUtils.isNotEmpty(tm.getOffset())) { + String[] values = tm.getOffset().split(","); + buffer.append("x:").append(values[0]).append(","); + buffer.append("y:").append(values[1]).append(""); + } + buffer.append("}, props:{name:{value:'" + tm.getName() + "'},expr:{value:'" + tm.getExpr() + "'}}}"); + buffer.append(","); + } + buffer.deleteCharAt(buffer.length() - 1); + buffer.append("},"); + return buffer.toString(); + } + + private static String getBase(NodeModel node) { + StringBuffer buffer = new StringBuffer(); + buffer.append(":{type:'"); + buffer.append(mapper.get(node.getClass())); + buffer.append("',text:{text:'"); + buffer.append(node.getDisplayName()); + buffer.append("'},"); + return buffer.toString(); + } + + private static String getProperty(NodeModel node) { + StringBuffer buffer = new StringBuffer(); + buffer.append("props:{"); + try { + PropertyDescriptor[] beanProperties = PropertyUtils.getPropertyDescriptors(node); + for (PropertyDescriptor propertyDescriptor : beanProperties) { + if (propertyDescriptor.getReadMethod() == null || propertyDescriptor.getWriteMethod() == null) + continue; + String name = propertyDescriptor.getName(); + String value = ""; + if (propertyDescriptor.getPropertyType() == String.class) { + value = (String) BeanUtils.getProperty(node, name); + } else { + continue; + } + if (value == null || value.equals("")) continue; + buffer.append(name); + buffer.append(":{value:'"); + buffer.append(convert(value)); + buffer.append("'},"); + } + } catch (Exception e) { + e.printStackTrace(); + } + buffer.deleteCharAt(buffer.length() - 1); + buffer.append("}}"); + return buffer.toString(); + } + + private static String getLayout(NodeModel node) { + StringBuffer buffer = new StringBuffer(); + buffer.append("attr:{"); + String[] values = node.getLayout().split(","); + buffer.append("x:").append(getNumber(values[0])).append(","); + buffer.append("y:").append(values[1]).append(","); + if ("-1".equals(values[2])) { + if (node instanceof TaskModel || node instanceof CustomModel || node instanceof SubProcessModel) { + values[2] = "100"; + } else { + values[2] = "50"; + } + } + if ("-1".equals(values[3])) { + values[3] = "50"; + } + buffer.append("width:").append(values[2]).append(","); + buffer.append("height:").append(values[3]); + buffer.append("},"); + return buffer.toString(); + } + + private static String convert(String value) { + if (StringUtils.isEmpty(value)) + return ""; + if (value.indexOf("'") != -1) { + value = value.replaceAll("'", "#1"); + } + if (value.indexOf("\"") != -1) { + value = value.replaceAll("\"", "#2"); + } + if (value.indexOf("\r\n") != -1) { + value = value.replaceAll("\r\n", "#3"); + } + if (value.indexOf("\n") != -1) { + value = value.replaceAll("\n", "#4"); + } + if (value.indexOf(">") != -1) { + value = value.replaceAll(">", "#5"); + } + if (value.indexOf("<") != -1) { + value = value.replaceAll("<", "#6"); + } + if (value.indexOf("&") != -1) { + value = value.replaceAll("&", "#7"); + } + return value; + } + + public static String convertXml(String value) { + if (value.indexOf("#1") != -1) { + value = value.replaceAll("#1", "'"); + } + if (value.indexOf("#2") != -1) { + value = value.replaceAll("#2", "\""); + } + if (value.indexOf("#5") != -1) { + value = value.replaceAll("#5", ">"); + } + if (value.indexOf("#6") != -1) { + value = value.replaceAll("#6", "<"); + } + if (value.indexOf("&") != -1) { + value = value.replaceAll("#7", "&"); + } + return value; + } + + private static int getNumber(String value) { + if (value == null) return 0; + try { + return Integer.parseInt(value) + 180; + } catch (Exception e) { + return 0; + } + } +} diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerflowTestService.java b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerflowTestService.java new file mode 100644 index 000000000..169aae8a5 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/java/com/jun/plugin/snakerflow/process/SnakerflowTestService.java @@ -0,0 +1,52 @@ +package com.jun.plugin.snakerflow.process; + +import java.util.List; + +import org.snaker.engine.entity.Order; +import org.snaker.engine.entity.Process; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; + +/** + * description: SnakerflowTestService + * + * @author guoqing.zhao + * Date: 2020-03-23 9:20 下午 + */ +@Service +public class SnakerflowTestService { + @Autowired + private SnakerEngineFacets snakerEngineFacets; + + + /** + * 主要用于测试snakerflow是否正常加载 + * + * @return String + */ + @Transactional + public String getProcess() { + snakerEngineFacets.initFlows(); + List allProcess = snakerEngineFacets.getAllProcess(); + return JSONUtil.toJsonStr(allProcess); + } + + /** + * 主要用于测试snakerflow是否正常加载 + * + * @return String + */ + @Transactional + public String start() { + List allProcess = snakerEngineFacets.getAllProcess(); + if (CollUtil.isEmpty(allProcess)) { + return "请先初始化process,http://localhost:8080/getProcessList"; + } + Order order = snakerEngineFacets.startInstanceById(allProcess.get(0).getId(), "zhaoguoqing", null); + return JSONUtil.toJsonStr(order); + } +} \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_plugins/snakerflow/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..261bd09b7 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.snakerflow.config.SankerflowAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/assessment.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/assessment.snaker new file mode 100644 index 000000000..fb90a22e7 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/assessment.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/becomemember.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/becomemember.snaker new file mode 100644 index 000000000..a9ad7ed0a --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/becomemember.snaker @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/borrow.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/borrow.snaker new file mode 100644 index 000000000..37c489b2d --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/borrow.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/contract.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/contract.snaker new file mode 100644 index 000000000..973bb5436 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/contract.snaker @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/customer.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/customer.snaker new file mode 100644 index 000000000..9748ee586 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/customer.snaker @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/daily.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/daily.snaker new file mode 100644 index 000000000..1cb0fbeba --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/daily.snaker @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/daily_old.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/daily_old.snaker new file mode 100644 index 000000000..b34944b8e --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/daily_old.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/dimission.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/dimission.snaker new file mode 100644 index 000000000..afc059a50 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/dimission.snaker @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/draft.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/draft.snaker new file mode 100644 index 000000000..5aaae9951 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/draft.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/draft2.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/draft2.snaker new file mode 100644 index 000000000..41e6db154 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/draft2.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/entryJob.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/entryJob.snaker new file mode 100644 index 000000000..9f0ca0c52 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/entryJob.snaker @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/examination.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/examination.snaker new file mode 100644 index 000000000..3c804ff50 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/examination.snaker @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/expense.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/expense.snaker new file mode 100644 index 000000000..8326493d1 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/expense.snaker @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/hire.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/hire.snaker new file mode 100644 index 000000000..8ef5356f7 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/hire.snaker @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/invoice.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/invoice.snaker new file mode 100644 index 000000000..46dca29b3 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/invoice.snaker @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/leave.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/leave.snaker new file mode 100644 index 000000000..602855971 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/leave.snaker @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/leaveNew.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/leaveNew.snaker new file mode 100644 index 000000000..e9e7446cd --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/leaveNew.snaker @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/member.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/member.snaker new file mode 100644 index 000000000..07f325722 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/member.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/money.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/money.snaker new file mode 100644 index 000000000..ced4dabaa --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/money.snaker @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/office.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/office.snaker new file mode 100644 index 000000000..ec7f2c155 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/office.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/office2.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/office2.snaker new file mode 100644 index 000000000..635fbc2db --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/office2.snaker @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/outsite.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/outsite.snaker new file mode 100644 index 000000000..d18723dea --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/outsite.snaker @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/plan.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/plan.snaker new file mode 100644 index 000000000..040be8b0b --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/plan.snaker @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/project.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/project.snaker new file mode 100644 index 000000000..b96dca2e4 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/project.snaker @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/projectCheck.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/projectCheck.snaker new file mode 100644 index 000000000..35c6df0d4 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/projectCheck.snaker @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/project_old.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/project_old.snaker new file mode 100644 index 000000000..dfcb8d2d0 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/project_old.snaker @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/recheck.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/recheck.snaker new file mode 100644 index 000000000..2b28944f8 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/recheck.snaker @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/weekly.snaker b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/weekly.snaker new file mode 100644 index 000000000..d20a7d57d --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/flows/weekly.snaker @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jun_api_online/jun_plugins/snakerflow/src/main/resources/templates/biztest/list.html b/jun_api_online/jun_plugins/snakerflow/src/main/resources/templates/biztest/list.html new file mode 100644 index 000000000..8339baa84 --- /dev/null +++ b/jun_api_online/jun_plugins/snakerflow/src/main/resources/templates/biztest/list.html @@ -0,0 +1,300 @@ + + + + + Title + + + + + + +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/jun_api_online/jun_system/pom.xml b/jun_api_online/jun_system/pom.xml new file mode 100644 index 000000000..efab1549f --- /dev/null +++ b/jun_api_online/jun_system/pom.xml @@ -0,0 +1,108 @@ + + + 4.0.0 + + com.jun.plugin + jun_system + 1.0 + jar + 系统功能 + + + + com.jun.plugin + jun_common + 1.0 + + + org.springframework.boot + spring-boot-starter-aop + + + + com.alibaba + druid-spring-boot-starter + 1.2.18 + + + + + commons-configuration + commons-configuration + 1.10 + + + com.github.whvcse + easy-captcha + 1.6.2 + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.2 + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/common/aop/aspect/DataScopeAspect.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/common/aop/aspect/DataScopeAspect.java new file mode 100644 index 000000000..1c9742b59 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/common/aop/aspect/DataScopeAspect.java @@ -0,0 +1,168 @@ +package com.jun.plugin.system.common.aop.aspect; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.entity.BaseEntity; +import com.jun.plugin.common.entity.BaseFlowEntity; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.common.service.RedisService; +import com.jun.plugin.system.entity.*; +import com.jun.plugin.system.service.*; + +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 概念:最终控制列表中显示哪些 部门/人 创建的数据 + * 1、需要数据权限控制的列表, 需要有创建人字段, 示例:文章管理 + * 2、配置角色的数据范围(本部门,其他部门等), 以及绑定的部门 + * 3、加个注解,用来查询当前等路人的多个角色(并集), 根据角色数据范围, 获取绑定的部门id, 查关联的用户id + * 4、在查某个模块的list或page的时候,手动queryWrapper.in(createId, 关联的用户id) + * + * @author wujun + */ +@Aspect +@Component +@Slf4j +public class DataScopeAspect { + + @Resource + HttpSessionService sessionService; + @Resource + RoleService roleService; + @Resource + SysRoleDeptService sysRoleDeptService; + @Resource + DeptService deptService; + @Resource + UserService userService; + @Resource + private RedisService redisService; + + + @Pointcut("@annotation(com.jun.plugin.common.aop.annotation.DataScope)") + public void dataScopePointCut() { + } + + @Before("dataScopePointCut()") + public void doBefore(JoinPoint point) { + handleDataScope(point); + } + + protected void handleDataScope(final JoinPoint joinPoint) { + long time1= System.currentTimeMillis(); + //获取当前登陆人 + String id = sessionService.getCurrentUserId(); + List userIds = null; + long time2= System.currentTimeMillis()-time1; + System.err.println("time cost 1.1 = "+(time2)); +// if(redisService.exists("DataScopeAspect#handleDataScope#"+id)) { +// userIds = JSON.parseArray(redisService.get("DataScopeAspect#handleDataScope#"+id), String.class) ; +// }else { +// time2= System.currentTimeMillis()-time1; +// System.err.println("time cost 1.2 = "+(time2)); + //获取当前登陆人角色, 如果无角色, 那么不限制 + List sysRoles = roleService.getRoleInfoByUserId(id); + if (CollectionUtils.isEmpty(sysRoles) || sysRoles.size() == 0) { + return; + } + time2= System.currentTimeMillis()-time1; + System.err.println("time cost 1.3 = "+(time2)); + //角色未配置数据权限范围, 那么不限制 + List list = sysRoles.parallelStream().filter(one -> null != one.getDataScope()).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(list) || list.size() == 0) { + return; + } + //如果存在某角色配置了全部范围, 那么不限制 + if (list.stream().anyMatch(sysRole -> Constant.DATA_SCOPE_ALL.equals(sysRole.getDataScope()))) { + return; + } + //获取绑定的人 + userIds = this.getUserIdsByRoles(list, id); + System.err.println("datascope userIds = "+userIds); +// redisService.set("DataScopeAspect#handleDataScope#"+id, JSON.toJSONString(userIds)); +// } + + Object params = joinPoint.getArgs()[0]; + if (params instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.setCreateIds(userIds); + }else if (params instanceof BaseFlowEntity) { + BaseFlowEntity baseEntity = (BaseFlowEntity) params; + baseEntity.setCreateIds(userIds); + } + + } + + /** + * 获取最终的用户id + * + * @param sysRoles 角色 + * @param userId 当前用户id + * @return 用户id集合 + */ + private List getUserIdsByRoles(List sysRoles, String userId) { + //本人 + SysUser sysUser = userService.getById(userId); + log.info("userId="+userId); + //本部门 + SysDept sysDept = deptService.getById(sysUser.getDeptId()); + log.info("sysDept="+JSON.toJSONString(sysDept)); + //部门ids, 定义哪些部门最终拥有权限查看 + LinkedList deptList = new LinkedList<>(); + //用户ids,定义列表中哪些人创建的可查看 + LinkedList userIdList = new LinkedList<>(); + //根据数据权限范围分组, 不同的数据范围不同的逻辑处理 + Map> dataScopeMap = sysRoles.parallelStream().collect(Collectors.groupingBy(SysRole::getDataScope)); + dataScopeMap.forEach((k, v) -> { + if (Constant.DATA_SCOPE_CUSTOM.equals(k)) { + //自定义 + //根据角色id,获取所有自定义关联的部门id + QueryWrapper queryWrapper = Wrappers.query().select("dept_id").in("role_id", v.parallelStream().map(SysRole::getId).collect(Collectors.toList())); + deptList.addAll(sysRoleDeptService.listObjs(queryWrapper)); + } else if (Constant.DATA_SCOPE_DEPT_AND_CHILD.equals(k)) { + //本部门及以下 + if (sysDept != null && StringUtils.isNotBlank(sysDept.getDeptNo())) { + //获取本部门以下所有关联的部门 + QueryWrapper queryWrapper = Wrappers.query().select("id").like("relation_code", sysDept.getDeptNo()); + deptList.addAll(deptService.listObjs(queryWrapper)); + } + } else if (Constant.DATA_SCOPE_DEPT.equals(k)) { + //本部门 + if (sysDept != null && StringUtils.isNotBlank(sysDept.getId())) { + deptList.add(sysDept.getId()); + } + } else if (Constant.DATA_SCOPE_DEPT_SELF.equals(k)) { + //自己 + userIdList.add(userId); + } + }); + log.info("deptList="+JSON.toJSONString(deptList)); + if (!CollectionUtils.isEmpty(deptList)) { + QueryWrapper queryWrapper = Wrappers.query().select("id").in("dept_id", deptList); + userIdList.addAll(userService.listObjs(queryWrapper)); + } + log.info("userIdList="+JSON.toJSONString(userIdList)); + //如果配置了角色数据范围, 最终没有查到userId, 那么返回无数据 + if (CollectionUtils.isEmpty(userIdList)) { + throw new BusinessException("无数据"); + } + return userIdList.parallelStream().map(Object::toString).collect(Collectors.toList()); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/common/jwt/JwtFilter.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/common/jwt/JwtFilter.java new file mode 100644 index 000000000..c13638b96 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/common/jwt/JwtFilter.java @@ -0,0 +1,120 @@ +package com.jun.plugin.system.common.jwt; + +import cn.hutool.jwt.JWTUtil; +import com.alibaba.fastjson2.JSON; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.service.RedisService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@WebFilter(filterName = "jwtfilter",urlPatterns = "/6666/*") +public class JwtFilter implements Filter { + private Logger logger = LoggerFactory.getLogger(JwtFilter.class); +// private static final String TOKEN = "token"; + @Autowired + private RedisService redisUtil; + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; + //过滤放行地址 + String url = httpServletRequest.getRequestURI().startsWith("/")?httpServletRequest.getRequestURI().substring(1):httpServletRequest.getRequestURI(); + logger.info("url:{}",url); + Map map = new HashMap<>(); + /**swagger start**/ + map.put("doc.html",true); + map.put("webjars/bycdao-ui",true); + map.put("swagger-resources",true); + map.put("v2/api-docs",true); + map.put("data/verification/login",true); + map.put("data/enterpriseFollowMonitorDetail/listAll",true); + map.put("data/enterpriseFollowMonitorDetail/update",true); + map.put("data/enterpriseController/enterpriseRecommend",true); + /**swagger end**/ + map.put("sys/user/login",true); + map.put("sys/user/token",true); + + /** 业务放行地址**/ +// map.put("data/aiIndustrySystem",true); + for(String passUrl: map.keySet()){ + if(url.contains(passUrl)){ + filterChain.doFilter(servletRequest,servletResponse); + logger.info("passUrl:{}",url); + return; + } + } + String token = httpServletRequest.getHeader(Constant.ACCOUNT); + if(null==token){ + responseResult(httpServletResponse, Result.fail("JWTToken为空,鉴权失败")); + //throw new BusinessException("token 不合法!"); + } + if(StringUtils.isNotBlank(token)){ + try { + if(refreshToken(token)){ + filterChain.doFilter(servletRequest,servletResponse); + } else { + responseResult(httpServletResponse, Result.fail("Token非法,鉴权失败")); + } + } catch (BusinessException e) { + responseResult(httpServletResponse, Result.fail(e.getMessage())); + } + } + } + + @Override + public void destroy() { + + } + //刷新token时间 + public boolean refreshToken(String token) { + String tokenKey = "sys:user:token" + token ; + String cacheToken =(String)redisUtil.get(tokenKey); + try { + if (StringUtils.isNotEmpty(cacheToken)) { + // 校验token有效性,注意需要校验的是缓存中的token + if (JWTUtil.verify(cacheToken,"1234".getBytes())) { + redisUtil.set(tokenKey, cacheToken) ; + redisUtil.expire(tokenKey, 30 * 600 * 2); + return true; + }else{ + return false; + } + }else{ + if (JWTUtil.verify(cacheToken,"1234".getBytes())) { + redisUtil.set(tokenKey, token) ; + redisUtil.expire(tokenKey, 30 * 60 * 2); + return true; + } + } + } catch (BusinessException e) { + throw e; + } + return false; + } + + private void responseResult(HttpServletResponse response, Result result) { + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-type", "application/json;charset=UTF-8"); + response.setStatus(200); + try { + response.getWriter().write(JSON.toJSONString(result)); + } catch (IOException ex) { + log.error(ex.getMessage()); + } + } +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/config/SystemAutoConfig.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/config/SystemAutoConfig.java new file mode 100644 index 000000000..41e964cec --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/config/SystemAutoConfig.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author wujun + * @date 2021/3/19 + */ +@Configuration +@ComponentScan(basePackages = "com.jun.plugin.system") +@MapperScan(basePackages = "com.jun.plugin.system.mapper") +public class SystemAutoConfig { +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/DeptController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/DeptController.java new file mode 100644 index 000000000..b678cc7e9 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/DeptController.java @@ -0,0 +1,92 @@ +package com.jun.plugin.system.controller; + +import com.jun.plugin.common.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import com.jun.plugin.system.entity.SysDept; +import com.jun.plugin.system.service.DeptService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * 部门管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RequestMapping("/sys") +@RestController +@Api(tags = "组织模块-机构管理") +public class DeptController { + @Resource + private DeptService deptService; + + @PostMapping("/dept") + @ApiOperation(value = "新增组织接口") + //@RequiresPermissions("sys:dept:add") + public Result addDept(@RequestBody @Valid SysDept vo) { + deptService.addDept(vo); + return Result.success(); + } + + @DeleteMapping("/dept/{id}") + @ApiOperation(value = "删除组织接口") + //@RequiresPermissions("sys:dept:deleted") + public Result deleted(@PathVariable("id") String id) { + deptService.deleted(id); + return Result.success(); + } + + @PutMapping("/dept") + @ApiOperation(value = "更新组织信息接口") + //@RequiresPermissions("sys:dept:update") + public Result updateDept(@RequestBody SysDept vo) { + if (StringUtils.isEmpty(vo.getId())) { + return Result.fail("id不能为空"); + } + deptService.updateDept(vo); + return Result.success(); + } + + @GetMapping("/dept/{id}") + @ApiOperation(value = "查询组织详情接口") + //@RequiresPermissions("sys:dept:detail") + public Result detailInfo(@PathVariable("id") String id) { + return Result.success(deptService.getById(id)); + } + + @GetMapping("/dept/tree") + @ApiOperation(value = "树型组织列表接口") + // //@RequiresPermissions(value = {"sys:user:list", "sys:user:update", "sys:user:add", "sys:dept:add", "sys:dept:update"}, logical = Logical.OR) + public Result getTree(@RequestParam(required = false) String deptId) { + return Result.success(deptService.deptTreeList(deptId, false)); + } + + @GetMapping("/depts") + @ApiOperation(value = "获取机构列表接口") + //@RequiresPermissions("sys:dept:list") + public Result getDeptAll() { + List deptList = deptService.list(); + deptList.parallelStream().forEach(entity -> { + SysDept parentDept = null; + for (SysDept tmp : deptList) { + if(tmp.getId().equalsIgnoreCase(entity.getPid())) { + parentDept = tmp; + } + } + //SysDept parentDept = deptService.getById(entity.getPid()); + if (parentDept != null) { + entity.setPidName(parentDept.getName()); + } + }); + return Result.success(deptList); + } + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/HomeController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/HomeController.java new file mode 100644 index 000000000..4c3a1eaaf --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/HomeController.java @@ -0,0 +1,115 @@ +package com.jun.plugin.system.controller; + +import com.google.common.collect.Lists; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.system.vo.resp.App; +import com.jun.plugin.system.vo.resp.Menu; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.jun.plugin.system.service.HomeService; +import com.jun.plugin.system.service.PermissionService; +import com.jun.plugin.system.vo.resp.PermissionRespNode; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + + +/** + * 首页 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RestController +@RequestMapping("/sys") +@Api(tags = "首页数据") +public class HomeController { + @Resource + private HomeService homeService; + @Resource + private HttpSessionService httpSessionService; + + @Resource + private PermissionService permissionService; + + @GetMapping("/home") + @ApiOperation(value = "获取首页数据接口") + public Result getHomeInfo() { + //通过access_token拿userId + String userId = httpSessionService.getCurrentUserId(); + Result result = Result.success(homeService.getHomeInfo(userId)); + return result; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @GetMapping("/init") + @ApiOperation(value = "获取首页数据接口") + public Map getHomeInitInfo() { + String userId = httpSessionService.getCurrentUserId(); + List menus = permissionService.permissionTreeList(userId); + Map result = new HashMap<>(); + Map homeInfo = new HashMap<>(); + homeInfo.put("title", "首页"); + homeInfo.put("href", "welcome1.html"); + Map logoInfo = new HashMap<>(); + logoInfo.put("title", "fly666事务所"); +// logoInfo.put("image", "images/logo.png"); + logoInfo.put("href", ""); + result.put("homeInfo", homeInfo); + result.put("logoInfo", logoInfo); + result.put("menuInfo", menus); + result.put("data", homeService.getUserInfo(userId)); + return result; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @GetMapping("/initNew") + @ApiOperation(value = "获取首页数据接口") + public Result getHomeInitNewInfo() { + String userId = httpSessionService.getCurrentUserId(); + + Map result = new HashMap<>(); + Map homeInfo = new HashMap<>(); + homeInfo.put("title", "首页"); + homeInfo.put("href", "welcome1.html"); + Map logoInfo = new HashMap<>(); + logoInfo.put("title", "fly666事务所"); +// logoInfo.put("image", "images/logo.png"); + logoInfo.put("href", ""); + result.put("homeInfo", homeInfo); + result.put("logoInfo", logoInfo); + result.put("data", homeService.getUserInfo(userId)); + + List menus = permissionService.permissionTreeList(userId); + + List apps = Lists.newArrayList(); + menus.forEach(item->{ + App app = new App(); + app.setActive(false); + app.setCode(item.getTitle()); + app.setName(item.getTitle()); + apps.add(app); + }); + result.put("apps", apps); + + List menus1 = Lists.newArrayList(); + menus.forEach(item->{ + Menu menu = new Menu(); + menu.setCode(item.getTitle()); + menu.setValue(item.getChildren()); + menus1.add(menu); + }); + result.put("menus", menus1); + + return Result.success(result); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/IndexController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/IndexController.java new file mode 100644 index 000000000..d4f9feaff --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/IndexController.java @@ -0,0 +1,191 @@ +package com.jun.plugin.system.controller; + +import io.swagger.annotations.Api; +//import org.apache.shiro.SecurityUtils; +//import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 视图 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "视图") +@Controller +@RequestMapping("/index") +public class IndexController { + +// @GetMapping("/login") +// public String logout() { +//// Subject subject = SecurityUtils.getSubject(); +//// if (subject.isAuthenticated()) { +//// return "redirect:/index/home"; +//// } +// return "login"; +// } +// +// @GetMapping("/login2") +// public String login2() { +//// Subject subject = SecurityUtils.getSubject(); +//// if (subject.isAuthenticated()) { +//// return "redirect:/index/home"; +//// } +// return "login2"; +// } +// +// @GetMapping("/home") +// public String home() { +// return "home"; +// } +// +// @GetMapping("/welcome1") +// public String welcome1() { +// return "welcome1"; +// } +// +// @GetMapping("/welcome2") +// public String welcome2() { +// return "welcome2"; +// } +// +// @GetMapping("/welcome3") +// public String welcome3() { +// return "welcome3"; +// } +// +// @GetMapping("/customerProjects") +// public String customerProjects() { +// return "customerProjects"; +// } +// +// @GetMapping("/users/password") +// public String updatePassword() { +// return "users/update_password"; +// } +// +// @GetMapping("/users/info") +// public String userDetail(Model model) { +// model.addAttribute("flagType", "edit"); +// return "users/user_edit"; +// } +// +// @GetMapping("/menus") +// public String menusList() { +// +// return "menus/menu_list"; +// } +// +// @GetMapping("/roles") +// public String roleList() { +// return "roles/role_list"; +// } +// +// @GetMapping("/users") +// public String userList() { +// return "users/user_list"; +// } +// +// @GetMapping("/userList") +// public String userList22() { +// return "users/user_list"; +// } +// +// @GetMapping("/users2") +// public String userList2() { +// return "users/user_list"; +// } +// +// @GetMapping("/logs") +// public String logList() { +// return "logs/log_list"; +// } +// +// @GetMapping("/depts") +// public String deptList() { +// return "depts/dept_list"; +// } +// +// @GetMapping("/403") +// public String error403() { +// return "error/403"; +// } +// +// @GetMapping("/404") +// public String error404() { +// return "error/404"; +// } +// +// @GetMapping("/500") +// public String error405() { +// return "error/500"; +// } +// +// @GetMapping("/main") +// public String indexHome() { +// return "main"; +// } +// +// @GetMapping("/about") +// public String about() { +// return "about"; +// } +// +// @GetMapping("/build") +// public String build() { +// return "build"; +// } +// +// @GetMapping("/sysContent") +// public String sysContent() { +// return "syscontent/list"; +// } +// +// @GetMapping("/sysDict") +// public String sysDict() { +// return "sysdict/list"; +// } +// +// @GetMapping("/sysGenerator") +// public String sysGenerator() { +// return "generator/list"; +// } +// +// @GetMapping("/sysJob") +// public String sysJob() { +// return "sysjob/list"; +// } +// +// @GetMapping("/sysJobLog") +// public String sysJobLog() { +// return "sysjoblog/list"; +// } +// +// @GetMapping("/sysFiles") +// public String sysFiles() { +// return "sysfiles/list"; +// } +// +// @GetMapping("/sysFilesByUser") +// public String sysFilesByUser() { +// return "sysfiles/listByUser"; +// } +// +// //localhost:8080/index/goto/file +// @GetMapping("/goto/{pagePath}") +// public String gotPage(@PathVariable String pagePath) { +// return pagePath; +// } +// +// //http://localhost:8090/admin/view/flow/processList.html +// //http://localhost:8090/index/processList +// @GetMapping("/processList") +// public String processList() { +// return "admin/view/flow/processList"; +// } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/KaptchaController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/KaptchaController.java new file mode 100644 index 000000000..491225e06 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/KaptchaController.java @@ -0,0 +1,69 @@ +package com.jun.plugin.system.controller; + +import com.google.common.collect.Maps; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.service.RedisService; +import com.wf.captcha.ArithmeticCaptcha; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; +import java.util.UUID; + +/** + * 验证码相关 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "验证码相关") +@RestController +@Slf4j +@RequestMapping("/sys") +public class KaptchaController { + + @Resource + RedisService redisService; + + /** + * 获取验证码图片 + * Gets captcha code. + * + * @param request the request + * @param response the response + * @throws IOException the io exception + */ + @RequestMapping("/getVerify") + public Result getCaptchaCode(HttpServletRequest request, HttpServletResponse response) throws IOException { + ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48); + captcha.setLen(2); + //CaptchaUtil.out(captcha, request, response); + + //CaptchaUtil.setHeader(response); + //request.getSession().setAttribute(SESSION_KEY, captcha.text().toLowerCase()); + //captcha.out(response.getOutputStream()); + + String verCode = captcha.text().toLowerCase(); + String key = UUID.randomUUID().toString(); + // 存入redis并设置过期时间为10分钟 + try { + redisService.setAndExpire("captcha:"+key, verCode, 60*10); + } catch (Exception e) { + Result.fail("远程Redis服务连接失败,请刷新页面重试!"+e.toString()); + throw new RuntimeException(e); + } + Map map = Maps.newHashMap(); + map.put("key", key); + map.put("captcha", captcha.toBase64()); + // 将key和base64返回给前端 + return Result.success(map); + } + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/PermissionController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/PermissionController.java new file mode 100644 index 000000000..1953dc281 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/PermissionController.java @@ -0,0 +1,141 @@ +package com.jun.plugin.system.controller; + +import com.jun.plugin.common.Result; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +//import org.apache.shiro.authz.annotation.Logical; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import com.jun.plugin.system.entity.SysPermission; +import com.jun.plugin.system.service.PermissionService; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 菜单权限管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RequestMapping("/sys") +@RestController +@Api(tags = "组织模块-菜单权限管理") +public class PermissionController { + + @Resource + private PermissionService permissionService; + + @PostMapping("/permission") + @ApiOperation(value = "新增菜单权限接口") + //@RequiresPermissions("sys:permission:add") + public Result addPermission(@RequestBody @Valid SysPermission vo) { + verifyFormPid(vo); + vo.setStatus(1); + permissionService.save(vo); + return Result.success(); + } + + @DeleteMapping("/permission/{id}") + @ApiOperation(value = "删除菜单权限接口") + //@RequiresPermissions("sys:permission:deleted") + public Result deleted(@PathVariable("id") String id) { + permissionService.deleted(id); + return Result.success(); + } + + @PutMapping("/permission") + @ApiOperation(value = "更新菜单权限接口") + //@RequiresPermissions("sys:permission:update") + public Result updatePermission(@RequestBody @Valid SysPermission vo) { + if (StringUtils.isEmpty(vo.getId())) { + return Result.fail("id不能为空"); + } + SysPermission sysPermission = permissionService.getById(vo.getId()); + if (null == sysPermission) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + // 只有类型变更或者所属菜单变更 + if (sysPermission.getType().equals(vo.getType()) || !sysPermission.getPid().equals(vo.getPid())) { + verifyFormPid(vo); + } + permissionService.updatePermission(vo); + return Result.success(); + } + + @GetMapping("/permission/{id}") + @ApiOperation(value = "查询菜单权限接口") + //@RequiresPermissions("sys:permission:detail") + public Result detailInfo(@PathVariable("id") String id) { + return Result.success(permissionService.getById(id)); + + } + + @GetMapping("/permissions") + @ApiOperation(value = "获取所有菜单权限接口") + //@RequiresPermissions("sys:permission:list") + public Result getAllMenusPermission() { + return Result.success(permissionService.selectAll()); + } + + @GetMapping("/permission/tree") + @ApiOperation(value = "获取所有目录菜单树接口") + //@RequiresPermissions(value = {"sys:permission:update", "sys:permission:add"}, logical = Logical.OR) + public Result getAllMenusPermissionTree(@RequestParam(required = false) String permissionId) { + return Result.success(permissionService.selectAllMenuByTree(permissionId)); + } + + @GetMapping("/permission/tree/all") + @ApiOperation(value = "获取所有目录菜单树接口") + //@RequiresPermissions(value = {"sys:role:update", "sys:role:add"}, logical = Logical.OR) + public Result getAllPermissionTree() { + return Result.success(permissionService.selectAllByTree()); + } + + /** + * 操作后的菜单类型是目录的时候 父级必须为目录 + * 操作后的菜单类型是菜单的时候,父类必须为目录类型 + * 操作后的菜单类型是按钮的时候 父类必须为菜单类型 + */ + private void verifyFormPid(SysPermission sysPermission) { + SysPermission parent; + parent = permissionService.getById(sysPermission.getPid()); + switch (sysPermission.getType()) { + case 1: + if (parent != null) { + if (parent.getType() != 1) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_CATALOG_ERROR); + } + } else if (!"0".equals(sysPermission.getPid())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_CATALOG_ERROR); + } + break; + case 2: + if (parent == null || parent.getType() != 1) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_MENU_ERROR); + } + if (StringUtils.isEmpty(sysPermission.getUrl())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_NOT_NULL); + } + + break; + case 3: + if (parent == null || parent.getType() != 2) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_BTN_ERROR); + } + if (StringUtils.isEmpty(sysPermission.getPerms())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_PERMS_NULL); + } + if (StringUtils.isEmpty(sysPermission.getUrl())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_NOT_NULL); + } + break; + default: + } + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/RoleController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/RoleController.java new file mode 100644 index 000000000..3ef5af48a --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/RoleController.java @@ -0,0 +1,128 @@ +package com.jun.plugin.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.common.Result; +import com.jun.plugin.system.entity.SysRole; +import com.jun.plugin.system.entity.SysRoleDeptEntity; +import com.jun.plugin.system.service.RoleService; +import com.jun.plugin.system.service.SysRoleDeptService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +/** + * 角色管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RequestMapping("/sys") +@RestController +@Api(tags = "组织模块-角色管理") +public class RoleController { + @Resource + private RoleService roleService; + @Resource + private SysRoleDeptService sysRoleDeptService; + + @PostMapping("/role") + @ApiOperation(value = "新增角色接口") + //@RequiresPermissions("sys:role:add") + public Result addRole(@RequestBody @Valid SysRole vo) { + roleService.addRole(vo); + return Result.success(); + } + + @DeleteMapping("/role/{id}") + @ApiOperation(value = "删除角色接口") + //@RequiresPermissions("sys:role:deleted") + public Result deleted(@PathVariable("id") String id) { + roleService.deletedRole(id); + return Result.success(); + } + + @PutMapping("/role") + @ApiOperation(value = "更新角色信息接口") + //@RequiresPermissions("sys:role:update") + public Result updateDept(@RequestBody SysRole vo) { + if (StringUtils.isEmpty(vo.getId())) { + return Result.fail("id不能为空"); + } + roleService.updateRole(vo); + return Result.success(); + } + + @PostMapping("/role/bindDept") + @ApiOperation(value = "绑定角色部门接口") + //@RequiresPermissions("sys:role:bindDept") + public Result bindDept(@RequestBody SysRole vo) { + if (StringUtils.isEmpty(vo.getId())) { + return Result.fail("id不能为空"); + } + if (roleService.getById(vo.getId()) == null) { + return Result.fail("获取角色失败"); + } + + //先删除所有绑定 + sysRoleDeptService.remove(Wrappers.lambdaQuery().eq(SysRoleDeptEntity::getRoleId, vo.getId())); + //如果不是自定义 + if (vo.getDataScope() != 2) { + vo.setDepts(null); + } + if (!CollectionUtils.isEmpty(vo.getDepts())) { + List list = new ArrayList<>(); + for (String deptId : vo.getDepts()) { + SysRoleDeptEntity sysRoleDeptEntity = new SysRoleDeptEntity(); + sysRoleDeptEntity.setDeptId(deptId); + sysRoleDeptEntity.setRoleId(vo.getId()); + list.add(sysRoleDeptEntity); + } + sysRoleDeptService.saveBatch(list); + } + roleService.updateById(new SysRole().setId(vo.getId()).setDataScope(vo.getDataScope())); + return Result.success(); + } + + @GetMapping("/role/{id}") + @ApiOperation(value = "查询角色详情接口") + //@RequiresPermissions("sys:role:detail") + public Result detailInfo(@PathVariable("id") String id) { + return Result.success(roleService.detailInfo(id)); + } + + @PostMapping("/roles") + @ApiOperation(value = "分页获取角色信息接口") + //@RequiresPermissions("sys:role:list") + @SuppressWarnings("unchecked") + public Result pageInfo(@RequestBody SysRole vo) { + Page page = new Page(vo.getPage(), vo.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + if (!StringUtils.isEmpty(vo.getName())) { + queryWrapper.like(SysRole::getName, vo.getName()); + } + if (!StringUtils.isEmpty(vo.getStartTime())) { + queryWrapper.gt(SysRole::getCreateTime, vo.getStartTime()); + } + if (!StringUtils.isEmpty(vo.getEndTime())) { + queryWrapper.lt(SysRole::getCreateTime, vo.getEndTime()); + } + if (!StringUtils.isEmpty(vo.getStatus())) { + queryWrapper.eq(SysRole::getStatus, vo.getStatus()); + } + queryWrapper.orderByDesc(SysRole::getCreateTime); + return Result.success(roleService.page(page, queryWrapper)); + } + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/RolePermissionController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/RolePermissionController.java new file mode 100644 index 000000000..227de70d0 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/RolePermissionController.java @@ -0,0 +1,40 @@ +package com.jun.plugin.system.controller; + +import com.jun.plugin.common.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +//import org.apache.shiro.authz.annotation.Logical; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.jun.plugin.system.service.RolePermissionService; +import com.jun.plugin.system.vo.req.RolePermissionOperationReqVO; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 角色和菜单关联 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RequestMapping("/sys") +@RestController +@Api(tags = "组织管理-角色和菜单关联接口") +public class RolePermissionController { + @Resource + private RolePermissionService rolePermissionService; + + @PostMapping("/role/permission") + @ApiOperation(value = "修改或者新增角色菜单权限接口") + //@RequiresPermissions(value = {"sys:role:update", "sys:role:add"}, logical = Logical.OR) + public Result operationRolePermission(@RequestBody @Valid RolePermissionOperationReqVO vo) { + rolePermissionService.addRolePermission(vo); + return Result.success(); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysContentController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysContentController.java new file mode 100644 index 000000000..7241d7f27 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysContentController.java @@ -0,0 +1,83 @@ +package com.jun.plugin.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.aop.annotation.DataScope; +import com.jun.plugin.system.entity.SysContentEntity; +import com.jun.plugin.system.service.SysContentService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + + +/** + * 文章管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "文章管理") +@RestController +@RequestMapping("/sysContent") +public class SysContentController { + @Resource + private SysContentService sysContentService; + + + @ApiOperation(value = "新增") + @PostMapping("/add") + //@RequiresPermissions("sysContent:add") + public Result add(@RequestBody SysContentEntity sysContent) { + sysContentService.save(sysContent); + return Result.success(); + } + + @ApiOperation(value = "删除") + @DeleteMapping("/delete") + //@RequiresPermissions("sysContent:delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + sysContentService.removeByIds(ids); + return Result.success(); + } + + @ApiOperation(value = "更新") + @PutMapping("/update") + //@RequiresPermissions("sysContent:update") + public Result update(@RequestBody SysContentEntity sysContent) { + sysContentService.updateById(sysContent); + return Result.success(); + } + + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPage") + //@RequiresPermissions("sysContent:list") + @DataScope + public Result findListByPage(@RequestBody SysContentEntity sysContent) { + Page page = new Page(sysContent.getPage(), sysContent.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + if (!StringUtils.isEmpty(sysContent.getTitle())) { + queryWrapper.like(SysContentEntity::getTitle, sysContent.getTitle()); + } + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(sysContent.getCreateIds())) { + queryWrapper.in(SysContentEntity::getCreateId, sysContent.getCreateIds()); + } + //数据权限示例, 需手动添加此条件 end + + IPage iPage = sysContentService.page(page, queryWrapper); + return Result.success(iPage); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysDictController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysDictController.java new file mode 100644 index 000000000..0773e267e --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysDictController.java @@ -0,0 +1,132 @@ +package com.jun.plugin.system.controller; + +import java.util.List; + +import javax.annotation.Resource; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; +import com.jun.plugin.common.Result; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.jun.plugin.common.service.RedisService; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.system.entity.SysDictDetailEntity; +import com.jun.plugin.system.entity.SysDictEntity; +import com.jun.plugin.system.service.SysDictDetailService; +import com.jun.plugin.system.service.SysDictService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + + +/** + * 字典管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "字典管理") +@RestController +@RequestMapping("/sysDict") +public class SysDictController { + @Resource + private SysDictService sysDictService; + @Resource + private SysDictDetailService sysDictDetailService; + @Resource + private RedisService redisService; + + + @ApiOperation(value = "新增") + @PostMapping("/add") + //@RequiresPermissions("sysDict:add") + public Result add(@RequestBody SysDictEntity sysDict) { + if (StringUtils.isEmpty(sysDict.getName())) { + return Result.fail("字典名称不能为空"); + } + SysDictEntity q = sysDictService.getOne(Wrappers.lambdaQuery().eq(SysDictEntity::getName, sysDict.getName())); + if (q != null) { + return Result.fail("字典名称已存在"); + } + sysDictService.save(sysDict); + return Result.success(); + } + + @ApiOperation(value = "删除") + @DeleteMapping("/delete") + //@RequiresPermissions("sysDict:delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + sysDictService.removeByIds(ids); + //删除detail + sysDictDetailService.remove(Wrappers.lambdaQuery().in(SysDictDetailEntity::getDictId, ids)); + return Result.success(); + } + + @ApiOperation(value = "更新") + @PutMapping("/update") + //@RequiresPermissions("sysDict:update") + public Result update(@RequestBody SysDictEntity sysDict) { + if (StringUtils.isEmpty(sysDict.getName())) { + return Result.fail("字典名称不能为空"); + } + + SysDictEntity q = sysDictService.getOne(Wrappers.lambdaQuery().eq(SysDictEntity::getName, sysDict.getName())); + if (q != null && !q.getId().equals(sysDict.getId())) { + return Result.fail("字典名称已存在"); + } + + sysDictService.updateById(sysDict); + return Result.success(); + } + + @ApiOperation(value = "查询分页数据") + @PostMapping("/listByPage") + //@RequiresPermissions("sysDict:list") +// @CacheEvict(value = "valueName",allEntries = true) +// @CacheEvict(cacheNames = "com.jun.plugin.business.service.impl.ProviderServiceImpl", key = "#id") +// @Cacheable(cacheNames = "SysDictController.findListByPage", key = "#sysDict") + public Result findListByPage(@RequestBody SysDictEntity sysDict) { + Page page = new Page(sysDict.getPage(), sysDict.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + if (!StringUtils.isEmpty(sysDict.getName())) { + queryWrapper.like(SysDictEntity::getName, sysDict.getName()); + queryWrapper.or(); + queryWrapper.like(SysDictEntity::getRemark, sysDict.getName()); + } + queryWrapper.orderByAsc(SysDictEntity::getName); + IPage iPage = sysDictService.page(page, queryWrapper); + return Result.success(iPage); + } + + @ApiOperation(value = "查询字典明细数据") + @RequestMapping("/getType/{name}") + public JSONArray getType(@PathVariable String name) { + if(!redisService.exists(name)){ + JSONArray json = sysDictService.getType(name); + redisService.setAndExpire(name,json.toJSONString(JSONWriter.Feature.WriteMapNullValue),3600); + return json; + }else{ + String jsonStr = redisService.get(name); + return JSONArray.parseArray(jsonStr, JSONReader.Feature.SupportAutoType); + } + } + + + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysDictDetailController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysDictDetailController.java new file mode 100644 index 000000000..43349a6da --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/SysDictDetailController.java @@ -0,0 +1,99 @@ +package com.jun.plugin.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jun.plugin.common.Result; +import com.jun.plugin.system.entity.SysDictDetailEntity; +import com.jun.plugin.system.service.SysDictDetailService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + + +/** + * 字典明细管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "字典明细管理") +@RestController +@RequestMapping("/sysDictDetail") +public class SysDictDetailController { + @Resource + private SysDictDetailService sysDictDetailService; + +// update `sys_dict_detail` t set t.`value2` = t.value WHERE t.dict_id = 7504415258303672; +// update `sys_dict_detail` t set t.`value` = t.label WHERE t.dict_id = 7504415258303672; +// update `sys_dict_detail` t set t.`label` = t.value2 WHERE t.dict_id = 7504415258303672; +// update `sys_dict_detail` t set t.`value2` = null WHERE t.dict_id = 7504415258303672; + + @ApiOperation(value = "新增") + @PostMapping("/add") + //@RequiresPermissions("sysDict:add") + public Result add(@RequestBody SysDictDetailEntity sysDictDetail) { + if (StringUtils.isEmpty(sysDictDetail.getValue())) { + return Result.fail("字典值不能为空"); + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(SysDictDetailEntity::getValue, sysDictDetail.getValue()); + queryWrapper.eq(SysDictDetailEntity::getDictId, sysDictDetail.getDictId()); + SysDictDetailEntity q = sysDictDetailService.getOne(queryWrapper); + if (q != null) { + return Result.fail("字典名称-字典值已存在"); + } + sysDictDetailService.save(sysDictDetail); + return Result.success(); + } + + @ApiOperation(value = "删除") + @DeleteMapping("/delete") + //@RequiresPermissions("sysDict:delete") + public Result delete(@RequestBody @ApiParam(value = "id集合") List ids) { + sysDictDetailService.removeByIds(ids); + return Result.success(); + } + + @ApiOperation(value = "更新") + @PutMapping("/update") + //@RequiresPermissions("sysDict:update") + public Result update(@RequestBody SysDictDetailEntity sysDictDetail) { + if (StringUtils.isEmpty(sysDictDetail.getValue())) { + return Result.fail("字典值不能为空"); + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(SysDictDetailEntity::getValue, sysDictDetail.getValue()); + queryWrapper.eq(SysDictDetailEntity::getDictId, sysDictDetail.getDictId()); + SysDictDetailEntity q = sysDictDetailService.getOne(queryWrapper); + if (q != null && !q.getId().equals(sysDictDetail.getId())) { + return Result.fail("字典名称-字典值已存在"); + } + + sysDictDetailService.updateById(sysDictDetail); + return Result.success(); + } + + + @ApiOperation(value = "查询列表数据") + @PostMapping("/listByPage") + //@RequiresPermissions("sysDict:list") + public Result findListByPage(@RequestBody SysDictDetailEntity sysDictDetail) { + Page page = new Page(sysDictDetail.getPage(), sysDictDetail.getLimit()); + if (StringUtils.isEmpty(sysDictDetail.getDictId())) { + return Result.success(); + } + IPage iPage = sysDictDetailService.listByPage(page, sysDictDetail.getDictId()); + return Result.success(iPage); + } + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/UserController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/UserController.java new file mode 100644 index 000000000..9b79c7f50 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/UserController.java @@ -0,0 +1,250 @@ +package com.jun.plugin.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.aop.annotation.DataScope; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.common.service.RedisService; +import com.jun.plugin.system.entity.SysUser; +import com.jun.plugin.system.entity.SysUserRole; +import com.jun.plugin.system.service.UserRoleService; +import com.jun.plugin.system.service.UserService; +import com.jun.plugin.system.vo.req.UserRoleOperationReqVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +//import org.apache.shiro.SecurityUtils; +//import org.apache.shiro.authz.annotation.RequiresPermissions; +//import org.apache.shiro.subject.Subject; +import org.springframework.ui.Model; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + * 用户管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RestController +@Api(tags = "组织模块-用户管理") +@RequestMapping("/sys") +@Slf4j +public class UserController { + @Resource + private UserService userService; + @Resource + private UserRoleService userRoleService; + @Resource + private HttpSessionService httpSessionService; + + @Resource + private RedisService redisService; + + /** + * 跳转到页面 + */ + @GetMapping("/users/user_list") + public String pjCustomer(Model model) { + return "/users/user_list"; + } + + @GetMapping("/users/user_list_test1") + @ResponseBody + public String pjCustomerTest1(Model model) { + return "/users/user_list"; + } + + @PostMapping(value = "/user/login") + @ApiOperation(value = "用户登录接口") + public Result login(@RequestBody @Valid SysUser vo, HttpServletRequest request) { + //判断验证码 +// if (!CaptchaUtil.ver(vo.getCaptcha(), request)) { +// // 清除session中的验证码 +// CaptchaUtil.clear(request); +// return Result.fail("验证码错误!"); +// } + if (vo.getVerCode()!=null){ + // 获取redis中的验证码 + String redisCode = redisService.get("captcha:"+vo.getVerCode()); + if(!StringUtils.hasText(redisCode)){ + return Result.fail("验证码已过期"); + } + // 判断验证码 + if (vo.getVerCode()==null ||vo.getCaptcha()==null || !redisCode.equals(vo.getCaptcha().trim().toLowerCase())) { + return Result.fail("验证码不正确"); + } + }else{ + return Result.fail("验证码不能为空"); + } + return Result.success(userService.login(vo)); + } + @PostMapping(value = "/user/token") + @ApiOperation(value = "用户登录JWT接口") + public Result token(@RequestBody @Valid SysUser vo, HttpServletRequest request) { + return Result.success(userService.login(vo)); + } + + @PostMapping("/user/register") + @ApiOperation(value = "用户注册接口") + public Result register(@RequestBody @Valid SysUser vo) { + userService.register(vo); + return Result.success(); + } + + + @GetMapping("/user/unLogin") + @ApiOperation(value = "引导客户端去登录") + public Result unLogin() { + return Result.getResult(BaseResponseCode.TOKEN_ERROR); + } + + @PutMapping("/user") + @ApiOperation(value = "更新用户信息接口") + //@RequiresPermissions("sys:user:update") + public Result updateUserInfo(@RequestBody SysUser vo) { + if (StringUtils.isEmpty(vo.getId())) { + return Result.fail("id不能为空"); + } + + userService.updateUserInfo(vo); + return Result.success(); + } + + @PutMapping("/user/info") + @ApiOperation(value = "更新用户信息接口") + public Result updateUserInfoById(@RequestBody SysUser vo) { + userService.updateUserInfoMy(vo); + return Result.success(); + } + + @GetMapping("/user/{id}") + @ApiOperation(value = "查询用户详情接口") + //@RequiresPermissions("sys:user:detail") + public Result detailInfo(@PathVariable("id") String id) { + return Result.success(userService.getById(id)); + } + + @GetMapping("/user") + @ApiOperation(value = "查询用户详情接口") + public Result youSelfInfo() { + String userId = httpSessionService.getCurrentUserId(); + return Result.success(userService.getById(userId)); + } + + @PostMapping("/users") + @ApiOperation(value = "分页获取用户列表接口") +// //@RequiresPermissions("sys:user:list") + @DataScope + public Result pageInfo(@RequestBody SysUser vo) { + return Result.success(userService.pageInfo(vo)); + } + + @PostMapping("/users/listByPage") + @ApiOperation(value = "分页获取用户列表接口") + // @DataScope + public Result listByPage(@RequestBody SysUser vo) { + if(!StringUtils.isEmpty(vo.getKeyword())) { + vo.setUsername(vo.getKeyword()); + vo.setRealName(vo.getKeyword()); + } + return Result.success(userService.pageInfo(vo)); + } + + @PostMapping("/users/listByPageApprover") + @ApiOperation(value = "分页获取用户列表接口") + public Result listByPageApprover(@RequestBody SysUser vo) { + if(!StringUtils.isEmpty(vo.getKeyword())) { + vo.setUsername(vo.getKeyword()); + vo.setRealName(vo.getKeyword()); + } + return Result.success(userService.pageInfoApprover(vo)); + } + + @PostMapping("/users/listByPageApproverByRole") + @ApiOperation(value = "分页获取用户列表接口") + public Result listByPageApproverByRole(@RequestBody SysUser vo) { + if(!StringUtils.isEmpty(vo.getKeyword())) { + vo.setUsername(vo.getKeyword()); + vo.setRealName(vo.getKeyword()); + } + return Result.success(userService.pageInfoApproverByRole(vo)); + } + + @PostMapping("/user") + @ApiOperation(value = "新增用户接口") + //@RequiresPermissions("sys:user:add") + public Result addUser(@RequestBody @Valid SysUser vo) { + userService.addUser(vo); + return Result.success(); + } + + @GetMapping("/user/logout") + @ApiOperation(value = "退出接口") + public Result logout() { + httpSessionService.abortUserByToken(); +// Subject subject = SecurityUtils.getSubject(); +// subject.logout(); + return Result.success(); + } + + @PutMapping("/user/pwd") + @ApiOperation(value = "修改密码接口") + public Result updatePwd(@RequestBody SysUser vo) { + if (StringUtils.isEmpty(vo.getOldPwd()) || StringUtils.isEmpty(vo.getNewPwd())) { + return Result.fail("旧密码与新密码不能为空"); + } + String userId = httpSessionService.getCurrentUserId(); + vo.setId(userId); + userService.updatePwd(vo); + return Result.success(); + } + + @DeleteMapping("/user") + @ApiOperation(value = "删除用户接口") + //@RequiresPermissions("sys:user:deleted") + public Result deletedUser(@RequestBody @ApiParam(value = "用户id集合") List userIds) { + //删除用户, 删除redis的绑定的角色跟权限 + httpSessionService.abortUserByUserIds(userIds); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.in(SysUser::getId, userIds); + userService.remove(queryWrapper); + return Result.success(); + } + + @GetMapping("/user/roles/{userId}") + @ApiOperation(value = "赋予角色-获取所有角色接口") + //@RequiresPermissions("sys:user:role:detail") + public Result getUserOwnRole(@PathVariable("userId") String userId) { + return Result.success(userService.getUserOwnRole(userId)); + } + + @PutMapping("/user/roles/{userId}") + @ApiOperation(value = "赋予角色-用户赋予角色接口") + //@RequiresPermissions("sys:user:update:role") + public Result setUserOwnRole(@PathVariable("userId") String userId, @RequestBody List roleIds) { + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(SysUserRole::getUserId, userId); + userRoleService.remove(queryWrapper); + if (!CollectionUtils.isEmpty(roleIds)) { + UserRoleOperationReqVO reqVO = new UserRoleOperationReqVO(); + reqVO.setUserId(userId); + reqVO.setRoleIds(roleIds); + userRoleService.addUserRoleInfo(reqVO); + } + //刷新权限 + httpSessionService.refreshUerId(userId); + return Result.success(); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/UserRoleController.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/UserRoleController.java new file mode 100644 index 000000000..9b7b5a18d --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/controller/UserRoleController.java @@ -0,0 +1,37 @@ +package com.jun.plugin.system.controller; + +import com.jun.plugin.common.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.jun.plugin.system.service.UserRoleService; +import com.jun.plugin.system.vo.req.UserRoleOperationReqVO; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 用户和角色关联 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@RequestMapping("/sys") +@RestController +@Api(tags = "组织管理-用户和角色关联接口") +public class UserRoleController { + @Resource + private UserRoleService userRoleService; + + @PostMapping("/user/role") + @ApiOperation(value = "修改或者新增用户角色接口") + public Result operationUserRole(@RequestBody @Valid UserRoleOperationReqVO vo) { + userRoleService.addUserRoleInfo(vo); + return Result.success(); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysContentEntity.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysContentEntity.java new file mode 100644 index 000000000..d6202ecea --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysContentEntity.java @@ -0,0 +1,67 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 内容管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_content") +public class SysContentEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("id") + private String id; + + /** + * 主题 + */ + @TableField("title") + private String title; + + /** + * 内容 + */ + @TableField("content") + private String content; + + /** + * 类型(数据字典) + */ + @TableField("type") + private String type; + + /** + * 创建人 + */ + @TableField(value = "create_id", fill = FieldFill.INSERT) + private String createId; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDept.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDept.java new file mode 100644 index 000000000..27ea82dd8 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDept.java @@ -0,0 +1,58 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + +/** + * 部门 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysDept implements Serializable { + @TableId + private String id; + + private String deptNo; + + @NotBlank(message = "机构名称不能为空") + private String name; + + @NotBlank(message = "父级不能为空") + private String pid; + + @TableField(exist = false) + private String pidName; + + private Integer status; + + private String relationCode; + + private String deptManagerId; + + private String managerName; + + private String phone; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDictDetailEntity.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDictDetailEntity.java new file mode 100644 index 000000000..ac499ce7e --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDictDetailEntity.java @@ -0,0 +1,77 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典明细 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_dict_detail") +public class SysDictDetailEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + @TableField("dict_name") + private String dict_name; + + @TableField("dict_remark") + private String dict_remark; + /** + * 字典标签 + */ + @TableField("label") + private String label; + + /** + * 字典值 + */ + @TableField("value") + private String value; + + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + + /** + * 字典id + */ + @TableField("dict_id") + private String dictId; + + /** + * 创建日期 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + /** + * 字典name + */ + @TableField(exist = false) + private String dictName; + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDictEntity.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDictEntity.java new file mode 100644 index 000000000..66447bf77 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysDictEntity.java @@ -0,0 +1,74 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典管理 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_dict") +public class SysDictEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + + @TableField("code") + private String code; + /** + * 字典名称 + */ + @TableField("name") + private String name; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + @TableField("sort") + private Integer sort; + + @TableField("status") + private String status; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + @TableField(value = "update_time", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime; + + @TableField(value = "create_user", fill = FieldFill.INSERT) + private String createUser; + + @TableField(value = "update_user", fill = FieldFill.INSERT) + private String updateUser; + + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysPermission.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysPermission.java new file mode 100644 index 000000000..4a7ff266c --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysPermission.java @@ -0,0 +1,68 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + * 权限菜单 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysPermission implements Serializable { + + + @TableId + private String id; + + @NotBlank(message = "菜单权限名称不能为空") + private String name; + + private String perms; + + @TableField("url") + private String url; + + @TableField("url") + private String href; + + private String icon; + + private String target; + + @NotNull(message = "所属菜单不能为空") + private String pid; + + private Integer orderNum; + + @NotNull(message = "菜单权限类型不能为空") + private Integer type; + + private Integer status; + + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + + @TableField(exist = false) + private String pidName; + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRole.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRole.java new file mode 100644 index 000000000..bd6b6dbb0 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRole.java @@ -0,0 +1,71 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jun.plugin.common.entity.BaseEntity; +import com.jun.plugin.system.vo.resp.DeptRespNodeVO; +import com.jun.plugin.system.vo.resp.PermissionRespNode; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 角色 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class SysRole extends BaseEntity implements Serializable { + @TableId + private String id; + + @NotBlank(message = "名称不能为空") + private String name; + + private String description; + + private Integer status; + + private Integer dataScope; + + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + + @TableField(exist = false) + private List permissionRespNodes; + @TableField(exist = false) + private List deptRespNodes; + + @TableField(exist = false) + private String startTime; + + @TableField(exist = false) + private String endTime; + + @TableField(exist = false) + private List permissions; + + @TableField(exist = false) + private List depts; + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRoleDeptEntity.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRoleDeptEntity.java new file mode 100644 index 000000000..167cd3192 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRoleDeptEntity.java @@ -0,0 +1,53 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色部门 + * + * @author wujun + * @email *****@mail.com + * @date 2020-09-27 17:30:15 + */ +@Data +@TableName("sys_role_dept") +public class SysRoleDeptEntity extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 角色id + */ + @TableField("role_id") + private String roleId; + + /** + * 菜单权限id + */ + @TableField("dept_id") + private String deptId; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRolePermission.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRolePermission.java new file mode 100644 index 000000000..a23d4715c --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysRolePermission.java @@ -0,0 +1,33 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色权限 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysRolePermission implements Serializable { + @TableId + private String id; + + private String roleId; + + private String permissionId; + + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysUser.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysUser.java new file mode 100644 index 000000000..6ccef09ad --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysUser.java @@ -0,0 +1,229 @@ +package com.jun.plugin.system.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import javax.validation.constraints.NotBlank; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import com.jun.plugin.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysUser extends BaseEntity implements Serializable { + @TableId + private String id; + + @NotBlank(message = "账号不能为空") + private String username; + + private String salt; + + @NotBlank(message = "密码不能为空") + private String password; + + @TableField(exist = false) + private String oldPwd; + + @TableField(exist = false) + private String newPwd; + + private String phone; + + private String deptId; + + @TableField(exist = false) + private String deptName; + + @TableField(exist = false) + private String deptNo; + + private String realName; + + private String nickName; + + private String email; + + private Integer status; + + private Integer sex; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + + private String createId; + + private String updateId; + + private Integer createWhere; + + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime; + + @TableField(exist = false) + private String startTime; + + @TableField(exist = false) + private String endTime; + + @TableField(exist = false) + private List roleIds; + + @TableField(exist = false) + private String captcha; + + @TableField(exist = false) + private String verCode; + +// @TableField(exist = false) +// private List userDataPowers; + + @TableField(exist = false) + public Boolean isSuperAdmin; + + @TableField(value = "remark") + private String remark; + + @TableField(value = "leavel") + private String leavel; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "borndate") + private Date borndate; + @TableField(value = "age") + private String age; + @TableField(value = "dangyuan") + private String dangyuan; + @TableField(value = "education1") + private String education1; + @TableField(value = "school1") + private String school1; + @TableField(value = "major1") + private String major1; + @TableField(value = "major2") + private String major2; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "majordate") + private Date majordate; + @TableField(value = "majorno") + private String majorno; + @TableField(value = "schooltype") + private String schooltype; + @TableField(value = "isfulltime") + private String isfulltime; + @TableField(value = "school2") + private String school2; + @TableField(value = "educol1") + private String educol1; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "educol2") + private Date educol2; + @TableField(value = "educol3") + private String educol3; + @TableField(value = "educol4") + private String educol4; + @TableField(value = "educol11") + private String educol11; + @TableField(value = "educol12") + private String educol12; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "educol13") + private Date educol13; + @TableField(value = "educol14") + private String educol14; + @TableField(value = "educol15") + private String educol15; + @TableField(value = "educol16") + private String educol16; + @TableField(value = "educol17") + private String educol17; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "educol18") + private Date educol18; + @TableField(value = "educol19") + private String educol19; + @TableField(value = "engtype") + private String engtype; + @TableField(value = "otherlang") + private String otherlang; + @TableField(value = "otherexam") + private String otherexam; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "worktimebegin") + private Date worktimebegin; + @TableField(value = "companybeforejonin") + private String companybeforejonin; + @TableField(value = "companybeforejoninjob") + private String companybeforejoninjob; + @TableField(value = "companybeforejonin2") + private String companybeforejonin2; + @TableField(value = "companybeforejoninjob2") + private String companybeforejoninjob2; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "joincompanytime") + private Date joincompanytime; + @TableField(value = "companyage") + private String companyage; + @TableField(value = "jobtitle") + private String jobtitle; + @TableField(value = "jobtitleno") + private String jobtitleno; + @TableField(value = "isoutsitejob") + private String isoutsitejob; + @TableField(value = "passcount") + private String passcount; + @TableField(value = "noexamcount") + private String noexamcount; + @TableField(value = "cpacount1") + private String cpacount1; + @TableField(value = "cpapasscounte") + private String cpapasscounte; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @TableField(value = "cpadate1") + private Date cpadate1; + @TableField(value = "cpano") + private String cpano; + @TableField(value = "cpacode") + private String cpacode; + @TableField(value = "cpacode2") + private String cpacode2; + @TableField(value = "cpacode3") + private String cpacode3; + @TableField(value = "cpacode4") + private String cpacode4; + @TableField(value = "goodat") + private String goodat; + @TableField(value = "homeadress") + private String homeadress; + @TableField(value = "telephone") + private String telephone; + @TableField(value = "idno") + private String idno; + + + @TableField(exist = false) + private String processName; + @TableField(exist = false) + private String taskName; + + + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysUserRole.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysUserRole.java new file mode 100644 index 000000000..1ef7410a4 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/entity/SysUserRole.java @@ -0,0 +1,34 @@ +package com.jun.plugin.system.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户角色 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysUserRole implements Serializable { + @TableId + private String id; + + private String userId; + + private String roleId; + + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysContentMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysContentMapper.java new file mode 100644 index 000000000..bd227bfee --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysContentMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysContentEntity; + +/** + * 内容管理 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysContentMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDeptMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDeptMapper.java new file mode 100644 index 000000000..a409a055a --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDeptMapper.java @@ -0,0 +1,14 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysDept; + +/** + * 部门 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysDeptMapper extends BaseMapper { +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDictDetailMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDictDetailMapper.java new file mode 100644 index 000000000..09bb3531f --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDictDetailMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysDictDetailEntity; + +/** + * 字典详情 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysDictDetailMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDictMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDictMapper.java new file mode 100644 index 000000000..f67db1257 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysDictMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysDictEntity; + +/** + * 字典 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysDictMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysPermissionMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysPermissionMapper.java new file mode 100644 index 000000000..065a22d81 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysPermissionMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysPermission; + +/** + * 菜单权限 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysPermissionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRoleDeptMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 000000000..ed0f62bbc --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysRoleDeptEntity; + +/** + * 角色部门 + * + * @author wujun + * @email *****@mail.com + * @date 2020-09-27 17:30:15 + */ +public interface SysRoleDeptMapper extends BaseMapper { + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRoleMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRoleMapper.java new file mode 100644 index 000000000..515dac365 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRoleMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysRole; + +/** + * 角色 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRolePermissionMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRolePermissionMapper.java new file mode 100644 index 000000000..2b2746e26 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysRolePermissionMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysRolePermission; + +/** + * 角色权限 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysRolePermissionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysUserMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysUserMapper.java new file mode 100644 index 000000000..7ae0ba8c0 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysUserMapper.java @@ -0,0 +1,42 @@ +package com.jun.plugin.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysUser; + +/** + * 用户 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysUserMapper extends BaseMapper { + + +// select * from sys_user where username in ( +// +// SELECT +// substring_index(substring_index(A.COL,',', b.help_topic_id + 0), ',', -1) result +// FROM +// (SELECT editor COL from pj_customer where id = '1671402363726102529') A join +// mysql.help_topic b +// where +// b.help_topic_id < (LENGTH(A.COL) - LENGTH(REPLACE(A.COL, ',', '')) + 2) +// +// ) + @Select("select * from sys_user where username=#{username} ") + SysUser getUserByName(@Param("username") String username); + + + @Select(" SELECT * from sys_user u \r\n" + + "INNER JOIN sys_user_role ur on u.id = ur.user_id\r\n" + + "INNER JOIN sys_role r on ur.role_id = r.id\r\n" + + "where r.id in (\r\n" + + "SELECT r1.id from sys_role r1 where r.name like '%#{roleName}%' ) ") + List getUserByRoleName(@Param("roleName") String roleName); +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysUserRoleMapper.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysUserRoleMapper.java new file mode 100644 index 000000000..c36af1b02 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jun.plugin.system.entity.SysUserRole; + +/** + * 用户角色 Mapper + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysUserRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/DeptService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/DeptService.java new file mode 100644 index 000000000..157be604b --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/DeptService.java @@ -0,0 +1,47 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysDept; +import com.jun.plugin.system.vo.resp.DeptRespNodeVO; + +import java.util.List; + +/** + * 部门 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface DeptService extends IService { + + /** + * 添加部门 + * + * @param vo vo + */ + void addDept(SysDept vo); + + /** + * 更新部门 + * + * @param vo vo + */ + void updateDept(SysDept vo); + + /** + * 删除部门 + * + * @param id id + */ + void deleted(String id); + + /** + * 部门树形列表 + * + * @param deptId deptId + * @param disabled 最顶级是否可用 + * @return 树形列表 + */ + List deptTreeList(String deptId, Boolean disabled); +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/HomeService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/HomeService.java new file mode 100644 index 000000000..48cb74f2f --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/HomeService.java @@ -0,0 +1,30 @@ +package com.jun.plugin.system.service; + +import com.jun.plugin.system.vo.resp.HomeRespVO; +import com.jun.plugin.system.vo.resp.UserInfoRespVO; + +/** + * 首页 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface HomeService { + + /** + * 获取首页信息 + * + * @param userId userId + * @return HomeRespVO + */ + HomeRespVO getHomeInfo(String userId); + + /** + * 获取首页信息 + * + * @param userId userId + * @return HomeRespVO + */ + UserInfoRespVO getUserInfo(String userId); +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/PermissionService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/PermissionService.java new file mode 100644 index 000000000..b2825ca56 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/PermissionService.java @@ -0,0 +1,87 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysPermission; +import com.jun.plugin.system.vo.resp.PermissionRespNode; + +import java.util.List; +import java.util.Set; + +/** + * 菜单权限 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface PermissionService extends IService { + + /** + * 根据userId获取权限 + * + * @param userId userId + * @return 权限 + */ + List getPermission(String userId); + + /** + * 删除权限 + * + * @param permissionId 权限id + */ + void deleted(String permissionId); + + /** + * 获取所有 + * + * @return List + */ + List selectAll(); + + /** + * 根据userId获取权限标志 + * + * @param userId userId + * @return Set + */ + Set getPermissionsByUserId(String userId); + + /** + * 根据userId获取权限树 + * + * @param userId + * @return List + */ + List permissionTreeList(String userId); + + /** + * 根据权限树 + * + * @return List + */ + List selectAllByTree(); + + /** + * 根据目录树 + * + * @param permissionId permissionId + * @return List + */ + List selectAllMenuByTree(String permissionId); + + + /** + * 根据权限id获取绑定的userId + * + * @param permissionId permissionId + * @return List + */ + List getUserIdsById(String permissionId); + + /** + * 更新 + * + * @param vo vo + */ + void updatePermission(SysPermission vo); +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/RolePermissionService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/RolePermissionService.java new file mode 100644 index 000000000..1a561e5af --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/RolePermissionService.java @@ -0,0 +1,22 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysRolePermission; +import com.jun.plugin.system.vo.req.RolePermissionOperationReqVO; + +/** + * 角色权限关联 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface RolePermissionService extends IService { + + /** + * 角色绑定权限 + * + * @param vo vo + */ + void addRolePermission(RolePermissionOperationReqVO vo); +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/RoleService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/RoleService.java new file mode 100644 index 000000000..421c472a1 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/RoleService.java @@ -0,0 +1,61 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysRole; + +import java.util.List; + +/** + * 角色 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface RoleService extends IService { + + /** + * 添加角色 + * + * @param vo SysRole + */ + void addRole(SysRole vo); + + /** + * 更新角色 + * + * @param vo SysRole + */ + void updateRole(SysRole vo); + + /** + * 根据id获取角色详情 + * + * @param id id + * @return SysRole + */ + SysRole detailInfo(String id); + + /** + * 根据id删除 + * + * @param id id + */ + void deletedRole(String id); + + /** + * 根据userId获取绑定的角色 + * + * @param userId userId + * @return List + */ + List getRoleInfoByUserId(String userId); + + /** + * 根据userId获取绑定的角色名 + * + * @param userId userId + * @return List + */ + List getRoleNames(String userId); +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysContentService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysContentService.java new file mode 100644 index 000000000..5094aef65 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysContentService.java @@ -0,0 +1,16 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysContentEntity; + +/** + * 内容 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysContentService extends IService { + +} + diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysDictDetailService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysDictDetailService.java new file mode 100644 index 000000000..345ef5167 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysDictDetailService.java @@ -0,0 +1,26 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysDictDetailEntity; + +/** + * 数据字典 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysDictDetailService extends IService { + + /** + * 分页 + * + * @param page page + * @param dictId dictId + * @return IPage + */ + IPage listByPage(Page page, String dictId); +} + diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysDictService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysDictService.java new file mode 100644 index 000000000..474ddfcc3 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysDictService.java @@ -0,0 +1,21 @@ +package com.jun.plugin.system.service; + +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysDictEntity; + +/** + * 数据字典 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysDictService extends IService { + + JSONArray getType(String name); + + JSONArray getType2(String name); + +} + diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysRoleDeptService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysRoleDeptService.java new file mode 100644 index 000000000..4a526483b --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/SysRoleDeptService.java @@ -0,0 +1,16 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysRoleDeptEntity; + +/** + * 角色部门 + * + * @author wujun + * @email *****@mail.com + * @date 2020-09-27 17:30:15 + */ +public interface SysRoleDeptService extends IService { + +} + diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/UserRoleService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/UserRoleService.java new file mode 100644 index 000000000..1ce653aa1 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/UserRoleService.java @@ -0,0 +1,40 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysUserRole; +import com.jun.plugin.system.vo.req.UserRoleOperationReqVO; + +import java.util.List; + +/** + * 用户角色 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface UserRoleService extends IService { + + /** + * 根据userId获取绑定的角色id + * + * @param userId userId + * @return List + */ + List getRoleIdsByUserId(String userId); + + /** + * 用户绑定角色 + * + * @param vo vo + */ + void addUserRoleInfo(UserRoleOperationReqVO vo); + + /** + * 根据角色id获取绑定的人 + * + * @param roleId roleId + * @return List + */ + List getUserIdsByRoleId(String roleId); +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/UserService.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/UserService.java new file mode 100644 index 000000000..b7a43477d --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/UserService.java @@ -0,0 +1,86 @@ +package com.jun.plugin.system.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jun.plugin.system.entity.SysUser; +import com.jun.plugin.system.vo.resp.LoginRespVO; +import com.jun.plugin.system.vo.resp.UserOwnRoleRespVO; + +/** + * 用户 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +public interface UserService extends IService { + + /** + * 注册 + * + * @param vo vo + */ + void register(SysUser vo); + + /** + * 登陆 + * + * @param vo vo + * @return LoginRespVO + */ + LoginRespVO login(SysUser vo); + + /** + * 更新用户信息 + * + * @param vo vo + */ + void updateUserInfo(SysUser vo); + + /** + * 分页 + * + * @param vo vo + * @return IPage + */ + IPage pageInfo(SysUser vo); + + /** + * 分页 + * + * @param vo vo + * @return IPage + */ + IPage pageInfoApprover(SysUser vo); + + /** + * 添加用户 + * + * @param vo vo + */ + void addUser(SysUser vo); + + /** + * 修改密码 + * + * @param vo vo + */ + void updatePwd(SysUser vo); + + /** + * 根据userid获取绑定角色 + * + * @param userId userId + * @return UserOwnRoleRespVO + */ + UserOwnRoleRespVO getUserOwnRole(String userId); + + /** + * 修改自己信息 + * + * @param vo vo + */ + void updateUserInfoMy(SysUser vo); + + IPage pageInfoApproverByRole(SysUser vo); +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/DeptServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/DeptServiceImpl.java new file mode 100644 index 000000000..985a8b53e --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/DeptServiceImpl.java @@ -0,0 +1,213 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.system.entity.SysDept; +import com.jun.plugin.system.entity.SysUser; +import com.jun.plugin.system.mapper.SysDeptMapper; +import com.jun.plugin.system.mapper.SysUserMapper; +import com.jun.plugin.system.service.DeptService; +import com.jun.plugin.system.vo.resp.DeptRespNodeVO; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +/** + * 部门 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +@Slf4j +public class DeptServiceImpl extends ServiceImpl implements DeptService { + + @Resource + private SysDeptMapper sysDeptMapper; + @Resource + private SysUserMapper sysUserMapper; + + @Override + public void addDept(SysDept vo) { + String relationCode; + String deptCode = this.getNewDeptCode(); + SysDept parent = sysDeptMapper.selectById(vo.getPid()); + if ("0".equals(vo.getPid())) { + relationCode = deptCode; + } else if (null == parent) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } else { + relationCode = parent.getRelationCode() + deptCode; + } + vo.setDeptNo(deptCode); + vo.setRelationCode(relationCode); + vo.setStatus(1); + sysDeptMapper.insert(vo); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDept(SysDept vo) { + + SysDept sysDept = sysDeptMapper.selectById(vo.getId()); + if (null == sysDept) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + sysDeptMapper.updateById(vo); + //说明层级发生了变化 + if (!StringUtils.isEmpty(vo.getPid()) && !vo.getPid().equals(sysDept.getPid())) { + SysDept parent = sysDeptMapper.selectById(vo.getPid()); + if (!"0".equals(vo.getPid()) && null == parent) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + SysDept oldParent = sysDeptMapper.selectById(sysDept.getPid()); + String oldRelationCode; + String newRelationCode; + //根目录降到其他目录 + if ("0".equals(sysDept.getPid())) { + oldRelationCode = sysDept.getDeptNo(); + newRelationCode = parent.getRelationCode() + sysDept.getDeptNo(); + } else if ("0".equals(vo.getPid())) { // 其他目录升级到跟目录 + oldRelationCode = sysDept.getRelationCode(); + newRelationCode = sysDept.getDeptNo(); + } else { + oldRelationCode = oldParent.getRelationCode(); + newRelationCode = parent.getRelationCode(); + } + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.likeLeft(SysDept::getDeptNo, sysDept.getDeptNo()); + List list = sysDeptMapper.selectList(wrapper); + list.parallelStream().forEach(entity -> { + String relationCode = entity.getRelationCode().replace(oldRelationCode, newRelationCode); + entity.setRelationCode(relationCode); + sysDeptMapper.updateById(entity); + }); + } + } + + @Override + public void deleted(String id) { + SysDept sysDept = sysDeptMapper.selectById(id); + if (null == sysDept) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + List deptIds = sysDeptMapper.selectObjs(Wrappers.lambdaQuery().select(SysDept::getId).likeRight(SysDept::getRelationCode, sysDept.getRelationCode())); + List list = sysUserMapper.selectList(Wrappers.lambdaQuery().in(SysUser::getDeptId, deptIds)); + if (!CollectionUtils.isEmpty(list)) { + throw new BusinessException(BaseResponseCode.NOT_PERMISSION_DELETED_DEPT); + } + sysDeptMapper.deleteById(id); + } + + @Override + public List deptTreeList(String deptId, Boolean disabled) { + List list; + if (StringUtils.isEmpty(deptId)) { + list = sysDeptMapper.selectList(Wrappers.emptyWrapper()); + } else { + SysDept sysDept = sysDeptMapper.selectById(deptId); + if (sysDept == null) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().likeRight(SysDept::getRelationCode, sysDept.getRelationCode()); + List childIds = sysDeptMapper.selectObjs(queryWrapper); + list = sysDeptMapper.selectList(Wrappers.lambdaQuery().notIn(SysDept::getId, childIds)); + } + // 默认加一个顶级方便新增顶级部门 + DeptRespNodeVO respNodeVO = new DeptRespNodeVO(); + respNodeVO.setTitle("默认顶级部门"); + respNodeVO.setId("0"); + respNodeVO.setSpread(true); + respNodeVO.setDisabled(disabled); + respNodeVO.setChildren(getTree(list)); + List result = new ArrayList<>(); + result.add(respNodeVO); + return result; + } + + private List getTree(List all) { + List list = new ArrayList<>(); + for (SysDept sysDept : all) { + if ("0".equals(sysDept.getPid())) { + DeptRespNodeVO deptTree = new DeptRespNodeVO(); + BeanUtils.copyProperties(sysDept, deptTree); + deptTree.setTitle(sysDept.getName()); + deptTree.setSpread(true); + deptTree.setChildren(getChild(sysDept.getId(), all)); + list.add(deptTree); + } + } + return list; + } + + private List getChild(String id, List all) { + List list = new ArrayList<>(); + for (SysDept sysDept : all) { + if (sysDept.getPid().equals(id)) { + DeptRespNodeVO deptTree = new DeptRespNodeVO(); + BeanUtils.copyProperties(sysDept, deptTree); + deptTree.setTitle(sysDept.getName()); + deptTree.setChildren(getChild(sysDept.getId(), all)); + list.add(deptTree); + } + } + return list; + } + + //获取新的部门编码 + public String getNewDeptCode() { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.select(SysDept::getDeptNo); + //获取所有的deptCode + List deptCodes = sysDeptMapper.selectObjs(lambdaQueryWrapper); + AtomicReference maxDeptCode = new AtomicReference<>(0); + + //遍历获取最大的DeptCode + deptCodes.forEach(o -> { + String str = String.valueOf(o); + if (str.length() >= 7) { + Integer one = Integer.parseInt(str.substring(str.length() - 5)); + if (one > maxDeptCode.get()) { + maxDeptCode.set(one); + } + } + }); + + return padRight(maxDeptCode.get() + 1, 6, "0"); + } + + + /** + * 右补位,左对齐 + * + * @param len 目标字符串长度 + * @param alexi 补位字符 + * @param oriStr 原字符串 + * @return 目标字符串 + * 以alexin 做为补位 + */ + public static String padRight(int oriStr, int len, String alexi) { + StringBuilder str = new StringBuilder(); + int strlen = String.valueOf(oriStr).length(); + if (strlen < len) { + for (int i = 0; i < len - strlen; i++) { + str.append(alexi); + } + } + str.append(oriStr); + return "D" + str.toString(); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/HomeServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/HomeServiceImpl.java new file mode 100644 index 000000000..80fe68b57 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/HomeServiceImpl.java @@ -0,0 +1,69 @@ +package com.jun.plugin.system.service.impl; + +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.jun.plugin.system.entity.SysDept; +import com.jun.plugin.system.entity.SysUser; +import com.jun.plugin.system.service.DeptService; +import com.jun.plugin.system.service.HomeService; +import com.jun.plugin.system.service.PermissionService; +import com.jun.plugin.system.service.UserService; +import com.jun.plugin.system.vo.resp.HomeRespVO; +import com.jun.plugin.system.vo.resp.PermissionRespNode; +import com.jun.plugin.system.vo.resp.UserInfoRespVO; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 首页 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +public class HomeServiceImpl implements HomeService { + @Resource + private UserService userService; + @Resource + private DeptService deptService; + @Resource + private PermissionService permissionService; + + @Override + public HomeRespVO getHomeInfo(String userId) { + SysUser sysUser = userService.getById(userId); + UserInfoRespVO vo = new UserInfoRespVO(); + + if (sysUser != null) { + BeanUtils.copyProperties(sysUser, vo); + SysDept sysDept = deptService.getById(sysUser.getDeptId()); + if (sysDept != null) { + vo.setDeptId(sysDept.getId()); + vo.setDeptName(sysDept.getName()); + } + } + List menus = permissionService.permissionTreeList(userId); + HomeRespVO respVO = new HomeRespVO(); + respVO.setMenus(menus); + respVO.setUserInfo(vo); + return respVO; + } + + @Override + public UserInfoRespVO getUserInfo(String userId) { + SysUser sysUser = userService.getById(userId); + UserInfoRespVO vo = new UserInfoRespVO(); + if (sysUser != null) { + BeanUtils.copyProperties(sysUser, vo); + SysDept sysDept = deptService.getById(sysUser.getDeptId()); + if (sysDept != null) { + vo.setDeptId(sysDept.getId()); + vo.setDeptName(sysDept.getName()); + } + } + return vo; + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/HttpSessionServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/HttpSessionServiceImpl.java new file mode 100644 index 000000000..4acbf8f5b --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/HttpSessionServiceImpl.java @@ -0,0 +1,317 @@ +package com.jun.plugin.system.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.jwt.JWTUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.jun.plugin.common.constant.Constant; +import com.jun.plugin.common.entity.BaseEntity; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.common.service.RedisService; +import com.jun.plugin.system.entity.SysUser; +import com.jun.plugin.system.service.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.*; + +/** + * session管理器 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service(value = "httpSessionService") +public class HttpSessionServiceImpl implements HttpSessionService { + @Resource + private RedisService redisService; + @Resource + private UserRoleService userRoleService; + @Resource + private RolePermissionService rolePermissionService; + @Resource + private HttpServletRequest request; + @Resource + @Lazy + private PermissionService permissionService; + @Resource + private RoleService roleService; + + @Value("${spring.redis.key.prefix.userToken}") + private String userTokenPrefix; + + @Value("${spring.redis.key.expire.userToken}") + private int exire; + + @Value("${spring.redis.key.prefix.permissionRefresh}") + private String redisPermissionRefreshKey; + + @Value("${spring.redis.key.expire.permissionRefresh}") + private Long redisPermissionRefreshExpire; + + @Override + public String createTokenAndUser(BaseEntity user, List roles, Set permissions, String jwtToken) { + return this.createTokenAndUser((SysUser) user, roles, permissions, jwtToken); + } + public String createTokenAndUser(SysUser user, List roles, Set permissions, String jwtToken) { + //方便根据id找到redis的key, 修改密码/退出登陆 方便使用 + //String token = jwtToken + "#" + user.getId(); + String token = jwtToken; + JSONObject sessionInfo = new JSONObject(); + sessionInfo.put(Constant.USERID_KEY, user.getId()); + sessionInfo.put(Constant.USERNAME_KEY, user.getUsername()); + sessionInfo.put(Constant.USERPHONE_KEY, user.getPhone()); + sessionInfo.put(Constant.USERREALNAME_KEY, user.getRealName()); + sessionInfo.put(Constant.USERDEPTID_KEY, user.getDeptId()); + sessionInfo.put(Constant.USERDEPTNO_KEY, user.getDeptNo()); + sessionInfo.put(Constant.USERDEPTNAME_KEY, user.getDeptName()); + sessionInfo.put(Constant.ROLES_KEY, roles); + sessionInfo.put(Constant.USER_KEY, user); + sessionInfo.put(Constant.PERMISSIONS_KEY, permissions); + String key = userTokenPrefix + token; + //设置该用户已登录的token + redisService.setAndExpire(key, sessionInfo.toJSONString(), exire); + redisService.setAndExpire(userTokenPrefix+jwtToken, sessionInfo.toJSONString(), exire); + + //登陆后删除权限刷新标志 + redisService.del(redisPermissionRefreshKey + user.getId()); + return token; + } + + + /** + * 获取参数中的token + * + * @return token + */ + @Override + public String getTokenFromHeader() { + String token = null; + try { + token = request.getHeader(Constant.ACCESS_TOKEN); + //如果header中不存在token,则从参数中获取token + if (StringUtils.isBlank(token)) { + token = request.getParameter(Constant.ACCESS_TOKEN); + } + } catch (IllegalStateException e) { + return null; + } + return token; + } + + /** + * 获取当前session信息 + * + * @return session信息 + */ + @Override + public JSONObject getCurrentSession() { + String token = getTokenFromHeader(); + if (null != token) { + if (redisService.exists(userTokenPrefix + token)) { + String sessionInfoStr = redisService.get(userTokenPrefix + token); + return JSON.parseObject(sessionInfoStr); + } else { + return null; + } + } else { + return null; + } + } + + /** + * 获取当前session信息 username + * + * @return username + */ + @Override + public String getCurrentUsername() { + if (getCurrentSession() != null) { + return getCurrentSession().getString(Constant.USERNAME_KEY); + } else { + return null; + } + } + /** + * 获取当前session信息 username + * + * @return username + */ + @Override + public String getCurrentUserRealname() { + if (getCurrentSession() != null) { + return getCurrentSession().getString(Constant.USERREALNAME_KEY); + } else { + return null; + } + } + + /** + * 获取当前session信息 UserId + * + * @return UserId + */ +// @Cacheable(cacheNames = "cache1m") + @Override + public String getCurrentUserId() { + if (getCurrentSession() != null) { + return getCurrentSession().getString(Constant.USERID_KEY); + } else { + return null; + } + } + + + /** + * 使当前用户的token失效 + */ + @Override + public void abortUserByToken() { + String token = getTokenFromHeader(); + redisService.del(userTokenPrefix + token); + } + + /** + * 使所有用户的token失效 + */ + @Override + public void abortAllUserByToken() { + String token = getTokenFromHeader(); + String userId = HttpSessionService.getUserIdByToken(token); + redisService.delKeys(userTokenPrefix + "*#" + userId); + } + + /** + * 使用户的token失效 + */ + @Override + public void abortUserById(String userId) { + redisService.delKeys(userTokenPrefix + "*#" + userId); + } + + /** + * 使多个用户的token失效 + */ + @Override + public void abortUserByUserIds(List userIds) { + if (CollectionUtils.isNotEmpty(userIds)) { + for (String id : userIds) { + redisService.delKeys(userTokenPrefix + "*#" + id); + } + + } + } + + /** + * 根据用户id, 刷新redis用户权限 + * + * @param userId userId + */ + @Override + public void refreshUerId(String userId) { +// redisService.delKeys(userTokenPrefix + "*#" + userId); + + + Set keys = redisService.keys("#" + userId); + //如果修改了角色/权限, 那么刷新权限 + for (String key : keys) { + JSONObject redisSession = JSON.parseObject(redisService.get(key)); + + List roleNames = getRolesByUserId(userId); + if (!CollectionUtils.isEmpty(roleNames)) { + redisSession.put(Constant.ROLES_KEY, roleNames); + } + Set permissions = getPermissionsByUserId(userId); + redisSession.put(Constant.PERMISSIONS_KEY, permissions); + Long redisTokenKeyExpire = redisService.getExpire(key); + //刷新token绑定的角色权限 + redisService.setAndExpire(key, redisSession.toJSONString(), redisTokenKeyExpire); + + } + } + + /** + * 根据角色id, 刷新redis用户权限 + * + * @param roleId roleId + */ + @Override + public void refreshRolePermission(String roleId) { + List userIds = userRoleService.getUserIdsByRoleId(roleId); + if (!CollectionUtils.isEmpty(userIds)) { + userIds.parallelStream().forEach(this::refreshUerId); + } + } + + /** + * 根据权限id, 刷新redis用户权限 + * + * @param permissionId permissionId + */ + @Override + public void refreshPermission(String permissionId) { + List userIds = permissionService.getUserIdsById(permissionId); + if (!CollectionUtils.isEmpty(userIds)) { + userIds.parallelStream().forEach(this::refreshUerId); + } + } + + private String getJWTToken(String username) { + Map map = new HashMap() { + private static final long serialVersionUID = 1L; + { + put("uid", Integer.parseInt("123")); + put("expire_time", System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 15); + } + }; + map.put("userId",IdUtil.fastSimpleUUID()); + map.put("role", 0); + map.put("pwd",SecureUtil.md5("123456")); + String token = JWTUtil.createToken(map, "1234".getBytes()); + System.out.println(token); + return token; + } + /** + * 生成随机的token + * + * @return token + */ + @Deprecated + private String getRandomToken() { + Random random = new Random(); + StringBuilder randomStr = new StringBuilder(); + + // 根据length生成相应长度的随机字符串 + for (int i = 0; i < 32; i++) { + String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; + + //输出字母还是数字 + if ("char".equalsIgnoreCase(charOrNum)) { + //输出是大写字母还是小写字母 + int temp = random.nextInt(2) % 2 == 0 ? 65 : 97; + randomStr.append((char) (random.nextInt(26) + temp)); + } else { + randomStr.append(random.nextInt(10)); + } + } + + return randomStr.toString(); + } + + + private List getRolesByUserId(String userId) { + return roleService.getRoleNames(userId); + } + + private Set getPermissionsByUserId(String userId) { + return permissionService.getPermissionsByUserId(userId); + } + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/PermissionServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/PermissionServiceImpl.java new file mode 100644 index 000000000..18032e206 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/PermissionServiceImpl.java @@ -0,0 +1,289 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.system.entity.SysPermission; +import com.jun.plugin.system.entity.SysRolePermission; +import com.jun.plugin.system.entity.SysUserRole; +import com.jun.plugin.system.mapper.SysPermissionMapper; +import com.jun.plugin.system.service.PermissionService; +import com.jun.plugin.system.service.RolePermissionService; +import com.jun.plugin.system.service.UserRoleService; +import com.jun.plugin.system.vo.resp.PermissionRespNode; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 菜单权限 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +@Slf4j +public class PermissionServiceImpl extends ServiceImpl implements PermissionService { + @Resource + private UserRoleService userRoleService; + @Resource + private RolePermissionService rolePermissionService; + @Resource + private SysPermissionMapper sysPermissionMapper; + @Resource + @Lazy + private HttpSessionService httpSessionService; + + /** + * 根据用户查询拥有的权限 + * 先查出用户拥有的角色 + * 再去差用户拥有的权限 + * 也可以多表关联查询 + */ + @Override + public List getPermission(String userId) { + List roleIds = userRoleService.getRoleIdsByUserId(userId); + if (CollectionUtils.isEmpty(roleIds)) { + return null; + } + List permissionIds = rolePermissionService.listObjs(Wrappers.lambdaQuery().select(SysRolePermission::getPermissionId).in(SysRolePermission::getRoleId, roleIds)); + if (CollectionUtils.isEmpty(permissionIds)) { + return null; + } + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().in(SysPermission::getId, permissionIds).orderByAsc(SysPermission::getOrderNum); + return sysPermissionMapper.selectList(queryWrapper); + } + + /** + * 删除菜单权限 + * 判断是否 有角色关联 + * 判断是否有子集 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleted(String permissionId) { + //获取关联userId + List userIds = getUserIdsById(permissionId); + SysPermission sysPermission = sysPermissionMapper.selectById(permissionId); + if (null == sysPermission) { + log.error("传入 的 id:{}不合法", permissionId); + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + //获取下一级 + List childs = sysPermissionMapper.selectList(Wrappers.lambdaQuery().eq(SysPermission::getPid, permissionId)); + if (!CollectionUtils.isEmpty(childs)) { +// throw new BusinessException(BaseResponseCode.ROLE_PERMISSION_RELATION); + childs.forEach(item->{ + sysPermissionMapper.deleteById(item.getId()); + }); + } + sysPermissionMapper.deleteById(permissionId); + //删除和角色关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getPermissionId, permissionId)); + + if (!CollectionUtils.isEmpty(userIds)) { + //刷新权限 + userIds.parallelStream().forEach(httpSessionService::refreshUerId); + } + + } + + @Override + public void updatePermission(SysPermission vo) { + sysPermissionMapper.updateById(vo); + httpSessionService.refreshPermission(vo.getId()); + } + + /** + * 获取所有菜单权限 + */ + @Override + public List selectAll() { + List result = sysPermissionMapper.selectList(Wrappers.lambdaQuery().orderByAsc(SysPermission::getOrderNum)); + if (!CollectionUtils.isEmpty(result)) { + for (SysPermission sysPermission : result) { + SysPermission parent = null; + for (SysPermission sysPermission2 : result) { + if(sysPermission2.getId().equalsIgnoreCase(sysPermission.getPid())) { + parent = sysPermission2; + } + } + //SysPermission parent = sysPermissionMapper.selectById(sysPermission.getPid()); + if (parent != null) { + sysPermission.setPidName(parent.getName()); + } + } + } + return result; + } + + /** + * 获取权限标识 + */ + @Override + public Set getPermissionsByUserId(String userId) { + + List list = getPermission(userId); + Set permissions = new HashSet<>(); + if (CollectionUtils.isEmpty(list)) { + return null; + } + for (SysPermission sysPermission : list) { + if (!StringUtils.isEmpty(sysPermission.getPerms())) { + permissions.add(sysPermission.getPerms()); + } + + } + return permissions; + } + + /** + * 以树型的形式把用户拥有的菜单权限返回给客户端 + */ + @Override + public List permissionTreeList(String userId) { + List list = getPermission(userId); + return getTree(list, true); + } + + /** + * 递归获取菜单树 + */ + private List getTree(List all, boolean type) { + + List list = new ArrayList<>(); + if (CollectionUtils.isEmpty(all)) { + return list; + } + for (SysPermission sysPermission : all) { + if ("0".equals(sysPermission.getPid())) { + PermissionRespNode permissionRespNode = new PermissionRespNode(); + BeanUtils.copyProperties(sysPermission, permissionRespNode); + permissionRespNode.setTitle(sysPermission.getName()); + permissionRespNode.setValue(sysPermission.getUrl()); + + if (type) { + permissionRespNode.setChildren(getChildExcBtn(sysPermission.getId(), all)); + permissionRespNode.setChild(getChildExcBtn(sysPermission.getId(), all)); + } else { + permissionRespNode.setChildren(getChildAll(sysPermission.getId(), all)); + permissionRespNode.setChild(getChildAll(sysPermission.getId(), all)); + } + list.add(permissionRespNode); + } + } + return list; + } + + /** + * 递归遍历所有 + */ + private List getChildAll(String id, List all) { + + List list = new ArrayList<>(); + for (SysPermission sysPermission : all) { + if (sysPermission.getPid().equals(id)) { + PermissionRespNode permissionRespNode = new PermissionRespNode(); + BeanUtils.copyProperties(sysPermission, permissionRespNode); + permissionRespNode.setTitle(sysPermission.getName()); + permissionRespNode.setValue(sysPermission.getUrl()); + permissionRespNode.setChildren(getChildAll(sysPermission.getId(), all)); + permissionRespNode.setChild(getChildAll(sysPermission.getId(), all)); + list.add(permissionRespNode); + } + } + return list; + } + + /** + * 只递归获取目录和菜单 + */ + private List getChildExcBtn(String id, List all) { + + List list = new ArrayList<>(); + for (SysPermission sysPermission : all) { + if (sysPermission.getPid().equals(id) && sysPermission.getType() != 3) { + PermissionRespNode permissionRespNode = new PermissionRespNode(); + BeanUtils.copyProperties(sysPermission, permissionRespNode); + permissionRespNode.setTitle(sysPermission.getName()); + permissionRespNode.setValue(sysPermission.getUrl()); + permissionRespNode.setChildren(getChildExcBtn(sysPermission.getId(), all)); + permissionRespNode.setChild(getChildExcBtn(sysPermission.getId(), all)); + list.add(permissionRespNode); + } + } + return list; + } + + /** + * 获取所有菜单权限按钮 + */ + @Override + public List selectAllByTree() { + + List list = selectAll(); + return getTree(list, false); + } + + /** + * 获取所有的目录菜单树排除按钮 + * 因为不管是新增或者修改 + * 选择所属菜单目录的时候 + * 都不可能选择到按钮 + * 而且编辑的时候 所属目录不能 + * 选择自己和它的子类 + */ + @Override + public List selectAllMenuByTree(String permissionId) { + + List list = selectAll(); + if (!CollectionUtils.isEmpty(list) && !StringUtils.isEmpty(permissionId)) { + for (SysPermission sysPermission : list) { + if (sysPermission.getId().equals(permissionId)) { + list.remove(sysPermission); + break; + } + } + } + List result = new ArrayList<>(); + //新增顶级目录是为了方便添加一级目录 + PermissionRespNode respNode = new PermissionRespNode(); + respNode.setId("0"); + respNode.setTitle("默认顶级菜单"); + respNode.setSpread(true); + respNode.setChildren(getTree(list, true)); + respNode.setChild(getTree(list, true)); + result.add(respNode); + return result; + } + + @Override + public List getUserIdsById(String id) { + //根据权限id,获取所有角色id + //根据权限id,获取所有角色id + List roleIds = rolePermissionService.listObjs(Wrappers.lambdaQuery().select(SysRolePermission::getRoleId).eq(SysRolePermission::getPermissionId, id)); + if (!CollectionUtils.isEmpty(roleIds)) { + //根据角色id, 获取关联用户 + return userRoleService.listObjs(Wrappers.lambdaQuery().select(SysUserRole::getUserId).in(SysUserRole::getRoleId, roleIds)); + } + return null; + } + + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/RolePermissionServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/RolePermissionServiceImpl.java new file mode 100644 index 000000000..f27dd5d9c --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/RolePermissionServiceImpl.java @@ -0,0 +1,37 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.system.entity.SysRolePermission; +import com.jun.plugin.system.mapper.SysRolePermissionMapper; +import com.jun.plugin.system.service.RolePermissionService; +import com.jun.plugin.system.vo.req.RolePermissionOperationReqVO; + +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 角色权限关联 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +public class RolePermissionServiceImpl extends ServiceImpl implements RolePermissionService { + @Override + public void addRolePermission(RolePermissionOperationReqVO vo) { + List list = new ArrayList<>(); + for (String permissionId : vo.getPermissionIds()) { + SysRolePermission sysRolePermission = new SysRolePermission(); + sysRolePermission.setPermissionId(permissionId); + sysRolePermission.setRoleId(vo.getRoleId()); + list.add(sysRolePermission); + } + this.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getRoleId, vo.getRoleId())); + this.saveBatch(list); + } + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/RoleServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/RoleServiceImpl.java new file mode 100644 index 000000000..f7ed0bd6a --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/RoleServiceImpl.java @@ -0,0 +1,170 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.system.entity.SysRole; +import com.jun.plugin.system.entity.SysRoleDeptEntity; +import com.jun.plugin.system.entity.SysRolePermission; +import com.jun.plugin.system.entity.SysUserRole; +import com.jun.plugin.system.mapper.SysRoleMapper; +import com.jun.plugin.system.service.*; +import com.jun.plugin.system.vo.req.RolePermissionOperationReqVO; +import com.jun.plugin.system.vo.resp.DeptRespNodeVO; +import com.jun.plugin.system.vo.resp.PermissionRespNode; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 角色 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +@Slf4j +public class RoleServiceImpl extends ServiceImpl implements RoleService { + @Resource + private SysRoleMapper sysRoleMapper; + @Resource + private UserRoleService userRoleService; + @Resource + private RolePermissionService rolePermissionService; + @Resource + private PermissionService permissionService; + @Resource + private HttpSessionService httpSessionService; + @Resource + private DeptService deptService; + @Resource + private SysRoleDeptService sysRoleDeptService; + + @Transactional(rollbackFor = Exception.class) + @Override + public void addRole(SysRole vo) { + + vo.setStatus(1); + sysRoleMapper.insert(vo); + if (!CollectionUtils.isEmpty(vo.getPermissions())) { + RolePermissionOperationReqVO reqVO = new RolePermissionOperationReqVO(); + reqVO.setRoleId(vo.getId()); + reqVO.setPermissionIds(vo.getPermissions()); + rolePermissionService.addRolePermission(reqVO); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void updateRole(SysRole vo) { + SysRole sysRole = sysRoleMapper.selectById(vo.getId()); + if (null == sysRole) { + log.error("传入 的 id:{}不合法", vo.getId()); + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + sysRoleMapper.updateById(vo); + //删除角色权限关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getRoleId, sysRole.getId())); + if (!CollectionUtils.isEmpty(vo.getPermissions())) { + RolePermissionOperationReqVO reqVO = new RolePermissionOperationReqVO(); + reqVO.setRoleId(sysRole.getId()); + reqVO.setPermissionIds(vo.getPermissions()); + rolePermissionService.addRolePermission(reqVO); + // 刷新权限 + httpSessionService.refreshRolePermission(sysRole.getId()); + } + } + + @Override + public SysRole detailInfo(String id) { + SysRole sysRole = sysRoleMapper.selectById(id); + if (sysRole == null) { + log.error("传入 的 id:{}不合法", id); + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + List permissionRespNodes = permissionService.selectAllByTree(); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().select(SysRolePermission::getPermissionId).eq(SysRolePermission::getRoleId, sysRole.getId()); + Set checkList = + new HashSet<>(rolePermissionService.listObjs(queryWrapper)); + setChecked(permissionRespNodes, checkList); + sysRole.setPermissionRespNodes(permissionRespNodes); + + LambdaQueryWrapper queryWrapperDept = Wrappers.lambdaQuery().select(SysRoleDeptEntity::getDeptId).eq(SysRoleDeptEntity::getRoleId, sysRole.getId()); + List deptRespNodes = deptService.deptTreeList(null, true); + Set checkDeptList = + new HashSet<>(sysRoleDeptService.listObjs(queryWrapperDept)); + setCheckedDept(deptRespNodes, checkDeptList); + sysRole.setDeptRespNodes(deptRespNodes); + return sysRole; + } + + private void setCheckedDept(List deptRespNodes, Set checkDeptList) { + for (DeptRespNodeVO node : deptRespNodes) { + if (checkDeptList.contains(node.getId())) { + node.setChecked(true); + } + setCheckedDept((List) node.getChildren(), checkDeptList); + } + } + + + private void setChecked(List list, Set checkList) { + for (PermissionRespNode node : list) { + if (checkList.contains(node.getId()) + && CollectionUtils.isEmpty(node.getChildren())) { + node.setChecked(true); + } + setChecked((List) node.getChildren(), checkList); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deletedRole(String id) { + //获取关联userId + List userIds = userRoleService.getUserIdsByRoleId(id); + //删除角色 + sysRoleMapper.deleteById(id); + //删除角色权限关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getRoleId, id)); + //删除角色用户关联 + userRoleService.remove(Wrappers.lambdaQuery().eq(SysUserRole::getRoleId, id)); + if (!CollectionUtils.isEmpty(userIds)) { + // 刷新权限 + userIds.parallelStream().forEach(httpSessionService::refreshUerId); + } + } + + @Override +// @Cacheable(cacheNames = "cache1m",key = "'RoleServiceImpl:getRoleInfoByUserId:'+#userId") + public List getRoleInfoByUserId(String userId) { + System.err.println("getRoleInfoByUserId="+userId); + List roleIds = userRoleService.getRoleIdsByUserId(userId); + if (CollectionUtils.isEmpty(roleIds)) { + return null; + } + return sysRoleMapper.selectBatchIds(roleIds); + } + + @Override + public List getRoleNames(String userId) { + List sysRoles = getRoleInfoByUserId(userId); + if (CollectionUtils.isEmpty(sysRoles)) { + return null; + } + return sysRoles.stream().map(SysRole::getName).collect(Collectors.toList()); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysContentServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysContentServiceImpl.java new file mode 100644 index 000000000..7130c1091 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysContentServiceImpl.java @@ -0,0 +1,21 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.system.entity.SysContentEntity; +import com.jun.plugin.system.mapper.SysContentMapper; +import com.jun.plugin.system.service.SysContentService; + +import org.springframework.stereotype.Service; + +/** + * 内容 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service("sysContentService") +public class SysContentServiceImpl extends ServiceImpl implements SysContentService { + + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysDictDetailServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysDictDetailServiceImpl.java new file mode 100644 index 000000000..52f151f49 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysDictDetailServiceImpl.java @@ -0,0 +1,52 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.system.entity.SysDictDetailEntity; +import com.jun.plugin.system.entity.SysDictEntity; +import com.jun.plugin.system.mapper.SysDictDetailMapper; +import com.jun.plugin.system.mapper.SysDictMapper; +import com.jun.plugin.system.service.SysDictDetailService; + +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 数据字典 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service("sysDictDetailService") +public class SysDictDetailServiceImpl extends ServiceImpl implements SysDictDetailService { + @Resource + private SysDictDetailMapper sysDictDetailMapper; + @Resource + private SysDictMapper sysDictMapper; + + + @Override + public IPage listByPage(Page page, String dictId) { + + SysDictEntity sysDictEntity = sysDictMapper.selectById(dictId); + if (sysDictEntity == null) { + throw new BusinessException("获取字典数据失败!"); + } + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(SysDictDetailEntity::getDictId, dictId); + wrapper.orderByAsc(SysDictDetailEntity::getSort); + IPage result = sysDictDetailMapper.selectPage(page, wrapper); + if (!CollectionUtils.isEmpty(result.getRecords())) { + result.getRecords().parallelStream().forEach(entity -> entity.setDictName(sysDictEntity.getName())); + } + return result; + } +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysDictServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysDictServiceImpl.java new file mode 100644 index 000000000..5c125f293 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysDictServiceImpl.java @@ -0,0 +1,80 @@ +package com.jun.plugin.system.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.system.entity.SysDictDetailEntity; +import com.jun.plugin.system.entity.SysDictEntity; +import com.jun.plugin.system.mapper.SysDictDetailMapper; +import com.jun.plugin.system.mapper.SysDictMapper; +import com.jun.plugin.system.service.SysDictService; + +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; + +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service("sysDictService") +public class SysDictServiceImpl extends ServiceImpl implements SysDictService { + + @Resource + private SysDictDetailMapper sysDictDetailMapper; + + /** + * 根据字典类型查询字典数据信息 + * + * @param name 字典名称 + * @return 参数键值 + **/ + @Override + public JSONArray getType(String name) { + if (StringUtils.isEmpty(name)) { + return new JSONArray(); + } + //根据名称获取字典 + SysDictEntity dict = this.getOne(Wrappers.lambdaQuery().eq(SysDictEntity::getName, name)); + if (dict == null || dict.getId() == null) { + return new JSONArray(); + } + //获取明细 + List list = sysDictDetailMapper.selectList(Wrappers.lambdaQuery().eq(SysDictDetailEntity::getDictId, dict.getId()).orderByAsc(SysDictDetailEntity::getSort)); + return JSONArray.parseArray(JSON.toJSONString(list)); + } + + /** + * 根据字典类型查询字典数据信息 + * + * @param name 字典名称 + * @return 参数键值 + **/ + @Override + public JSONArray getType2(String name) { + if (StringUtils.isEmpty(name)) { + return new JSONArray(); + } + //根据名称获取字典 + List dicts = this.list(Wrappers.lambdaQuery().like(SysDictEntity::getName, name)); + if (dicts == null || dicts.size() < 1 ) { + return new JSONArray(); + } + List str = new ArrayList(); + for(SysDictEntity obj : dicts) { + str.add(obj.getId()); + } + //获取明细 + List list = sysDictDetailMapper.selectList(Wrappers.lambdaQuery().in(SysDictDetailEntity::getDictId, str)); + return JSONArray.parseArray(JSON.toJSONString(list)); + } + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysRoleDeptServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysRoleDeptServiceImpl.java new file mode 100644 index 000000000..5460d68bb --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/SysRoleDeptServiceImpl.java @@ -0,0 +1,15 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.system.entity.SysRoleDeptEntity; +import com.jun.plugin.system.mapper.SysRoleDeptMapper; +import com.jun.plugin.system.service.SysRoleDeptService; + +import org.springframework.stereotype.Service; + + +@Service("sysRoleDeptService") +public class SysRoleDeptServiceImpl extends ServiceImpl implements SysRoleDeptService { + + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/UserRoleServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/UserRoleServiceImpl.java new file mode 100644 index 000000000..52d657bd6 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,59 @@ +package com.jun.plugin.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.system.entity.SysUserRole; +import com.jun.plugin.system.mapper.SysUserRoleMapper; +import com.jun.plugin.system.service.UserRoleService; +import com.jun.plugin.system.vo.req.UserRoleOperationReqVO; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 用户角色 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + @Resource + private SysUserRoleMapper sysUserRoleMapper; + + @Override + public List getRoleIdsByUserId(String userId) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().select(SysUserRole::getRoleId).eq(SysUserRole::getUserId, userId); + return sysUserRoleMapper.selectObjs(queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void addUserRoleInfo(UserRoleOperationReqVO vo) { + if (CollectionUtils.isEmpty(vo.getRoleIds())) { + return; + } + List list = new ArrayList<>(); + for (String roleId : vo.getRoleIds()) { + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setUserId(vo.getUserId()); + sysUserRole.setRoleId(roleId); + list.add(sysUserRole); + } + sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, vo.getUserId())); + //批量插入 + this.saveBatch(list); + } + + @Override + public List getUserIdsByRoleId(String roleId) { + return sysUserRoleMapper.selectObjs(Wrappers.lambdaQuery().select(SysUserRole::getUserId).eq(SysUserRole::getRoleId, roleId)); + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/UserServiceImpl.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/UserServiceImpl.java new file mode 100644 index 000000000..230922d70 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/service/impl/UserServiceImpl.java @@ -0,0 +1,398 @@ +package com.jun.plugin.system.service.impl; + +import cn.hutool.jwt.JWTUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.common.exception.code.BaseResponseCode; +import com.jun.plugin.common.service.HttpSessionService; +import com.jun.plugin.common.util.JUNUtil; +import com.jun.plugin.common.util.PasswordUtils; +import com.jun.plugin.system.entity.SysDept; +import com.jun.plugin.system.entity.SysRole; +import com.jun.plugin.system.entity.SysUser; +import com.jun.plugin.system.mapper.SysDeptMapper; +import com.jun.plugin.system.mapper.SysUserMapper; +import com.jun.plugin.system.service.*; +import com.jun.plugin.system.vo.req.UserRoleOperationReqVO; +import com.jun.plugin.system.vo.resp.LoginRespVO; +import com.jun.plugin.system.vo.resp.UserOwnRoleRespVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 用户 服务类 + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Service +@Slf4j +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Resource + private SysUserMapper sysUserMapper; + @Resource + private RoleService roleService; + @Resource + private PermissionService permissionService; + @Resource + private UserRoleService userRoleService; + @Resource + private SysDeptMapper sysDeptMapper; + @Resource + private HttpSessionService httpSessionService; + + @Value("${spring.redis.allowMultipleLogin}") + private Boolean allowMultipleLogin; + @Value("${spring.profiles.active}") + private String env; + + @Override + public void register(SysUser sysUser) { + SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, sysUser.getUsername())); + if (sysUserOne != null) { + throw new BusinessException("用户名已存在!"); + } + sysUser.setSalt(PasswordUtils.getSalt()); + String encode = PasswordUtils.encode(sysUser.getPassword(), sysUser.getSalt()); + sysUser.setPassword(encode); + sysUserMapper.insert(sysUser); + } + + @Override + public LoginRespVO login(SysUser vo) { + SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, vo.getUsername())); + if (null == sysUser) { + throw new BusinessException(BaseResponseCode.NOT_ACCOUNT); + } + if (sysUser.getStatus() == 2) { + throw new BusinessException(BaseResponseCode.USER_LOCK); + } + if (!PasswordUtils.matches(sysUser.getSalt(), vo.getPassword(), sysUser.getPassword())) { + throw new BusinessException(BaseResponseCode.PASSWORD_ERROR); + } + LoginRespVO respVO = new LoginRespVO(); + BeanUtils.copyProperties(sysUser, respVO); + + //是否删除之前token, 此处控制是否支持多登陆端; + // true:允许多处登陆; false:只能单处登陆,顶掉之前登陆 + if (!allowMultipleLogin) { + httpSessionService.abortUserById(sysUser.getId()); + } + if (StringUtils.isNotBlank(sysUser.getDeptId())) { + SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId()); + if (sysDept != null) { + sysUser.setDeptNo(sysDept.getDeptNo()); + sysUser.setDeptName(sysDept.getName()); + respVO.setDeptNO(sysDept.getDeptNo()); + respVO.setDeptID(sysUser.getDeptId()); + respVO.setDeptName(sysDept.getName()); + } + } + List roles = roleService.getRoleNames(sysUser.getId()); + respVO.setIsAdmin("0"); + if(roles.contains("管理员")||roles.contains("超级管理员")) { + respVO.setIsAdmin("1"); + } + String token = JWTUtil.createToken(null,sysUser.getUsername().getBytes()); +// String token = JwtUtil.sign(sysUser.getUsername()); + String accesstoken = httpSessionService.createTokenAndUser(sysUser,roles , permissionService.getPermissionsByUserId(sysUser.getId()),token); + respVO.setAccessToken(accesstoken); + respVO.setAuthorization(token); + return respVO; + } + + @Override + public void updateUserInfo(SysUser vo) { + + + SysUser sysUser = sysUserMapper.selectById(vo.getId()); + if (null == sysUser) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + + //如果用户名变更 + if (!sysUser.getUsername().equals(vo.getUsername())) { + SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, vo.getUsername())); + if (sysUserOne != null) { + throw new BusinessException("用户名已存在!"); + } + } + + //如果用户名、密码、状态 变更,删除redis中用户绑定的角色跟权限 + if (!sysUser.getUsername().equals(vo.getUsername()) + || (!StringUtils.isEmpty(vo.getPassword()) + && !sysUser.getPassword().equals(PasswordUtils.encode(vo.getPassword(), sysUser.getSalt()))) + || !sysUser.getStatus().equals(vo.getStatus())) { + httpSessionService.abortUserById(vo.getId()); + } + + if (!StringUtils.isEmpty(vo.getPassword())) { + String newPassword = PasswordUtils.encode(vo.getPassword(), sysUser.getSalt()); + vo.setPassword(newPassword); + } else { + vo.setPassword(null); + } + vo.setUpdateId(httpSessionService.getCurrentUserId()); + sysUserMapper.updateById(vo); + + } + + @Override + public void updateUserInfoMy(SysUser vo) { + + + SysUser user = sysUserMapper.selectById(httpSessionService.getCurrentUserId()); + if (null == user) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + if (!StringUtils.isEmpty(vo.getPassword())) { + String newPassword = PasswordUtils.encode(vo.getPassword(), user.getSalt()); + vo.setPassword(newPassword); +// user.setPassword(newPassword); + } else { + vo.setPassword(null); +// user.setPassword(null); + } + vo.setUpdateId(httpSessionService.getCurrentUserId()); + vo.setPassword(null); + user.setUpdateId(httpSessionService.getCurrentUserId()); + BeanUtils.copyProperties(vo,user, JUNUtil.getNullPropertyNames(vo)); + sysUserMapper.updateById(user); + + } + + + + @Override + public IPage pageInfo(SysUser vo) { + Page page = new Page(vo.getPage(), vo.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + if (!StringUtils.isEmpty(vo.getUsername())) { + queryWrapper.like(SysUser::getUsername, vo.getUsername()); + } + if (!StringUtils.isEmpty(vo.getStartTime())) { + queryWrapper.gt(SysUser::getCreateTime, vo.getStartTime()); + } + if (!StringUtils.isEmpty(vo.getEndTime())) { + queryWrapper.lt(SysUser::getCreateTime, vo.getEndTime()); + } + if (!StringUtils.isEmpty(vo.getNickName())) { + queryWrapper.like(SysUser::getNickName, vo.getNickName()); + } + if (!StringUtils.isEmpty(vo.getRealName())) { + queryWrapper.or(); + queryWrapper.like(SysUser::getRealName, vo.getRealName()); + } + if (null != vo.getStatus()) { + queryWrapper.eq(SysUser::getStatus, vo.getStatus()); + } + if (!StringUtils.isEmpty(vo.getDeptNo())) { + LambdaQueryWrapper queryWrapperDept = Wrappers.lambdaQuery(); + queryWrapperDept.select(SysDept::getId).like(SysDept::getRelationCode, vo.getDeptNo()); + List list = sysDeptMapper.selectObjs(queryWrapperDept); + queryWrapper.in(SysUser::getDeptId, list); + } + //数据权限示例, 需手动添加此条件 begin + if (!CollectionUtils.isEmpty(vo.getCreateIds())) { + queryWrapper.in(SysUser::getId, vo.getCreateIds()); + } + queryWrapper.orderByAsc(SysUser::getId); + IPage iPage = sysUserMapper.selectPage(page, queryWrapper); + LambdaQueryWrapper queryWrapper2 = Wrappers.lambdaQuery(); + List depts = sysDeptMapper.selectList(queryWrapper2); + if (!CollectionUtils.isEmpty(iPage.getRecords())) { + for (SysUser sysUser : iPage.getRecords()) { + //SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId()); +// if (sysDept != null) { +// sysUser.setDeptName(sysDept.getName()); +// } + depts.forEach(item->{ + if(item.getId().equalsIgnoreCase(sysUser.getDeptId())) { + SysDept sysDept = item; + sysUser.setDeptName(sysDept.getName()); + } +// if(item.getManagerName().equalsIgnoreCase(sysUser.getRealName())) { +// SysDept sysDept = item; +// sysUser.setDeptName(sysDept.getName()); +// } + }); + } + } + return iPage; + } + + @Override + public IPage pageInfoApprover(SysUser vo) { + Page page = new Page(vo.getPage(), vo.getLimit()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); +// if (!StringUtils.isEmpty(vo.getRealName())) { +// if(!queryWrapper.isEmptyOfWhere()) { +// queryWrapper.or(); +// } +// queryWrapper.like(SysUser::getRealName, vo.getRealName()); +// } + if (!StringUtils.isEmpty(vo.getStartTime())) { + queryWrapper.gt(SysUser::getCreateTime, vo.getStartTime()); + } + if (!StringUtils.isEmpty(vo.getEndTime())) { + queryWrapper.lt(SysUser::getCreateTime, vo.getEndTime()); + } + if (!StringUtils.isEmpty(vo.getNickName())) { + if(!queryWrapper.isEmptyOfWhere()) { + queryWrapper.or(); + } + queryWrapper.like(SysUser::getNickName, vo.getNickName()); + } + if (!StringUtils.isEmpty(vo.getUsername())) { + queryWrapper.like(SysUser::getUsername, vo.getUsername()); + } + if (!StringUtils.isEmpty(vo.getRealName())) { + if(!queryWrapper.isEmptyOfWhere()) { + queryWrapper.or(); + } + queryWrapper.like(SysUser::getRealName, vo.getRealName()); + } + if (null != vo.getStatus()) { + queryWrapper.eq(SysUser::getStatus, vo.getStatus()); + } + if (!StringUtils.isEmpty(vo.getDeptNo())) { + LambdaQueryWrapper queryWrapperDept = Wrappers.lambdaQuery(); + queryWrapperDept.select(SysDept::getId).like(SysDept::getRelationCode, vo.getDeptNo()); + List list = sysDeptMapper.selectObjs(queryWrapperDept); + queryWrapper.in(SysUser::getDeptId, list); + } + //查询部门数据 + LambdaQueryWrapper queryWrapper2 = Wrappers.lambdaQuery(); + List deptManager = sysDeptMapper.selectList(queryWrapper2); + for(SysDept item : deptManager) { + if (!StringUtils.isEmpty(item.getManagerName())) { + if (StringUtils.isEmpty(vo.getRealName())||StringUtils.isEmpty(vo.getUsername())) { + queryWrapper.or(); + queryWrapper.in(SysUser::getRealName, item.getManagerName()); + } + } + } + + //查询用户数据 + queryWrapper.orderByAsc(SysUser::getId); + IPage iPage = sysUserMapper.selectPage(page, queryWrapper); + + //设置用户部门 + if (!CollectionUtils.isEmpty(iPage.getRecords())) { + for (SysUser sysUser : iPage.getRecords()) { + for(SysDept item : deptManager) { + if(item.getId().equalsIgnoreCase(sysUser.getDeptId())) { + SysDept sysDept = item; + sysUser.setDeptName(sysDept.getName()); + } + } + } + } + return iPage; + } + + + @Override + public IPage pageInfoApproverByRole(SysUser vo) { + Page page = new Page(vo.getPage(), vo.getLimit()); + String processName = vo.getProcessName(); + String taskName = vo.getTaskName(); + String roleName = ""; + if(!StringUtils.isEmpty(taskName)) { + if(taskName.contains("部门经理")) { + roleName = "部门经理"; + }else if(taskName.contains("总经理")) { + roleName = "总经理"; + }else if(taskName.contains("董事长")) { + roleName = "董事长"; + } + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + if (!StringUtils.isEmpty(vo.getUsername())) { + queryWrapper.like(SysUser::getUsername, vo.getUsername()); + } + if (!StringUtils.isEmpty(vo.getRealName())) { + if(!queryWrapper.isEmptyOfWhere()) { + queryWrapper.or(); + } + queryWrapper.like(SysUser::getRealName, vo.getRealName()); + } + queryWrapper.apply(" id in ( " + + "SELECT u.id from sys_user u " + + "INNER JOIN sys_user_role ur on u.id = ur.user_id " + + "INNER JOIN sys_role r on ur.role_id = r.id " + + "where r.id in ( " + + "SELECT r1.id from sys_role r1 where r.name like '%"+roleName+"%' ) " + + ") ", null); + IPage iPage = sysUserMapper.selectPage(page, queryWrapper); + return iPage; + } + + @Override + public void addUser(SysUser vo) { + + SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, vo.getUsername())); + if (sysUserOne != null) { + throw new BusinessException("用户已存在,请勿重复添加!"); + } + vo.setSalt(PasswordUtils.getSalt()); + String encode = PasswordUtils.encode(vo.getPassword(), vo.getSalt()); + vo.setPassword(encode); + vo.setStatus(1); + vo.setCreateWhere(1); + sysUserMapper.insert(vo); + if (!CollectionUtils.isEmpty(vo.getRoleIds())) { + UserRoleOperationReqVO reqVO = new UserRoleOperationReqVO(); + reqVO.setUserId(vo.getId()); + reqVO.setRoleIds(vo.getRoleIds()); + userRoleService.addUserRoleInfo(reqVO); + } + } + + @Override + public void updatePwd(SysUser vo) { + + SysUser sysUser = sysUserMapper.selectById(vo.getId()); + if (sysUser == null) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + if ("test".equals(env) && "guest".equals(sysUser.getUsername())) { + throw new BusinessException("演示环境禁止修改演示账号密码"); + } + + if (!PasswordUtils.matches(sysUser.getSalt(), vo.getOldPwd(), sysUser.getPassword())) { + throw new BusinessException(BaseResponseCode.OLD_PASSWORD_ERROR); + } + if (sysUser.getPassword().equals(PasswordUtils.encode(vo.getNewPwd(), sysUser.getSalt()))) { + throw new BusinessException("新密码不能与旧密码相同"); + } + sysUser.setPassword(PasswordUtils.encode(vo.getNewPwd(), sysUser.getSalt())); + sysUserMapper.updateById(sysUser); + //退出用户 + httpSessionService.abortAllUserByToken(); + + } + + @Override + public UserOwnRoleRespVO getUserOwnRole(String userId) { + List roleIdsByUserId = userRoleService.getRoleIdsByUserId(userId); + List list = roleService.list(); + UserOwnRoleRespVO vo = new UserOwnRoleRespVO(); + vo.setAllRole(list); + vo.setOwnRoles(roleIdsByUserId); + return vo; + } +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/req/RolePermissionOperationReqVO.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/req/RolePermissionOperationReqVO.java new file mode 100644 index 000000000..628eeea9d --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/req/RolePermissionOperationReqVO.java @@ -0,0 +1,25 @@ +package com.jun.plugin.system.vo.req; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * RolePermissionOperationReqVO + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class RolePermissionOperationReqVO { + @ApiModelProperty(value = "角色id") + @NotBlank(message = "角色id不能为空") + private String roleId; + @ApiModelProperty(value = "菜单权限集合") + @NotEmpty(message = "菜单权限集合不能为空") + private List permissionIds; +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/req/UserRoleOperationReqVO.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/req/UserRoleOperationReqVO.java new file mode 100644 index 000000000..582e56fd0 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/req/UserRoleOperationReqVO.java @@ -0,0 +1,25 @@ +package com.jun.plugin.system.vo.req; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * UserRoleOperationReqVO + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserRoleOperationReqVO { + @ApiModelProperty(value = "用户id") + @NotBlank(message = "用户id不能为空") + private String userId; + @ApiModelProperty(value = "角色id集合") + @NotEmpty(message = "角色id集合不能为空") + private List roleIds; +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/App.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/App.java new file mode 100644 index 000000000..65d5d4b7f --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/App.java @@ -0,0 +1,10 @@ +package com.jun.plugin.system.vo.resp; + +import lombok.Data; + +@Data +public class App { + private Boolean active; + private String code; + private String name; +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/DeptRespNodeVO.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/DeptRespNodeVO.java new file mode 100644 index 000000000..d15ebfa54 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/DeptRespNodeVO.java @@ -0,0 +1,53 @@ +package com.jun.plugin.system.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * DeptRespNodeVO + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class DeptRespNodeVO { + @ApiModelProperty(value = "组织id") + private String id; + + @ApiModelProperty(value = "组织编码") + private String deptNo; + + @ApiModelProperty(value = "组织名称") + private String title; + + @ApiModelProperty(value = "组织名称") + private String label; + + @ApiModelProperty(value = "组织父级id") + private String pid; + + @ApiModelProperty(value = "组织状态") + private Integer status; + + @ApiModelProperty(value = "组织关系id") + private String relationCode; + + @ApiModelProperty(value = "是否展开 默认不展开(false)") + private boolean spread = true; + + @ApiModelProperty(value = "是否选中") + private boolean checked = false; + + private boolean disabled = false; + + @ApiModelProperty(value = "子集") + private List children; + + public String getLabel() { + return title; + } + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/HomeRespVO.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/HomeRespVO.java new file mode 100644 index 000000000..a5c446401 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/HomeRespVO.java @@ -0,0 +1,22 @@ +package com.jun.plugin.system.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * HomeRespVO + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class HomeRespVO { + @ApiModelProperty(value = "用户信息") + private UserInfoRespVO userInfo; + @ApiModelProperty(value = "目录菜单") + private List menus; + +} \ No newline at end of file diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/LoginRespVO.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/LoginRespVO.java new file mode 100644 index 000000000..0b3de091e --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/LoginRespVO.java @@ -0,0 +1,50 @@ +package com.jun.plugin.system.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +import com.baomidou.mybatisplus.annotation.TableField; + +/** + * LoginRespVO + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class LoginRespVO { + @ApiModelProperty(value = "token") + private String accessToken; + @ApiModelProperty(value = "用户名") + private String username; + @ApiModelProperty(value = "用户id") + private String id; + @ApiModelProperty(value = "电话") + private String phone; + @ApiModelProperty(value = "用户所拥有的菜单权限(前后端分离返回给前端控制菜单和按钮的显示和隐藏)") + private List list; + + @ApiModelProperty(value = "部门ID") + private String deptID; + + @ApiModelProperty(value = "部门NO") + private String deptNO; + + @ApiModelProperty(value = "部门名称") + private String deptName; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "用户昵称") + private String nickName; + + @ApiModelProperty(value = "是否管理员") + private String isAdmin; + + @ApiModelProperty(value = "JWTToken") + private String authorization; +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/Menu.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/Menu.java new file mode 100644 index 000000000..969f6e7de --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/Menu.java @@ -0,0 +1,12 @@ +package com.jun.plugin.system.vo.resp; + +import lombok.Data; + +import java.util.List; + +@Data +public class Menu { + + private String code; + private List value; +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/PermissionRespNode.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/PermissionRespNode.java new file mode 100644 index 000000000..03d8e2247 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/PermissionRespNode.java @@ -0,0 +1,67 @@ +package com.jun.plugin.system.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * PermissionRespNode + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class PermissionRespNode { + @ApiModelProperty(value = "id") + private String id; + @ApiModelProperty(value = "菜单权限名称") + private String title; + + @ApiModelProperty(value = "菜单权限标识,shiro 适配restful") + private String perms; + + @ApiModelProperty(value = "接口地址") + private String url; + + @ApiModelProperty(value = "接口地址") + private String href; + + @ApiModelProperty(value = "icon") + private String icon; + + private String target; + + @ApiModelProperty(value = "父级id") + private String pid; + + @ApiModelProperty(value = "父级名称") + private String pidName; + + @ApiModelProperty(value = "菜单权限类型(1:目录;2:菜单;3:按钮)") + private Integer type; + + @ApiModelProperty(value = "排序码") + private Integer orderNum; + + @ApiModelProperty(value = "是否展开 默认不展开(false)") + private boolean spread = true; + + @ApiModelProperty(value = "是否选中 默认false") + private boolean checked; + private List children; + private List child; + + +// private List children; +// private String icon; +// private String id; + private String parentId; +// private String pid; +// private String title; + private String value; + private String weight; + + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/UserInfoRespVO.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/UserInfoRespVO.java new file mode 100644 index 000000000..a18a42592 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/UserInfoRespVO.java @@ -0,0 +1,30 @@ +package com.jun.plugin.system.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * UserInfoRespVO + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserInfoRespVO { + @ApiModelProperty(value = "用户id") + private String id; + @ApiModelProperty(value = "账号") + private String username; + @ApiModelProperty(value = "手机号") + private String phone; + @ApiModelProperty(value = "昵称") + private String nickName; + @ApiModelProperty(value = "真实姓名") + private String realName; + @ApiModelProperty(value = "所属机构id") + private String deptId; + @ApiModelProperty(value = "所属机构名称") + private String deptName; + +} diff --git a/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/UserOwnRoleRespVO.java b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/UserOwnRoleRespVO.java new file mode 100644 index 000000000..408cdf663 --- /dev/null +++ b/jun_api_online/jun_system/src/main/java/com/jun/plugin/system/vo/resp/UserOwnRoleRespVO.java @@ -0,0 +1,23 @@ +package com.jun.plugin.system.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +import com.jun.plugin.system.entity.SysRole; + +/** + * UserOwnRoleRespVO + * + * @author wujun + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserOwnRoleRespVO { + @ApiModelProperty("所有角色集合") + private List allRole; + @ApiModelProperty(value = "用户所拥有角色集合") + private List ownRoles; +} diff --git a/jun_api_online/jun_system/src/main/resources/META-INF/spring.factories b/jun_api_online/jun_system/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..2cfb789d7 --- /dev/null +++ b/jun_api_online/jun_system/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.jun.plugin.system.config.SystemAutoConfig \ No newline at end of file diff --git a/jun_api_online/jun_system/src/test/java/Test666.java b/jun_api_online/jun_system/src/test/java/Test666.java new file mode 100644 index 000000000..65fdec995 --- /dev/null +++ b/jun_api_online/jun_system/src/test/java/Test666.java @@ -0,0 +1,78 @@ +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.db.sql.SqlExecutor; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + + +public class Test666 { + + + public static void main(String[] args) { + List filenames = FileUtil.readLines(new File("D:\\Documents\\Desktop\\MP4NEW.txt"),"UTF-8"); + System.out.println(filenames.size()); + Set sets = Sets.newHashSet(); + filenames.forEach(i->{sets.add(i);}); + System.out.println("不重复的mp4链接:"+sets.size()); + + String fileName = "new666"; + + List urls = FileUtil.readLines(new File("D:\\Documents\\Desktop\\"+fileName+".txt"),"UTF-8"); + Set sets2 = Sets.newHashSet(); + Map map2 = new HashMap<>(); + urls.forEach(i->{ + map2.put(FileNameUtil.getName(i),i); + sets2.add(i); + }); + System.out.println("不重复的new链接1:"+sets2.size()); + System.out.println("不重复的new链接1:"+map2.keySet().size()); + + List urlsNew = Lists.newArrayList(); + List urlsNewMP4 = Lists.newArrayList(); + List urlsExists = Lists.newArrayList(); +// for(String url : sets2){ +// if(!sets.stream().anyMatch(i->{ +// //return url.endsWith(i); +// return FileNameUtil.getName(url).equalsIgnoreCase(i); +// // return url.substring(url.lastIndexOf("/"), url.length()).equalsIgnoreCase(i); +// })){ +// urlsNew.add(url); +// }else{ +// urlsExists.add(url); +// } +// } + + List difference = map2.keySet().stream() + .filter(element -> !sets.contains(element)) + .collect(Collectors.toList()); + map2.entrySet().forEach((k)->{ + if(difference.contains(k.getKey())){ + urlsNew.add(k.getValue()); + if(k.getValue().contains(".mp4")){ + urlsNewMP4.add(k.getValue()); + } + }else{ + urlsExists.add(k.getValue()); + } + }); + + System.out.println("重复的mp4链接1exitst:"+urlsExists.size()); + FileUtil.writeUtf8Lines(urlsExists,"D:\\Documents\\Desktop\\exists-"+ fileName +".txt"); + System.err.println("不重复的mp4链接1new:"+urlsNew.size()); + FileUtil.writeUtf8Lines(urlsNew,"D:\\Documents\\Desktop\\new-"+ fileName +".txt"); + System.err.println("不重复的mp4链接1new2:"+urlsNewMP4.size()); + FileUtil.writeUtf8Lines(urlsNewMP4,"D:\\Documents\\Desktop\\new-n-"+ fileName +".txt"); + +// String result = HttpUtil.post("https://gitlab.billjc.com/oauth/token?grant_type=password", "{\n" + +// " \"username\": \"wujun82921\",\n" + +// " \"password\": \"Abcde123456\"\n" + +// "}"); +// Console.log(result); + } + +} diff --git a/jun_api_online/pom.xml b/jun_api_online/pom.xml new file mode 100644 index 000000000..fe19f5721 --- /dev/null +++ b/jun_api_online/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + com.jun.plugin + jun_api_online + 1.0 + pom + + + UTF-8 + 1.8 + 1.8 + + + + jun_common + jun_system + jun_plugins + jun_api + jun_admin + jun_generator + jun_plugin + + + + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.jun.plugin + jun_common + 1.0 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + + + + + jdk-1.8 + + true + 1.8 + + + 1.8 + 1.8 + 1.8 + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/jun_api_online_groovy/.gitignore b/jun_api_online_groovy/.gitignore new file mode 100644 index 000000000..bda84a447 --- /dev/null +++ b/jun_api_online_groovy/.gitignore @@ -0,0 +1,51 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar diff --git a/jun_api_online_groovy/Dockerfile b/jun_api_online_groovy/Dockerfile new file mode 100644 index 000000000..7c8c4784d --- /dev/null +++ b/jun_api_online_groovy/Dockerfile @@ -0,0 +1,17 @@ +FROM openjdk:8-jre-slim-buster + +ARG DEBIAN_FRONTEND=noninteractive +ARG VERSION + +ENV DOCKER true + +ADD dist/manage-${VERSION}-bin.tar.gz /opt/ + +COPY docker/init_config.sh /opt/init_config.sh +COPY docker/startup.sh /opt/startup.sh + +WORKDIR /opt/manage-${VERSION} + +EXPOSE 8520 8523 8525 + +ENTRYPOINT bash /opt/startup.sh $0 \ No newline at end of file diff --git a/jun_api_online_groovy/README.md b/jun_api_online_groovy/README.md new file mode 100644 index 000000000..88e248834 --- /dev/null +++ b/jun_api_online_groovy/README.md @@ -0,0 +1,17 @@ +# spring-boot-groovy-demo + +#### 项目介绍 +使用了groovy + java 混合编写项目 +使用了groovy作为脚本来进行动态业务逻辑编写 + +#### 软件架构 +软件架构说明 + + +#### 使用说明 + +启动后访问9000端口 + +已经集成swagger + +http://localhost:9000/swagger-ui.html \ No newline at end of file diff --git a/jun_api_online_groovy/pom.xml b/jun_api_online_groovy/pom.xml new file mode 100644 index 000000000..7a3fa940a --- /dev/null +++ b/jun_api_online_groovy/pom.xml @@ -0,0 +1,312 @@ + + + 4.0.0 + + com.jun.plugin + jun_api_online_groovy + 1.0 + + + UTF-8 + UTF-8 + 1.8 + + 2.8.0 + 2.4.7 + 3.5.3.1 + 2.5.5 + 12.1.0.1-atlassian-hosted + 4.0 + 2.6 + 2.11.0 + 1.10 + 1.7 + 2.3.2 + 1.4.0 + 1.2.16 + 1.2.74 + 2.0.0 + 2.0.2 + 1.6.2 + + + + + io.github.wujun728 + jun-groovy-api-spring-boot-starter + 1.0.15 + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + junit + junit + test + + + org.projectlombok + lombok + provided + + + + commons-dbutils + commons-dbutils + 1.7 + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + mysql + mysql-connector-java + runtime + + + + + commons-lang + commons-lang + ${commons.lang.version} + + + commons-io + commons-io + ${commons.io.version} + + + commons-configuration + commons-configuration + ${commons.configuration.version} + + + + + cglib + cglib-nodep + 3.3.0 + + + org.codehaus.groovy + groovy + + + io.springfox + springfox-swagger2 + ${springfox.version} + + + io.springfox + springfox-swagger-ui + ${springfox.version} + + + cn.hutool + hutool-all + 5.8.18 + + + + + com.auth0 + java-jwt + 4.4.0 + + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + org.xerial + sqlite-jdbc + + + org.springframework.boot + spring-boot-starter-validation + + + + + + + + + + + + + + ossrh + https://s01.oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + + + org.springframework.boot + spring-boot-dependencies + + + + 2.5.14 + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + Hoxton.SR9 + pom + import + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + 2.2.6.RELEASE + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.2 + + + + + repackage + + + + + + + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + + aliyun-plugin + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/ApiServiceApplication.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/ApiServiceApplication.java new file mode 100644 index 000000000..0750fe937 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/ApiServiceApplication.java @@ -0,0 +1,74 @@ +package com.bjc.lcp; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.core.env.Environment; + +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; + +import cn.hutool.core.lang.Console; +import cn.hutool.extra.spring.SpringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.EnableScheduling; + +@Slf4j +@EnableScheduling +@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) // 多数据源 (exclude = DruidDataSourceAutoConfigure.class) +@MapperScan({"com.jun.plugin.**.mapper","com.bjc.lcp.**.mapper"}) +@ComponentScan(basePackages = {"com.bjc.lcp","com.jun.plugin"}) +@ServletComponentScan(basePackages = {"com.jun.plugin.**.filter"}) +public class ApiServiceApplication { + + public static void main(String[] args) throws UnknownHostException { + SpringApplication app = new SpringApplication(ApiServiceApplication.class); + Environment env = app.run(args).getEnvironment(); + log.info("\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + + "Local: \t\thttp://localhost:{}\n\t" + + "External: \thttp://{}:{}\n\t" + + "Knife4j: \thttp://localhost:{}/doc.html\n" + + "SwaggerUI: \thttp://localhost:{}/swagger-ui.html\n" + + "----------------------------------------------------------", + env.getProperty("spring.application.name"), + env.getProperty("server.port"), + InetAddress.getLocalHost().getHostAddress(), + env.getProperty("server.port"), + env.getProperty("server.port"), + env.getProperty("server.port")); + Console.log(env.getProperty("server.port")); + log.info("profiles = " + SpringUtil.getProperty("spring.profiles.active")); + log.info("url = " + SpringUtil.getProperty("spring.datasource.url")); + log.info("context = " + SpringUtil.getProperty("spring.groovy-api.context")); + //SpringApplication.run(GroovyDemoApplication.class, args); + } + + @Bean + public CommandLineRunner commandLineRunner(ApplicationContext ctx) { + return args -> { + System.out.println("Let's inspect the beans provided by Spring Boot:"); + String[] beanNames = ctx.getBeanDefinitionNames(); + System.err.println("beanNames size = "+ beanNames.length); + for (String beanName : beanNames) { + //System.err.println(beanName); + /* + * Object bean = ctx.getBean(beanName); System.out.println(bean); + * System.out.println(); + */ + } + + }; + } + + + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CommonCRUDComponent.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CommonCRUDComponent.java new file mode 100644 index 000000000..f71b6daa1 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CommonCRUDComponent.java @@ -0,0 +1,115 @@ +package com.bjc.lcp.api.abscomponent; + + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson2.JSON; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Record; +//import com.jfinal.plugin.activerecord.generator.MetaBuilder; +//import com.jfinal.plugin.activerecord.generator.TableMeta; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.common.base.interfaces.Context; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Record; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_groovy,测试Jfinal-CURD-保存在庫裡面 + */ +public class CommonCRUDComponent extends AbstractExecutor> { + + @Override + public String execute(Map params) throws Exception { + //校验组件参数+校验上下文参数,TODO +// if (!checkMinParaCountAndSetRespCode(3)) { +// return ERROR; +// } + super.parameters = params; + + Context context = super.getContext(); + + String sSqlStr = getPara("sSqlStr"); // 执行SQL语句 eq: delete from test where id = ? + Object[] paras = getParas("sParas"); // sql语句参数清单 eq: id (多个逗号分隔) + String sResultPath = getPara("sResult");// 执行SQL语句处理记录数存放标签 eq: 1 (更新的条数) + + String appNo = "A000101"; + super.initDb(appNo, SpringUtil.getProperty("spring.datasource.url"), + SpringUtil.getProperty("spring.datasource.username"), + SpringUtil.getProperty("spring.datasource.password")); + + try { + Object[] paramVal = paras ;//{ "abc", "123" }; + for(int i = 0 ; i < paras.length ; i ++) { + paramVal[i] = context.getGlobal(String.valueOf(paras[i])); + } + if(sSqlStr.trim().toLowerCase().startsWith("select")) { + List datas = Db.use(appNo).find(sSqlStr, paramVal); + if (sResultPath.length() > 0) { + context.setGlobal("sResult", datas); + } + }else { + int result = Db.use(appNo).update(sSqlStr, paramVal); + if (sResultPath.length() > 0) { + context.setGlobal("sResult", result); + } + } + // 测试代码--begin ************************************************************************* + Object[] sqlparams = { 22 }; + List datas = Db.use(appNo).find("select id,title,content,remark,field_name_test from test where id > ?", sqlparams); + Record data = Db.use(appNo).findByIds("test", "id", sqlparams); + +// MetaUtil.getTableMeta(Db.use(appNo).getConfig().getDataSource(), "test").getPkNames() +// MetaBuilder mb = new MetaBuilder(Db.use(appNo).getConfig().getDataSource()); +// List tmetas= mb.build(); + Record data111 = Db.use(appNo).findByIds("test", "id", sqlparams); + //Record data = Db.use(appNo).getSql(appNo) + System.out.println(JSON.toJSONString(datas)); + + Object[] sqlUparams = { 25 }; + Object[] paras1 = { "id" }; + int ucount = Db.use(appNo).update("update test set content = content + '-666' where id = ?", sqlUparams); + System.out.println(JSON.toJSONString(ucount)); + + Object[] sqlDparams = { 26 }; + int dcount = Db.use(appNo).update("delete from test where id = ?", sqlDparams); + System.out.println(JSON.toJSONString(dcount)); + +// Object[] sqliParams = Arrays.asList(10,"aaa","bbb","cccc","dddd").toArray() ; + Object[] sqliParams = new Object[5] ; + sqliParams[0] = 10; + sqliParams[1] = "aaa"; + sqliParams[2] = "bbb"; + sqliParams[3] = "cccc"; + sqliParams[4] = "dddd"; + int icount = Db.use(appNo).update("insert into test (id, title,content,remark,field_name_test ) VALUES ( ?,?, ?, ?, ? ) ", sqliParams); + System.out.println(JSON.toJSONString(icount)); + // 测试代码--end ************************************************************************* + + } catch (Exception e) { + int errorCode = ((SQLException) e).getErrorCode(); + //if (errorCode == -803) { + if (e.getMessage().matches(".*Duplicate.*PRIMARY.*") || errorCode == -803 || errorCode==1062) { + e.printStackTrace(); + throw new Exception("数据库主键冲突!"); + } else { + e.printStackTrace(); + throw new Exception("数据库操作出错!"); + } + } + return ""; + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CompoentExecutorSave.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CompoentExecutorSave.java new file mode 100644 index 000000000..92c3ef61b --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CompoentExecutorSave.java @@ -0,0 +1,83 @@ +package com.bjc.lcp.api.abscomponent; + +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.db.meta.MetaUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.fastjson2.JSON; +//import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Record; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Record; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class CompoentExecutorSave extends AbstractExecutor> { + String appNo = "A000101"; + + @PostConstruct + public void test(){ + Console.log("url = " + SpringUtil.getProperty("spring.datasource.url")); +// initDb(appNo, SpringUtil.getProperty("spring.datasource.url"), +// SpringUtil.getProperty("spring.datasource.username"), +// SpringUtil.getProperty("spring.datasource.password")); + DruidDataSource ds = new DruidDataSource(); + ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); + ds.setUrl( "jdbc:mysql://localhost:3306/db_qixing_bk?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8"); + ds.setUsername("root"); + ds.setPassword(""); + + //MetaUtil.getTableMeta(ds,"").get + + Boolean isExtsis = false; + try { + Db.init(appNo,ds); +// ActiveRecordPlugin arp = new ActiveRecordPlugin(appNo, ds); +// arp.setDevMode(true); +// arp.setShowSql(true); +// arp.start(); + //Db.use(appNo); + } catch (IllegalArgumentException e) { + isExtsis = true; + } + if( !isExtsis ){ + + } + } + + @Override + public Result execute(Map params) { + System.out.println("入参:" + JSONUtil.toJsonStr(params)); + Map map = new HashMap<>(); + try { + Object[] sqliParams = Arrays.asList("aaa"+ RandomUtil.randomInt(),"bbb"+ RandomUtil.randomInt(),"cccc"+ RandomUtil.randomInt(),"dddd"+ RandomUtil.randomInt()).toArray() ; + int icount = Db.use(appNo).update("insert into test (title,content,remark,field_name_test ) VALUES ( ?, ?, ?, ? ) ", sqliParams); + List datas = Db.use(appNo).query(" select * from test "); + List datas2 = Db.use(appNo).find(" select * from test "); + System.out.println(JSON.toJSONString(datas)); + map.put("datas", datas); + map.put("datas2", datas2); + map.put("datas22", datas2.get(0).getColumns()); + map.put("sqliParams", sqliParams); + map.put("count", icount); + System.out.println("返回数据为:" + JSONUtil.toJsonStr(map)); + } catch (Exception e) { + e.printStackTrace(); + return Result.fail(e.getMessage()); + } + return Result.success(map); + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CompoentExecutorTest2.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CompoentExecutorTest2.java new file mode 100644 index 000000000..f69f7dcb9 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/CompoentExecutorTest2.java @@ -0,0 +1,82 @@ +package com.bjc.lcp.api.abscomponent; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.PostConstruct; + +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.common.base.interfaces.Context; +import org.springframework.stereotype.Component; + +import com.alibaba.druid.pool.DruidDataSource; + +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.db.Db; +import cn.hutool.db.Entity; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; + +@Component +public class CompoentExecutorTest2 extends AbstractExecutor> { + +// public CompoentExecutorTest2(Context context) { +// super(context); +// } + + protected static ThreadLocal localContext = new ThreadLocal(); + + protected static ThreadLocal localRetCode = new ThreadLocal(); + + protected static ThreadLocal> localParams = new ThreadLocal>(); + + protected static ThreadLocal localResult = new ThreadLocal(); + + private DruidDataSource ds = new DruidDataSource(); + + + @PostConstruct + public void test(){ + //DruidDataSource ds = new DruidDataSource(); + ds.setUrl(SpringUtil.getProperty("spring.datasource.url")); + Console.log("url = " + SpringUtil.getProperty("spring.datasource.url")); + ds.setUsername(SpringUtil.getProperty("spring.datasource.username")); + ds.setPassword(SpringUtil.getProperty("spring.datasource.password")); + } + + @Override + public Integer execute(Map params) { + //BAS000000000274 + Context context = localContext.get(); + String param1 = context.getGlobalStr("param1"); + + System.out.println("入参:" + JSONUtil.toJsonStr(params)); + Map map = new HashMap<>(); + try { + Long pk = null; + Entity entity = Entity.create("test"); + entity.set("content", "unitTestUser11"+RandomUtil.randomInt()); + entity.set("title", "title-"+RandomUtil.randomInt()); + entity.set("remark", "remark"+RandomUtil.randomInt());; + try { + pk = Db.use(ds).insertForGeneratedKey( + entity + ); + } catch (SQLException e) { + e.printStackTrace(); + } + entity.set("pk", pk); + map.put("record", entity); + System.out.println("返回数据为:" + JSONUtil.toJsonStr(map)); + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + //super.localResult.set(map); + return 0; + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/PageJSONOService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/PageJSONOService.java new file mode 100644 index 000000000..50b50ae12 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/PageJSONOService.java @@ -0,0 +1,42 @@ +package com.bjc.lcp.api.abscomponent; + +import com.alibaba.fastjson2.JSONObject; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Page; +//import com.jfinal.plugin.activerecord.Record; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Page; +import com.jun.plugin.db.record.Record; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +@Component +public class PageJSONOService extends AbstractExecutor> { + + @Override + public JSONObject execute(Map params) { + super.initDb(); + super.setParameters(params); + int pageNumber = super.getParaInt(params,"page"); + int pageSize = super.getParaInt(params,"size"); + String tableName = super.getPara(params,"tableName"); + String columnName = super.getPara("columnName"); + Page pages = Db.use("master").paginate(pageNumber,pageSize,"select *"," from "+tableName); + Page datas = super.getPageMaps(pages); + return (JSONObject) JSONObject.from(datas); +// return (JSONObject) JSONObject.toJSON(datas); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordQueryService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordQueryService.java new file mode 100644 index 000000000..025e3ad8f --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordQueryService.java @@ -0,0 +1,62 @@ +package com.bjc.lcp.api.abscomponent; +//import com.jfinal.plugin.activerecord.Db; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.groovy.util.JdbcUtil; +import com.jun.plugin.sql.SqlEngine; +import com.jun.plugin.sql.SqlMeta; +import org.springframework.stereotype.Component; +import java.sql.SQLException; +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +@Component +public class RecordQueryService extends AbstractExecutor> { + + @Override + public Result execute(Map params) throws SQLException { + super.initDb(); + super.setParameters(params); + int pageNumber = super.getParaInt(params,"page"); + int pageSize = super.getParaInt(params,"size"); + params.put("start",pageSize*(pageNumber-1)); + String tableName = super.getPara(params,"tableName"); + String columnName = super.getPara("columnName"); + String sqlText = " SELECT \n" + + " id,\n" + + " name,\n" + + " age,\n" + + " status,\n" + + " birthday,\n" + + " remarks,\n" + + " create_time\n" + + "FROM \n" + + " test_simple_code_copy1 \n" + + "WHERE \n" + + " 1=1\n" + + " \n" + + " and id = #{id}\n" + + " \n" + + " \n" + + " and name = #{name}\n" + + " \n" + + " \n" + + " and status = #{status}\n" + + " \n" + + "LIMIT \n" + + " #{start}, #{size} "; + SqlMeta sqlMeta = SqlEngine.getEngine().parse(sqlText, params); + Object data = SqlEngine.executeSql(Db.use("master").getConfig().getConnection(), sqlMeta.getSql(), sqlMeta.getJdbcParamValues()); + return Result.success(data); + } +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordRemoveService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordRemoveService.java new file mode 100644 index 000000000..9568bbef6 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordRemoveService.java @@ -0,0 +1,45 @@ +package com.bjc.lcp.api.abscomponent; + +//import com.jfinal.plugin.activerecord.Db; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.db.record.Db; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +@Component +public class RecordRemoveService extends AbstractExecutor> { + + @Override + public Result execute(Map params) { + super.initDb(); + super.setParameters(params); + return delete(params); + } + + public Result delete(Map params) { + String tableName = super.getPara(params,"tableName"); + String primaryKey = super.getPara(params,"primaryKey"); + String id = super.getPara(params,"id"); + Boolean result = false; + if(primaryKey.contains(",")){ + String [] ids = id.split(","); + result = Db.use("master").deleteByIds(tableName,primaryKey, ids); + }else{ + result = Db.use("master").deleteByIds(tableName,primaryKey, id); + } + return Result.success(result); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordSaveService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordSaveService.java new file mode 100644 index 000000000..fcf8d687b --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordSaveService.java @@ -0,0 +1,81 @@ +package com.bjc.lcp.api.abscomponent; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.db.meta.Column; +import cn.hutool.db.meta.MetaUtil; +import cn.hutool.db.meta.Table; +import cn.hutool.json.JSONUtil; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Record; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Record; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +@Component +public class RecordSaveService extends AbstractExecutor> { + + @Override + public Result execute(Map params) throws BusinessException { + super.initDb(); + super.setParameters(params); + + + return save(params); + } + + public Result save(Map params) throws BusinessException { + String tableName = getPara(params,"tableName"); + Table talbe = MetaUtil.getTableMeta(Db.use(MASTER).getConfig().getDataSource(),tableName); + Collection columns = talbe.getColumns(); + for(Column column : columns){ + if(!column.isNullable() && !column.isAutoIncrement()){ + if(MapUtil.getStr(params,column.getName())==null){ + throw new BusinessException("参数["+column.getName() + "]不能为空!"); + } + } + } + Record record = new Record(); + for(Column column : columns){ + if(!column.isAutoIncrement()){ + record.set(column.getName(), getId(MapUtil.getStr(params,column.getName())) ); + } + } + + Boolean resutl = null; + try { + resutl = Db.use(MASTER).save(tableName, record); + System.out.println("返回数据为:" + JSONUtil.toJsonStr(resutl)); + } catch (Exception e) { + e.printStackTrace(); + if(e.getMessage().contains("Duplicate")){ + return Result.fail("数据重复,主键冲突:"+e.getMessage()); + } + if(e.getMessage().contains("Incorrect datetime")){ + return Result.fail("数据格式有误,日期格式不规范(yyyy-mm-dd):"+e.getMessage()); + } + if(e.getMessage().contains("Data too long")){ + return Result.fail("数据字段值太长,超出最大长度:"+e.getMessage()); + } +// throw new RuntimeException(e); + return Result.fail(e.getMessage()); + } + return Result.success(resutl); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordUpdateService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordUpdateService.java new file mode 100644 index 000000000..cf0cf53f9 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/RecordUpdateService.java @@ -0,0 +1,93 @@ +package com.bjc.lcp.api.abscomponent; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.db.meta.Column; +import cn.hutool.db.meta.MetaUtil; +import cn.hutool.db.meta.Table; +import cn.hutool.json.JSONUtil; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Record; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Record; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +@Component +public class RecordUpdateService extends AbstractExecutor> { + + @Override + public Result execute(Map params) throws BusinessException { + super.initDb(); + super.setParameters(params); + +// String tableName = getPara(params,"tableName"); +// Table talbe = MetaUtil.getTableMeta(Db.use(MASTER).getConfig().getDataSource(),tableName); +//// talbe.get +// int pageNumber = getParaInt(params,"page"); +// int pageSize = getParaInt(params,"size"); +// String columnName = getPara("columnName"); +// Page pages = Db.use("master").paginate(pageNumber,pageSize,"select *"," from "+tableName); +// Page datas = getPageMaps(pages); + return update(params); + } + + public Result update(Map params) throws BusinessException { + String tableName = getPara(params,"tableName"); + Table talbe = MetaUtil.getTableMeta(Db.use(MASTER).getConfig().getDataSource(),tableName); + Collection columns = talbe.getColumns(); + for(Column column : columns){ + if(!column.isNullable() /*&& !column.isAutoIncrement()*/){ + if(MapUtil.getStr(params,column.getName())==null){ + throw new BusinessException("参数["+column.getName() + "]不能为空!"); + } + } + } + Record record = new Record(); + for(Column column : columns){ + if(!column.isAutoIncrement()){ + record.set(column.getName(), getId(MapUtil.getStr(params,column.getName())) ); + } + } + + Boolean resutl = null; + try { + resutl = Db.use(MASTER).update(tableName, record); + System.out.println("返回数据为:" + JSONUtil.toJsonStr(resutl)); + } catch (Exception e) { + e.printStackTrace(); + if(e.getMessage().contains("Duplicate")){ + return Result.fail("数据重复,主键冲突:"+e.getMessage()); + } + if(e.getMessage().contains("Incorrect datetime")){ + return Result.fail("数据格式有误,日期格式不规范(yyyy-mm-dd):"+e.getMessage()); + } + if(e.getMessage().contains("Data too long")){ + return Result.fail("数据字段值太长,超出最大长度:"+e.getMessage()); + } +// throw new RuntimeException(e); + return Result.fail(e.getMessage()); + } + return Result.success(resutl); + } + +// @Override +// public Result rollback(Map parms) { +// return Result.success(); +// } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/TestDownloadService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/TestDownloadService.java new file mode 100644 index 000000000..3b0e698e5 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/TestDownloadService.java @@ -0,0 +1,39 @@ +package com.bjc.lcp.api.abscomponent; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * TODO + */ +public class TestDownloadService extends AbstractExecutor> { + + @Override + public JSONObject execute(Map params) throws Exception{ + HttpServletRequest request = super.getRequest(); + super.parameters = params; + String servletPath = (String) params.get("path"); + System.out.println(JSON.toJSONString(params)); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + MultipartFile file = multipartRequest.getFile("file"); // 通过参数名获取指定文件 + FileUtil.writeBytes(file.getBytes(), "D:/abc/"+RandomUtil.randomInt()+file.getOriginalFilename()); + String bizid = multipartRequest.getParameter("bizid"); + String fileName = file.getOriginalFilename(); + + JSONObject json = new JSONObject(); + json.put("fileName", fileName); + json.put("bizid", getPara("bizid")); + json.put("filePaht", bizid); + return json; + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/TestUpladService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/TestUpladService.java new file mode 100644 index 000000000..bb6419446 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/abscomponent/TestUpladService.java @@ -0,0 +1,46 @@ +package com.bjc.lcp.api.abscomponent; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +public class TestUpladService extends AbstractExecutor> { + + @Override + public JSONObject execute(Map params) throws Exception{ + HttpServletRequest request = (HttpServletRequest) params.get("_request"); + super.parameters = params; + String servletPath = (String) params.get("path"); + System.out.println(JSON.toJSONString(params)); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + MultipartFile file = multipartRequest.getFile("file"); // 通过参数名获取指定文件 + FileUtil.writeBytes(file.getBytes(), "D:/abc/"+RandomUtil.randomInt()+file.getOriginalFilename()); + String bizid = multipartRequest.getParameter("bizid"); + String fileName = file.getOriginalFilename(); + + JSONObject json = new JSONObject(); + json.put("fileName", fileName); + json.put("bizid", getPara("bizid")); + json.put("filePaht", bizid); + return json; + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/BeetlSQlCompoent.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/BeetlSQlCompoent.java new file mode 100644 index 000000000..dade374e7 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/BeetlSQlCompoent.java @@ -0,0 +1,209 @@ +//package com.bjc.lcp.api.component; +// +//import com.alibaba.druid.pool.DruidDataSource; +//import com.gitthub.wujun728.engine.base.interfaces.IExecutor; +//import com.jun.plugin.common.Result; +//import lombok.Data; +//import org.beetl.sql.annotation.entity.AutoID; +//import org.beetl.sql.annotation.entity.Table; +//import org.beetl.sql.core.*; +//import org.beetl.sql.core.db.MySqlStyle; +//import org.beetl.sql.core.page.DefaultPageRequest; +//import org.beetl.sql.core.page.DefaultPageResult; +//import org.beetl.sql.core.page.PageRequest; +//import org.beetl.sql.core.page.PageResult; +//import org.beetl.sql.ext.DebugInterceptor; +//import org.beetl.sql.mapper.BaseMapper; +//import org.beetl.sql.mapper.annotation.*; +//import org.springframework.stereotype.Component; +// +//import javax.annotation.PostConstruct; +//import javax.sql.DataSource; +//import java.util.Date; +//import java.util.List; +//import java.util.Map; +// +//@Component +//public class BeetlSQlCompoent implements IExecutor> { +// +// static DruidDataSource ds = new DruidDataSource(); +// +// @PostConstruct +// public static void init(){ +//// ds.setUrl(SpringUtil.getProperty("project.datasource.url")); +//// ds.setUsername(SpringUtil.getProperty("project.datasource.username")); +//// ds.setPassword(SpringUtil.getProperty("project.datasource.password")); +// +// ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); +// ds.setUrl( "jdbc:mysql://localhost:3306/test666?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8"); +// ds.setUsername("root"); +// ds.setPassword(""); +// } +// +// +// public static SQLManager getSQLManger(DataSource dataSource){ +// ConnectionSource source = ConnectionSourceHelper.getSingle(dataSource); +// //source是唯一必须的参数,其他参数都有默认值 +// SQLManagerBuilder builder = new SQLManagerBuilder(source); +// //设置NameConversion,这里数据库命名采用下划线风格,使用UnderlinedNameConversion +// builder.setNc(new UnderlinedNameConversion()); +// //设置一个拦截器,输出debug日志,包含了sql语句和执行参数,执行时间 +// builder.setInters(new Interceptor[]{new DebugInterceptor()}); +// //设置数据库分隔,必须跟数据库一样 +// builder.setDbStyle(new MySqlStyle()); +// SQLManager sqlManager = builder.build(); +// return sqlManager; +// } +// +// /** +// * 在main方法中运行测试 +// * @param args +// */ +// public static void main(String [] args){ +// init(); +// //调用SessionSQLManager获得当前会话的SQLManager +// simple(getSQLManger(ds)); +// } +// +// @Override +// public Result execute(Map params) { +// //init(); +// //调用SessionSQLManager获得当前会话的SQLManager +// simple(getSQLManger(ds)); +// return Result.success(666666); +// } +// +// @Override +// public Result rollback(Map params) { +// return null; +// } +// +// +// /** +// * 任意一个类 +// */ +// @Table(name="sys_user") +// @Data +// public static class UserEntity { +// @AutoID +// private Integer id; +// private String name; +// private Integer departmentId; +// private Date createTime; +// } +// +// /** +// * mapper类 +// */ +// public interface UserMapper extends BaseMapper { +// @Sql("select * from sys_user where id=?") +// public UserEntity selectById(Integer id); +// +// @Template("select * from sys_user where department_id=#{deptId}") +// public List selectByDeptId(@Param("deptId") Integer deptId); +// +// @Template("update sys_user set name=#{name} where id=#{id}") +// @Update /*表示update操作*/ +// public int updateNameById(@Param("id") Integer id,@Param("name") String name); +// +// /** 类似spring data那样通过方法名转化成SQL*/ +// @SpringData +// List queryByNameOrderById(String name); +// +// @Sql("select * from sys_user where department_id = ?") +// PageResult queryDeptById(Integer id, PageRequest pageRequest); +// +// +// @Template("select #{page()} from sys_user where department_id = #{id}") +// PageResult queryTemplateDeptById(Integer id,PageRequest pageRequest); +// +// @SqlProvider(provider = UserQueryProvider.class) +// UserEntity queryId(Integer id); +// +// } +// +// /*Mapper需要的sql和参数外部提供*/ +// public static class UserQueryProvider { +// public SQLReady queryId(Integer id) { +// if (id < 9999) { +// return new SQLReady("select * from sys_user where id=?", 9999); +// } else { +// return new SQLReady("select * from sys_user where id=?", id); +// +// } +// } +// } +// +// +// +// /** +// * 演示mapper调用 +// * @param sqlManager +// */ +// public static void simple(SQLManager sqlManager){ +// UserMapper userMapper = sqlManager.getMapper( +// UserMapper.class); +// +// UserEntity userEntity = userMapper.selectById(1); +// System.out.println(userEntity); +// +// List userEntityList = userMapper.selectByDeptId(1); +// System.out.println(userEntityList); +// +// userMapper.updateNameById(1,"lijz+++"); +// +// userEntityList = userMapper.queryByNameOrderById("lijz++"); +// System.out.println(userEntityList); +// +// +// } +// +// +// /** +// * 演示JDBC SQL翻页 +// */ +// public static void jdbcMapperPage(SQLManager sqlManager){ +// UserMapper userMapper = sqlManager.getMapper( +// UserMapper.class); +// +// PageRequest request = DefaultPageRequest.of(1,10); +// PageResult pr = userMapper.queryDeptById(1,request); +// DefaultPageResult pageResult = (DefaultPageResult)pr; +// printPageResult(pageResult); +// } +// +// /** +// * 演示模板SQL 翻页 +// */ +// public static void templateMapperPage(SQLManager sqlManager){ +// UserMapper userMapper = sqlManager.getMapper( +// UserMapper.class); +// +// PageRequest request = DefaultPageRequest.of(1,10); +// PageResult pr = userMapper.queryTemplateDeptById(1,request); +// DefaultPageResult pageResult = (DefaultPageResult)pr; +// printPageResult(pageResult); +// } +// +// /** +// * 演示通过外部类指定SQL +// */ +// public static void provider(SQLManager sqlManager){ +// UserMapper userMapper = sqlManager.getMapper( +// UserMapper.class); +// UserEntity user = userMapper.queryId(1); +// System.out.println(user); +// } +// +// +// private static void printPageResult(DefaultPageResult pageResult){ +// System.out.println(pageResult.getPage()); +// System.out.println(pageResult.getPageSize()); +// System.out.println(pageResult.getTotalRow()); +// System.out.println(pageResult.getTotalPage()); +// System.out.println(pageResult.getList()); +// } +// +// +// +//} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/CommonDBCompoent.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/CommonDBCompoent.java new file mode 100644 index 000000000..fab89912d --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/CommonDBCompoent.java @@ -0,0 +1,48 @@ +package com.bjc.lcp.api.component; + +import java.sql.SQLException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.PostConstruct; + +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.IExecutor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.alibaba.druid.pool.DruidDataSource; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.db.Db; +import cn.hutool.db.Entity; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; + +@Component +public class CommonDBCompoent implements IExecutor> { + + DruidDataSource ds = new DruidDataSource(); + + @PostConstruct + public void test(){ + ds.setUrl(SpringUtil.getProperty("project.datasource.url")); + ds.setUsername(SpringUtil.getProperty("project.datasource.username")); + ds.setPassword(SpringUtil.getProperty("project.datasource.password")); + } + + @Override + public Result execute(Map params) { + JdbcTemplate jt = new JdbcTemplate(ds); + if(jt!=null) { + System.out.println("jdbcTemplate初始化成功" ); + } + Object[] sqliParams = Arrays.asList("aaa"+ RandomUtil.randomInt(),"bbb"+ RandomUtil.randomInt(),"cccc"+ RandomUtil.randomInt(),"dddd"+ RandomUtil.randomInt()).toArray() ; + int icount = jt.update("insert into test (title,content,remark,field_name_test ) VALUES ( ?, ?, ?, ? ) ", sqliParams); + return Result.success(icount); + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/CompoentExecutorTest.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/CompoentExecutorTest.java new file mode 100644 index 000000000..acc7b99af --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/CompoentExecutorTest.java @@ -0,0 +1,75 @@ +package com.bjc.lcp.api.component; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.PostConstruct; + +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.IExecutor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.alibaba.druid.pool.DruidDataSource; + +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.db.Db; +import cn.hutool.db.Entity; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; + +@Component +public class CompoentExecutorTest implements IExecutor> { + + @Autowired + JdbcTemplate jdbcTemplate; + + DruidDataSource ds = new DruidDataSource(); + + @PostConstruct + public void test(){ + //DruidDataSource ds = new DruidDataSource(); + ds.setUrl(SpringUtil.getProperty("spring.datasource.url")); + Console.log("url = " + SpringUtil.getProperty("spring.datasource.url")); + ds.setUsername(SpringUtil.getProperty("spring.datasource.username")); + ds.setPassword(SpringUtil.getProperty("spring.datasource.password")); + } + + @Override + public Result execute(Map params) { + System.out.println("入参:" + JSONUtil.toJsonStr(params)); + if(jdbcTemplate!=null) { + try { + System.out.println("jdbcTemplate注入成功:" + jdbcTemplate.getDataSource().getConnection()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + Map map = new HashMap<>(); + try { + Long pk = null; + Entity entity = Entity.create("test") + .set("content", "unitTestUser11"+RandomUtil.randomInt()) + .set("title", "title-"+RandomUtil.randomInt()) + .set("remark", "remark"+RandomUtil.randomInt()); + try { + pk = Db.use(ds).insertForGeneratedKey( + entity + ); + } catch (SQLException e) { + e.printStackTrace(); + } + entity.set("pk", pk); + map.put("record", entity); + System.out.println("返回数据为:" + JSONUtil.toJsonStr(map)); + } catch (Exception e) { + e.printStackTrace(); + } + return Result.success(map); + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestCallComponent.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestCallComponent.java new file mode 100644 index 000000000..98ebec8e0 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestCallComponent.java @@ -0,0 +1,40 @@ +package com.bjc.lcp.api.component; + +import cn.hutool.core.lang.Console; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.IExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.web.ServerProperties; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 组件TestCallComponent + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_groovy,测试Jfinal-CURD-保存在庫裡面 + */ +@Slf4j +public class TestCallComponent implements IExecutor> { + + @Resource + ServerProperties config; + + + @Override + public Result execute(Map params) throws Exception{ + //校验组件参数+校验上下文参数,TODO + // TODO Auto-generated method stub + Console.print(" run TestCallComponent execute method have bean call 111 "); + if(config!=null) { + Console.print("ServerProperties is not null execute method have bean call 111 "); + } + return Result.success(); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestCompnent.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestCompnent.java new file mode 100644 index 000000000..5049c58ce --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestCompnent.java @@ -0,0 +1,19 @@ +package com.bjc.lcp.api.component; + +import cn.hutool.core.lang.Console; +import com.jun.plugin.common.base.interfaces.IExecutor; + +import java.util.Map; + +public class TestCompnent implements IExecutor> { + + @Override + public Integer execute(Map params) { + // TODO Auto-generated method stub + Console.print(" run TestCompnent execute method 111 "); + return 0; + } + + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJSONObjectService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJSONObjectService.java new file mode 100644 index 000000000..3743ad7e3 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJSONObjectService.java @@ -0,0 +1,75 @@ +package com.bjc.lcp.api.component; + +import com.alibaba.fastjson2.JSONObject; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Page; +//import com.jfinal.plugin.activerecord.Record; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.common.exception.BusinessException; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Page; +import com.jun.plugin.db.record.Record; +import com.jun.plugin.groovy.groovy.GroovyDynamicLoader; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +@Component +public class TestJSONObjectService extends AbstractExecutor> { + + @Autowired + SqlSessionTemplate sqlSessionTemplate; + + @Autowired + GroovyDynamicLoader groovyDynamicLoader; + + @Override + public JSONObject execute(Map params) throws BusinessException { +// SqlSession sqlSession= sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); +// BaseMapper mapper = (BaseMapper) sqlSession.getMapper(groovyDynamicLoader.getClassMap().get("SimpleCodeMapper")); +// mapper.selectList(new LambdaQueryWrapper()); +// sqlSession.selectOne("SimpleCodeMapper.selectCount1",1); + super.initDb(); + super.setParameters(params); + if(super.request==null){ + System.out.println(1111); + } + if(super.parameters==null){ + System.out.println(2222); + } +// initDb("master", SpringUtil.getProperty("spring.datasource.url"), +// SpringUtil.getProperty("spring.datasource.username"), +// SpringUtil.getProperty("spring.datasource.password")); + int pageNumber = super.getParaInt(params,"page"); + int pageSize = super.getParaInt("size"); + Page pages = Db.use("master").paginate(pageNumber,pageSize,"select *"," from test_simple_code"); + Page datas = super.getPageMaps(pages); +// String servletPath = (String) params.get("path"); +// System.out.println(JSON.toJSONString(params)); +// JSONObject json= new JSONObject(); +// JSONObject json1= new JSONObject(); +// json1.put("username","admin"); +// json1.put("username1","admin1"); +// +// json1.put("nickname","admin2"); +// json1.put("mobile",13888888888L); +// json.put("userinfo",json1); +//// json.put("simplecode",mapper.selectList(new LambdaQueryWrapper<>())); +//// json.put("simplecode1",mapper1.selectList(new LambdaQueryWrapper<>())); +// json.put("datas",datas); + return (JSONObject) JSONObject.from(datas); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJdbCRUDGroovyBean.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJdbCRUDGroovyBean.java new file mode 100644 index 000000000..4e2723ff4 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJdbCRUDGroovyBean.java @@ -0,0 +1,62 @@ +package com.bjc.lcp.api.component; + +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.db.Db; +import cn.hutool.db.Entity; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.druid.pool.DruidDataSource; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.IExecutor; + +import javax.annotation.PostConstruct; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +/** + * 需要把该代码放进DB,api_groovy,CURD-CURD-保存在庫裡面 + */ +public class TestJdbCRUDGroovyBean implements IExecutor> { + + DruidDataSource ds = new DruidDataSource(); + + @PostConstruct + public void test(){ + //DruidDataSource ds = new DruidDataSource(); + ds.setUrl(SpringUtil.getProperty("spring.datasource.url")); + Console.log("url = " + SpringUtil.getProperty("spring.datasource.url")); + ds.setUsername(SpringUtil.getProperty("spring.datasource.username")); + ds.setPassword(SpringUtil.getProperty("spring.datasource.password")); + } + + + @Override + public Result execute(Map parms) throws Exception { + Map params = parms; + Map map = new HashMap<>(); + try { + Long pk = null; + Entity entity = Entity.create("test") + .set("content", "unitTestUser11"+RandomUtil.randomInt()) + .set("title", "title-"+RandomUtil.randomInt()) + .set("remark", "remark"+RandomUtil.randomInt()); + try { + pk = Db.use(ds).insertForGeneratedKey( + entity + ); + } catch (SQLException e) { + e.printStackTrace(); + } + entity.set("pk", pk); + + map.put("record", entity); + System.out.println("返回数据为:" + JSONUtil.toJsonStr(map)); + } catch (Exception e) { + e.printStackTrace(); + } + return Result.success(map); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJfinalCRUDGroovyBean.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJfinalCRUDGroovyBean.java new file mode 100644 index 000000000..9546af3bd --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestJfinalCRUDGroovyBean.java @@ -0,0 +1,53 @@ +package com.bjc.lcp.api.component; + +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; +//import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Record; +//import com.jfinal.plugin.druid.DruidPlugin; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.IExecutor; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Record; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + +/** + * 需要把该代码放进DB,api_groovy,测试Jfinal-CURD-保存在庫裡面 + */ +public class TestJfinalCRUDGroovyBean implements IExecutor> { + + @PostConstruct + public void test(){ + Db.init(SpringUtil.getProperty("spring.datasource.url"), + SpringUtil.getProperty("spring.datasource.username"), + SpringUtil.getProperty("spring.datasource.password")); +// DruidPlugin dp = new DruidPlugin(SpringUtil.getProperty("spring.datasource.url"), +// SpringUtil.getProperty("spring.datasource.username"), +// SpringUtil.getProperty("spring.datasource.password")); +// ActiveRecordPlugin arp = new ActiveRecordPlugin("test1",dp); +// // arp.addMapping("blog", Blog.class); +// // 与 jfinal web 环境唯一的不同是要手动调用一次相关插件的start()方法 +// dp.start(); +// arp.start(); + } + + + + @Override + public Result execute(Map parms) throws Exception { + Record data = new Record().set("title", "1111").set("content", "content").set("remark", "remark"); + Boolean resutl = Db.use("test1").save("test", data); + Map params = parms; + Map map = new HashMap<>(); + map.put("reward", "6666"); + map.put("resutl", resutl); + System.out.println("返回数据为:" + JSONUtil.toJsonStr(map)); + return Result.success(map); + } + +} + diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestResultJSONService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestResultJSONService.java new file mode 100644 index 000000000..620004314 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/component/TestResultJSONService.java @@ -0,0 +1,55 @@ +package com.bjc.lcp.api.component; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +//import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +//import com.jfinal.plugin.druid.DruidPlugin; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.IExecutor; +import com.jun.plugin.db.record.Db; + +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_groovy,测试Jfinal-CURD-保存在庫裡面 + */ +public class TestResultJSONService implements IExecutor> { + + public void initDb(String appNo, String url, String username, String password) { +// DruidPlugin dp = new DruidPlugin(url, username, password); +// ActiveRecordPlugin arp = new ActiveRecordPlugin(appNo, dp); +// // 与 jfinal web 环境唯一的不同是要手动调用一次相关插件的start()方法 +// dp.start(); +// arp.start(); + Db.init(url,username,password); + } + + @Override + public Result execute(Map params) throws Exception{ + + String servletPath = (String) params.get("path"); + System.out.println(JSON.toJSONString(params)); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"userinfo\":{\r\n" + + " \"id\":1,\r\n" + + " \"username\":\"admin\",\r\n" + + " \"nickname\":\"admin\",\r\n" + + " \"mobile\":\"13888888888\",\r\n" + + " \"avatar\":\"\",\r\n" + + " \"score\":0,\r\n" + + " \"token\":\"c8edcb1d-8c5c-4e5d-9e53-71d7024f9030\",\r\n" + + " \"user_id\":1,\r\n" + + " \"createtime\":1593422850,\r\n" + + " \"expiretime\":1596014850,\r\n" + + " \"expires_in\":2592000}} "); + return Result.success(json); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/ApiHeaderFilter.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/ApiHeaderFilter.java new file mode 100644 index 000000000..8cf67b5df --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/ApiHeaderFilter.java @@ -0,0 +1,49 @@ +package com.bjc.lcp.api.config; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.*; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Slf4j +@Component //不能加注解,否则会自动注册 +public class ApiHeaderFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + /** + * standalone 模式跨域设置 + * @param servletRequest + * @param servletResponse + * @param filterChain + * @throws IOException + * @throws ServletException + */ + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + log.debug("ApiHeaderFilter filter execute"); + HttpServletResponse response = (HttpServletResponse) servletResponse; + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json; charset=utf-8"); + // 跨域设置 + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*");//这里很重要,要不然js header不能跨域携带 Authorization属性 + response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); + + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + + } +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/AuthFilter.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/AuthFilter.java new file mode 100644 index 000000000..b1e2c66d3 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/AuthFilter.java @@ -0,0 +1,66 @@ +package com.bjc.lcp.api.config; + +import com.alibaba.fastjson2.JSONObject; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + + +public class AuthFilter implements Filter { + + private static final Set ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>( + Arrays.asList("/admin/login"))); + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) servletRequest; + HttpServletResponse resp = (HttpServletResponse) servletResponse; + + String path = req.getRequestURI().substring(req.getContextPath().length()).replaceAll("[/]+$", ""); + + System.out.println("path:" + path); + + String sessionId = req.getSession().getId(); + System.out.println("sessionId:" + sessionId + " req.method:" + req.getMethod()); + //filterChain.doFilter(servletRequest, servletResponse); + + //放行options请求, 因为浏览器的跨域验证,通过options请求发送 + if(req.getMethod().equals("OPTIONS")){ + filterChain.doFilter(servletRequest, servletResponse); + return; + } + + boolean allowedPath = ALLOWED_PATHS.contains(path); + + if (allowedPath) { + System.out.println("这里是不需要处理的url进入的方法"); + filterChain.doFilter(servletRequest, servletResponse); + } + else { + System.out.println("这里是需要处理的url进入的方法"); + Object currentUser = req.getSession().getAttribute("currentUser"); + if(currentUser != null){ + filterChain.doFilter(servletRequest, servletResponse); + }else{ + resp.setCharacterEncoding("UTF-8"); + resp.addHeader("Access-Control-Allow-Origin", "http://localhost:8080"); + resp.addHeader("Access-Control-Allow-Credentials","true"); + resp.setContentType("application/json; charset=utf-8"); + PrintWriter out = resp.getWriter(); + JSONObject res = new JSONObject(); + res.put("code", -101); + res.put("restInfo", "登录已过期,请重写登录"); + out.append(res.toString()); + out = resp.getWriter(); + } + } + } +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/CrossConfig.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/CrossConfig.java new file mode 100644 index 000000000..ac1b52055 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/config/CrossConfig.java @@ -0,0 +1,19 @@ +package com.bjc.lcp.api.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CrossConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + //.allowedOrigins("*") // SpringBoot低版本没问题,高版本不能让这样设置 + .allowedOriginPatterns("*") + .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") + .allowCredentials(true) + .maxAge(3600) + .allowedHeaders("*"); + } +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/App1Controller.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/App1Controller.java new file mode 100644 index 000000000..cb53dcb68 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/App1Controller.java @@ -0,0 +1,283 @@ +package com.bjc.lcp.api.controller; + +import cn.hutool.core.map.MapUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Maps; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.util.HttpRequestUtil; +import com.jun.plugin.common.util.RequestWrapper; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Map; + +@RestController +public class App1Controller { + +// @Resource +// SysDictService sysDictService; +// +// @Resource +// UserService userService; + + @RequestMapping("/api/mobile/login/loginByPassword") + @ResponseBody + public Result loginByPassword(HttpServletRequest request) throws IOException { + System.out.println("Request URI: " + request.getRequestURI()); + HttpServletRequest requestWrapper = new RequestWrapper((HttpServletRequest) request); + Map param = HttpRequestUtil.getAllParameters(requestWrapper); + System.out.println(JSON.toJSONString(HttpRequestUtil.getAllParameters(requestWrapper))); + String loginType = MapUtil.getStr(param, "loginType"); + if("0".equals(loginType)) {//验证码登录,首次登录后自动注册,默认手机尾号后四位密码 + String phoneNo = MapUtil.getStr(param, "phoneNo"); + String validCode = MapUtil.getStr(param, "validCode"); + } + if("1".equals(loginType)) {//用户名密码登录 + String username = MapUtil.getStr(param, "username"); + String password = MapUtil.getStr(param, "password"); + String validCode = MapUtil.getStr(param, "validCode"); +// SysUser vo = new SysUser(); +// vo.setUsername(username); +// vo.setPassword(password); +// LoginRespVO loginRespVO = userService.login(vo); +// return Result.success(loginRespVO); + } + if("3".equals(loginType)) {//本机号码一键登录 + String phoneNo = MapUtil.getStr(param, "phoneNo"); + String validCode = MapUtil.getStr(param, "validCode"); + } + if("other".equals(loginType)) { + String phoneNo = MapUtil.getStr(param, "phoneNo"); + String validCode = MapUtil.getStr(param, "validCode"); + } + if("currentPhone".equals(loginType)) { + String phoneNo = MapUtil.getStr(param, "phoneNo"); + String validCode = MapUtil.getStr(param, "validCode"); + } + JSONObject json= JSON.parseObject(" {\r\n" + + " \"userinfo\":{\r\n" +// + " \"id\":1,\r\n" +// + " \"username\":\"admin\",\r\n" +// + " \"nickname\":\"admin\",\r\n" +// + " \"mobile\":\"13888888888\",\r\n" +// + " \"avatar\":\"\",\r\n" +// + " \"score\":0,\r\n" +// + " \"token\":\"c8edcb1d-8c5c-4e5d-9e53-71d7024f9030\",\r\n" +// + " \"user_id\":1,\r\n" +// + " \"createtime\":1593422850,\r\n" +// + " \"expiretime\":1596014850,\r\n" + + " \"expires_in\":2592000}} "); + return new Result(200,"登录成功!",json); + } + Map loginInfo = Maps.newHashMap(); + @RequestMapping("/api/mobile/login/logout") + public Result logout(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"userinfo\":{\r\n" +// + " \"id\":1,\r\n" +// + " \"username\":\"admin\",\r\n" +// + " \"nickname\":\"admin\",\r\n" +// + " \"mobile\":\"13888888888\",\r\n" +// + " \"avatar\":\"\",\r\n" +// + " \"score\":0,\r\n" +// + " \"token\":\"c8edcb1d-8c5c-4e5d-9e53-71d7024f9030\",\r\n" +// + " \"user_id\":1,\r\n" +// + " \"createtime\":1593422850,\r\n" +// + " \"expiretime\":1596014850,\r\n" + + " \"expires_in\":2592000}} "); + return new Result(200,"已退出登录!",json); + } + + + @RequestMapping("/api/mobile/index") + public Result index(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject(" {} "); +// if(RandomUtil.randomInt(200)>100) { +// return new Result(200,"首页渲染信息!",json); +// }else { +// return new Result(0,"首页渲染信息!",json); +// } + return new Result(0,"首页渲染信息!",json); + } + + @RequestMapping("/api/mobile/login/sendCode") + public Result sendCode(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject(" {} "); + return new Result(200,"发送短信成功!",json); + } + @RequestMapping("/api/mobile/user/registerUser") + public Result registerUser(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject(" {} "); + return new Result(200,"发送短信成功!",json); + } + @RequestMapping("/api/test/testData/listData") + public String listData(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject(" {\"list\":[{\"id\":\"1148170340563320832\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"安安\",\"createDate\":\"2019-07-08 18:01\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:30\",\"testInput\":\"测试数据1\",\"testTextarea\":\"文本域\",\"testSelect\":\"1\",\"testSelectMultiple\":\"\",\"testRadio\":\"1\",\"testCheckbox\":\"1,2\",\"testDate\":\"2019-07-07\",\"testDatetime\":\"2019-07-08 18:02\",\"testUser\":{\"id\":\"user1_ur60\",\"isNewRecord\":false,\"userCode\":\"user1_ur60\",\"userName\":\"用户01\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"id\":\"SDJN01\",\"isNewRecord\":false,\"officeCode\":\"SDJN01\",\"officeName\":\"企管部\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"370102\",\"testAreaName\":\"历下区\",\"testDataChildList\":[]},{\"id\":\"1148197403533664256\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2019-07-08 19:49\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:29\",\"testInput\":\"测试数据2\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"2\",\"testCheckbox\":\"1\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1148197456335757312\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2019-07-08 19:49\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:28\",\"testInput\":\"测试数据3\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"2\",\"testRadio\":\"\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162753403039744\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:11\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:27\",\"testInput\":\"测试数据4\",\"testTextarea\":\"\",\"testSelect\":\"2\",\"testSelectMultiple\":\"1\",\"testRadio\":\"2\",\"testCheckbox\":\"1\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162782335348736\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:11\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:26\",\"testInput\":\"测试数据5\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"2\",\"testRadio\":\"2\",\"testCheckbox\":\"1\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162924073463808\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:25\",\"testInput\":\"测试数据6\",\"testTextarea\":\"\",\"testSelect\":\"2\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"1\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162951009284096\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:24\",\"testInput\":\"测试数据7\",\"testTextarea\":\"\",\"testSelect\":\"2\",\"testSelectMultiple\":\"2\",\"testRadio\":\"1\",\"testCheckbox\":\"1\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162977416622080\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:23\",\"testInput\":\"测试数据8\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"2\",\"testRadio\":\"2\",\"testCheckbox\":\"1,2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997343760384\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:22\",\"testInput\":\"测试数据9\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997343760385\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:21\",\"testInput\":\"测试数据10\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997343760386\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:19\",\"testInput\":\"测试数据11\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997343760387\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:18\",\"testInput\":\"测试数据12\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997343760388\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:17\",\"testInput\":\"测试数据13\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997343760389\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:16\",\"testInput\":\"测试数据14\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997345760380\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:15\",\"testInput\":\"测试数据15\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997345760381\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:14\",\"testInput\":\"测试数据16\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997345760382\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:13\",\"testInput\":\"测试数据17\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997345760383\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:12\",\"testInput\":\"测试数据18\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997345760384\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:11\",\"testInput\":\"测试数据19\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]},{\"id\":\"1384162997345760385\",\"isNewRecord\":false,\"status\":\"0\",\"remarks\":\"\",\"createDate\":\"2021-04-19 15:12\",\"updateBy\":\"system\",\"createBy\":\"system\",\"updateDate\":\"2021-04-19 15:10\",\"testInput\":\"测试数据20\",\"testTextarea\":\"\",\"testSelect\":\"1\",\"testSelectMultiple\":\"1\",\"testRadio\":\"1\",\"testCheckbox\":\"2\",\"testUser\":{\"isNewRecord\":true,\"userCode\":\"\",\"avatarUrl\":\"/ctxPath/static/images/user1.jpg\"},\"testOffice\":{\"isNewRecord\":true,\"officeCode\":\"\",\"isTreeLeaf\":false,\"isRoot\":true},\"testAreaCode\":\"\",\"testAreaName\":\"\",\"testDataChildList\":[]}],\"count\":23,\"pageNo\":1,\"pageSize\":20} "); + return json.toJSONString(); + } + @RequestMapping("/api/test/testData/form") + public String form(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject("{ testData: {\r\n" + + " \"testRadio\": \"1\",\r\n" + + " \"updateDate\": \"2021-04-19 15:30\",\r\n" + + " \"testInput\": \"测试数据1\",\r\n" + + " \"testSelectMultiple\": \"\",\r\n" + + " \"isNewRecord\": false,\r\n" + + " \"testTextarea\": \"文本域\",\r\n" + + " \"testSelect\": \"1\",\r\n" + + " \"testAreaName\": \"历下区\",\r\n" + + " \"testDatetime\": \"2019-07-08 18:02\",\r\n" + + " \"testAreaCode\": \"370102\",\r\n" + + " \"createBy\": \"system\",\r\n" + + " \"testOffice\": {\r\n" + + " \"officeName\": \"企管部\",\r\n" + + " \"isRoot\": true,\r\n" + + " \"isTreeLeaf\": false,\r\n" + + " \"officeCode\": \"SDJN01\",\r\n" + + " \"id\": \"SDJN01\",\r\n" + + " \"isNewRecord\": false\r\n" + + " },\r\n" + + " \"updateBy\": \"system\",\r\n" + + " \"testDataChildList\": [],\r\n" + + " \"testCheckbox\": \"1,2\",\r\n" + + " \"id\": \"1148170340563320832\",\r\n" + + " \"testUser\": {\r\n" + + " \"avatarUrl\": \"/ctxPath/static/images/user1.jpg\",\r\n" + + " \"id\": \"user1_ur60\",\r\n" + + " \"isNewRecord\": false,\r\n" + + " \"userName\": \"用户01\",\r\n" + + " \"userCode\": \"user1_ur60\"\r\n" + + " },\r\n" + + " \"remarks\": \"安安\",\r\n" + + " \"testDate\": \"2019-07-07\",\r\n" + + " \"status\": \"0\",\r\n" + + " \"createDate\": \"2019-07-08 18:01\"\r\n" + + " } } "); + json.forEach((k,v)->{System.err.println("k="+k+",v="+v);}); + return json.toJSONString(); + } + @RequestMapping("/api/sys/office/treeData") + public String treeData(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONArray json= JSON.parseArray(" [\r\n" + + " {\r\n" + + " \"code\": \"SD\",\r\n" + + " \"isParent\": true,\r\n" + + " \"name\": \"山东公司\",\r\n" + + " \"pId\": \"0\",\r\n" + + " \"id\": \"SD\",\r\n" + + " \"title\": \"山东公司\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDJN\",\r\n" + + " \"isParent\": true,\r\n" + + " \"name\": \"济南公司\",\r\n" + + " \"pId\": \"SD\",\r\n" + + " \"id\": \"SDJN\",\r\n" + + " \"title\": \"山东济南公司\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDJN01\",\r\n" + + " \"isParent\": false,\r\n" + + " \"name\": \"企管部\",\r\n" + + " \"pId\": \"SDJN\",\r\n" + + " \"id\": \"SDJN01\",\r\n" + + " \"title\": \"山东济南企管部\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDJN02\",\r\n" + + " \"isParent\": false,\r\n" + + " \"name\": \"财务部\",\r\n" + + " \"pId\": \"SDJN\",\r\n" + + " \"id\": \"SDJN02\",\r\n" + + " \"title\": \"山东济南财务部\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDJN03\",\r\n" + + " \"isParent\": false,\r\n" + + " \"name\": \"研发部\",\r\n" + + " \"pId\": \"SDJN\",\r\n" + + " \"id\": \"SDJN03\",\r\n" + + " \"title\": \"山东济南研发部\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDQD\",\r\n" + + " \"isParent\": true,\r\n" + + " \"name\": \"青岛公司\",\r\n" + + " \"pId\": \"SD\",\r\n" + + " \"id\": \"SDQD\",\r\n" + + " \"title\": \"山东青岛公司\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDQD01\",\r\n" + + " \"isParent\": false,\r\n" + + " \"name\": \"企管部\",\r\n" + + " \"pId\": \"SDQD\",\r\n" + + " \"id\": \"SDQD01\",\r\n" + + " \"title\": \"山东青岛企管部\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDQD02\",\r\n" + + " \"isParent\": false,\r\n" + + " \"name\": \"财务部\",\r\n" + + " \"pId\": \"SDQD\",\r\n" + + " \"id\": \"SDQD02\",\r\n" + + " \"title\": \"山东青岛财务部\"\r\n" + + " },\r\n" + + " {\r\n" + + " \"code\": \"SDQD03\",\r\n" + + " \"isParent\": false,\r\n" + + " \"name\": \"研发部\",\r\n" + + " \"pId\": \"SDQD\",\r\n" + + " \"id\": \"SDQD03\",\r\n" + + " \"title\": \"山东青岛研发部\"\r\n" + + " }\r\n" + + "] "); + return json.toJSONString(); + } + + @RequestMapping("/api/test/testData/delete") + public JSONObject delete(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"message\": \"删除成功!\" , " + + " \"result\": 'true' , " + + " \"msg111\": true " + + "} "); + json.forEach((k,v)->{System.err.println("k="+k+",v="+v);}); + return json; + } + + @RequestMapping("/api/test/testData/save") + public JSONObject save(HttpServletRequest request) { + Map param = HttpRequestUtil.getAllParameters(request); + System.out.println(JSON.toJSONString(param)); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"message\": \"保存成功!\" , " + + " \"result\": 'true' , " + + " \"msg111\": true " + + "} "); + json.forEach((k,v)->{System.err.println("k="+k+",v="+v);}); + return json; + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/App2Controller2.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/App2Controller2.java new file mode 100644 index 000000000..ffdd9a85e --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/App2Controller2.java @@ -0,0 +1,372 @@ +package com.bjc.lcp.api.controller; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.util.HttpRequestUtil; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +@RestController +public class App2Controller2 { + + @RequestMapping("/api/user/login") + public Result login(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"userinfo\":{\r\n" + + " \"id\":1,\r\n" + + " \"username\":\"admin\",\r\n" + + " \"nickname\":\"admin1111\",\r\n" + + " \"mobile\":\"13888888888\",\r\n" + + " \"avatar\":\"\",\r\n" + + " \"score\":0,\r\n" + + " \"token\":\"c8edcb1d-8c5c-4e5d-9e53-71d7024f9030\",\r\n" + + " \"user_id\":1,\r\n" + + " \"createtime\":1593422850,\r\n" + + " \"expiretime\":1596014850,\r\n" + + " \"expires_in\":2592000}} "); + return Result.success(null,json); + } + + @RequestMapping("/api/index/getsysteminfo") + public Result getsysteminfo(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"images\": \"https://omo-oss-image.thefastimg.com/portal-saas/new2022093017543412358/cms/image/e46936f7-8a3d-4240-8b81-81541babc2d8.png\", \r\n" + + " \"name\": \"齐兴会计师事务所\", \r\n" + + " \"beian\": \"beian666\" \r\n" + + "} "); + return Result.success(null,json); + } + + @RequestMapping("/api/index/getmenus") + public Result getmenus(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + + Map data = Maps.newHashMap(); + List list = Lists.newArrayList(); + list.add("http://cdn.uviewui.com/uview/swiper/swiper1.png"); + list.add("https://cdn.uviewui.com/uview/swiper/swiper2.png"); + list.add("https://cdn.uviewui.com/uview/swiper/swiper3.png"); + data.put("bannerlist", list.toArray()); + + + List menus = Lists.newArrayList(); + Map info = Maps.newHashMap(); + info.put("src", "https://cdn.uviewui.com/uview/swiper/swiper1.png"); + info.put("title", "功能1"); + Map menu = Maps.newHashMap(); + menu.put("title", "功能模块1"); + menu.put("info", info); + menus.add(menu); + data.put("menus", menus); + return Result.success(data); + } + + @RequestMapping("/api/index/getmenus2") + public Result getmenus2(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"menus\": {\r\n" + + " \"title\": \"功能模块666\",\r\n" + + " \"info\": [\r\n" + + " {\r\n" + + " \"title\": \"111\",\r\n" + + " \"src\": \"http://cdn.uviewui.com/uview/swiper/swiper1.png\",\r\n" + + " },\r\n" + + " {\r\n" + + " \"title\": \"222\",\r\n" + + " \"src\": \"http://cdn.uviewui.com/uview/swiper/swiper2.png\",\r\n" + + " },\r\n" + + " {\r\n" + + " \"title\": \"333\",\r\n" + + " \"src\": \"http://cdn.uviewui.com/uview/swiper/swiper3.png\",\r\n" + + " }\r\n" + + " ],\r\n" + + " \"status\": 0\r\n" + + " }\r\n" + + "} "); + return Result.success(json); + } + + Map userinfo = Maps.newHashMap(); + @RequestMapping("api/user/getUserDetail") + public Result getUserDetail(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + if(CollectionUtils.isEmpty(userinfo)) { + userinfo.put("avatar", ""); + userinfo.put("nickname", "admin"); + userinfo.put("username", "admin"); + userinfo.put("id", "666"); + userinfo.put("email", "test@qq.com"); + userinfo.put("mobile", "13012344321"); + userinfo.put("birthday", "2023-01-02"); + userinfo.put("gender", 1); + } + return Result.success(userinfo); + } + + @RequestMapping("/api/user/setuserinfo") + public Result setuserinfo(HttpServletRequest request) { + Map param = HttpRequestUtil.getFromParams(request); + System.out.println(JSON.toJSONString(param)); +// data.put("nickname", "admin"); +// data.put("username", "admin"); +// data.put("id", "666"); +// data.put("email", "test@qq.com"); +// data.put("mobile", "13012344321"); +// data.put("birthday", "2023-01-02"); +// data.put("gender", 1); + userinfo.putAll(param); + return Result.success(userinfo); + } + @RequestMapping("/api/user/setusergender") + public Result setusergender(HttpServletRequest request) { + Map param = HttpRequestUtil.getFromParams(request); + System.out.println(JSON.toJSONString(param)); + userinfo.putAll(param); + return Result.success(userinfo); + } + + + @RequestMapping("/api/common/upload") + public Result upload(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"url\": \"https://omo-oss-image.thefastimg.com/portal-saas/new2022093017543412358/cms/image/e46936f7-8a3d-4240-8b81-81541babc2d8.png\", \r\n" + + " \"name\": \"name\", \r\n" + + " \"filePath\": \"filePath\" \r\n" + + "} "); + return Result.success(json); + } + @RequestMapping("/api/ykjp/product/unit/deleteUnit") + public Result deleteUnit(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + @RequestMapping("/api/ykjp/product/unit/addUnit") + public Result addUnit(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + @RequestMapping("/api/ykjp/product/type/deleteType") + public Result deleteType(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + @RequestMapping("/api/ykjp/product/type/add") + public Result addType(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + @RequestMapping("/api/ykjp/product/product/deleteProduct") + public Result deleteProduct(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + @RequestMapping("/api/ykjp/information/basisinfo/supplier/deleteProduct") + public Result deletebasisinfoProduct(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + @RequestMapping("/api/ykjp/information/basisinfo/supplier/add") + public Result addbasisinfoProduct(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + @RequestMapping("/api/ykjp/information/basisinfo/warehouse/add") + public Result addwarehouse(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + return Result.success(); + } + + @RequestMapping("/api/ykjp/product/unit/getUnitList") + public Result getUnitList(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"data\": [{\r\n" + + " \"id\": 1,\r\n" + + " \"name\": \"件\",\r\n" + + " \"firmid\": null,\r\n" + + " \"createtime\": 1593348050,\r\n" + + " \"updatetime\": 1593348050,\r\n" + + " \"deletetime\": null\r\n" + + " }, {\r\n" + + " \"id\": 2,\r\n" + + " \"name\": \"条\",\r\n" + + " \"firmid\": null,\r\n" + + " \"createtime\": 1593348057,\r\n" + + " \"updatetime\": 1593348057,\r\n" + + " \"deletetime\": null\r\n" + + " }]\r\n" + + " } "); + return Result.success(json); + } + + @RequestMapping("/api/ykjp/product/type/getType") + public Result getType(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"data\": [{\r\n" + + " createtime:1594827893\r\n" + + " deletetime:null\r\n" + + " firmid:null\r\n" + + " id:8\r\n" + + " image:\"http://127.0.0.1:8081/uploads/20200715/b8219f88b484274acc31cd1b81156ba7.jpg\"\r\n" + + " name:\"服装\"\r\n" + + " pid:0\r\n" + + " product_id:null\r\n" + + " prop:\"[{\"title\":\"服装\"}]\"\r\n" + + " updatetime:1594827893\r\n" + + " weigh:0\r\n" + + " },{\r\n" + + " createtime:1594827893\r\n" + + " deletetime:null\r\n" + + " firmid:null\r\n" + + " id:8\r\n" + + " image:\"http://127.0.0.1:8081/uploads/20200715/b8219f88b484274acc31cd1b81156ba7.jpg\"\r\n" + + " name:\"服装2\"\r\n" + + " pid:0\r\n" + + " product_id:null\r\n" + + " prop:\"[{\"title\":\"服装2\"}]\"\r\n" + + " updatetime:1594827893\r\n" + + " weigh:0\r\n" + + " } ]\r\n" + + " } "); + return Result.success(json); + } + + @RequestMapping("/api/ykjp/product/product/getProduct") + public Result getProduct(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"data\":[\r\n" + + " {\r\n" + + " \"id\":2,\r\n" + + " \"firmid\":null,\r\n" + + " \"name\":\"衣服\",\r\n" + + " \"product_type_id\":10,\r\n" + + " \"specification\":\"2件55元\",\r\n" + + " \"sku\":\"\",\r\n" + + " \"prop\":\"[{\"title\":\"上衣\",\"value\":\"\"}]\",\r\n" + + " \"inventory\":0,\r\n" + + " \"min_warning\":0,\r\n" + + " \"max_warning\":0,\r\n" + + " \"raise\":0,\r\n" + + " \"remark\":\"\",\r\n" + + " \"createtime\":1595149254,\r\n" + + " \"updatetime\":1595149254,\r\n" + + " \"deletetime\":null,\r\n" + + " \"product_unit_id\":13,\r\n" + + " \"unit\":\"件\"\r\n" + + " }\r\n" + + " ]\r\n" + + " } "); + return Result.success(json); + } + + @RequestMapping("/api/ykjp/information/basisinfo/supplier/index") + public Result getProductList(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"data\":[\r\n" + + " {\r\n" + + " \"id\":2,\r\n" + + " \"avatar\":\"\",\r\n" + + " \"code\":\"SP20200719184024\",\r\n" + + " \"name\":\"北京冰河服饰有限公司\",\r\n" + + " \"abbname\":\"\",\r\n" + + " \"contact\":\"程卓\",\r\n" + + " \"phone\":\"13529746799\",\r\n" + + " \"city\":\"北京/北京市/崇文区\",\r\n" + + " \"address\":\"北京市丰台区菜户营58号11032室(太平桥企业集中办公区)\",\r\n" + + " \"fax\":\"\",\r\n" + + " \"mobile\":\"0877262422\",\r\n" + + " \"bank\":\"\",\r\n" + + " \"banknums\":\"\",\r\n" + + " \"term\":21,\r\n" + + " \"identifier\":\"\",\r\n" + + " \"credit\":\"\",\r\n" + + " \"amount\":\"0\",\r\n" + + " \"salesman_id\":0,\r\n" + + " \"firmid\":null,\r\n" + + " \"description\":\"说明\",\r\n" + + " \"createtime\":1595155341,\r\n" + + " \"updatetime\":1595155341,\r\n" + + " \"deletetime\":null,\r\n" + + " \"status\":0\r\n" + + " }\r\n" + + " ]\r\n" + + " } "); + return Result.success(json); + } + + + @RequestMapping("/api/ykjp/information/basisinfo/supplier/getdetails") + public Result getProductDetail(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"data\":[\r\n" + + " {\r\n" + + " \"id\":2,\r\n" + + " \"avatar\":\"\",\r\n" + + " \"code\":\"SP20200719184024\",\r\n" + + " \"name\":\"北京冰河服饰有限公司\",\r\n" + + " \"abbname\":\"\",\r\n" + + " \"contact\":\"程卓\",\r\n" + + " \"phone\":\"13529746799\",\r\n" + + " \"city\":\"北京/北京市/崇文区\",\r\n" + + " \"address\":\"北京市丰台区菜户营58号11032室(太平桥企业集中办公区)\",\r\n" + + " \"fax\":\"\",\r\n" + + " \"mobile\":\"0877262422\",\r\n" + + " \"bank\":\"\",\r\n" + + " \"banknums\":\"\",\r\n" + + " \"term\":21,\r\n" + + " \"identifier\":\"\",\r\n" + + " \"credit\":\"\",\r\n" + + " \"amount\":\"0\",\r\n" + + " \"salesman_id\":0,\r\n" + + " \"firmid\":null,\r\n" + + " \"description\":\"说明\",\r\n" + + " \"createtime\":1595155341,\r\n" + + " \"updatetime\":1595155341,\r\n" + + " \"deletetime\":null,\r\n" + + " \"status\":0\r\n" + + " }\r\n" + + " ]\r\n" + + " } "); + return Result.success(json); + } + + @RequestMapping("/api/ykjp/summary/Purchase/index") + public Result getPurchaseDetail(HttpServletRequest request) { + System.out.println(JSON.toJSONString(HttpRequestUtil.getFromParams(request))); + JSONObject json= JSON.parseObject(" {\r\n" + + " \"data\": {\r\n" + + " \"purchase\": {\r\n" + + " \"totalMoney\": 6661\r\n" + + " },\r\n" + + " \"Retprodcut\": {\r\n" + + " \"totalMoney\": 6662\r\n" + + " },\r\n" + + " \"deliveryPro\": {\r\n" + + " \"totalMoney\": 6663\r\n" + + " },\r\n" + + " \"sellreturn\": {\r\n" + + " \"totalMoney\": 6664\r\n" + + " },\r\n" + + " \"status\": 0\r\n" + + " }\r\n" + + " } "); + return Result.success(json); + } + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/TestController111.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/TestController111.java new file mode 100644 index 000000000..df572029d --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/TestController111.java @@ -0,0 +1,119 @@ +package com.bjc.lcp.api.controller; + +import com.alibaba.druid.pool.DruidDataSource; +import com.bjc.lcp.api.service.DbUtil; +//import com.jfinal.plugin.activerecord.Db; +//import com.jun.plugin.system.entity.SysUser; +//import com.jun.plugin.system.service.SysDictService; +//import com.jun.plugin.system.service.UserService; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.util.HttpRequestUtil; +import com.jun.plugin.common.util.RequestWrapper; +import com.jun.plugin.db.record.Db; +import freemarker.template.TemplateException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Controller +public class TestController111 { + +// @Resource +// SysDictService sysDictService; +// +// @Resource +// UserService userService; + + @GetMapping("/api/genTableSQL/{tableName}") + @ResponseBody + public Result genTableCRUDSQL(HttpServletRequest request, @PathVariable String tableName) throws IOException, TemplateException, SQLException { + System.out.println("Request URI: " + request.getRequestURI()); + + HttpServletRequest requestWrapper = new RequestWrapper((HttpServletRequest) request); + Map param = HttpRequestUtil.getAllParameters(requestWrapper); + + DruidDataSource ds = new DruidDataSource(); + ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); + ds.setUrl( "jdbc:mysql://localhost:3306/db_qixing_bk?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8"); + ds.setUsername("root"); + ds.setPassword(""); + + // 准备数据 + HashMap data = new HashMap<>(); +// String tableName = "test333"; + //data.putAll(GenUtils.getTableData(tableName, ds.getConnection())); + + DbUtil.initDb( DbUtil.MASTER, + "jdbc:mysql://localhost:3306/db_qixing_bk?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8", + "root", ""); + + Map sqlParamDelete = DbUtil.buildSqlParams(data, DbUtil.deleteSQL(data), DbUtil.deleteSQLParams(data),"delete"); +// DbUtil.executeSQL(ds,sqlParamDelete,DbUtil.insertSQL(data)); + Db.use(DbUtil.MASTER).delete(" delete from api_config where path = ? ",new Object[]{sqlParamDelete.get("path")}); + Db.use(DbUtil.MASTER).save("api_config",DbUtil.getPkNames(ds,"api_config"),DbUtil.getTableRecord(ds,"api_config",sqlParamDelete)); + //DbUtil.printSQLParams(data); + + + Map sqlParamSave = DbUtil.buildSqlParams(data, DbUtil.insertSQL(data), DbUtil.insertSQLParams(data),"save"); + Db.use(DbUtil.MASTER).delete(" delete from api_config where path = ? ",new Object[]{sqlParamSave.get("path")}); + Db.use(DbUtil.MASTER).save("api_config",DbUtil.getPkNames(ds,"api_config"),DbUtil.getTableRecord(ds,"api_config",sqlParamSave)); +// DbUtil.executeSQL(ds,sqlParamSave,DbUtil.insertSQL(data)); + + Map sqlParamLoad = DbUtil.buildSqlParams(data, DbUtil.loadSQL(data), DbUtil.loadSQLParams(data),"load"); + Db.use(DbUtil.MASTER).delete(" delete from api_config where path = ? ",new Object[]{sqlParamLoad.get("path")}); + Db.use(DbUtil.MASTER).save("api_config",DbUtil.getPkNames(ds,"api_config"),DbUtil.getTableRecord(ds,"api_config",sqlParamLoad)); +// DbUtil.executeSQL(ds,sqlParamLoad,DbUtil.insertSQL(data)); + + String paramsCount = "[]"; + Map sqlParamCount = DbUtil.buildSqlParams(data, DbUtil.pageListCountSQL(data), paramsCount,"count"); + Db.use(DbUtil.MASTER).delete(" delete from api_config where path = ? ",new Object[]{sqlParamCount.get("path")}); + Db.use(DbUtil.MASTER).save("api_config",DbUtil.getPkNames(ds,"api_config"),DbUtil.getTableRecord(ds,"api_config",sqlParamCount)); +// DbUtil.executeSQL(ds,sqlParamCount,DbUtil.insertSQL(data)); + + + String pageListParams = "[{'name':'pageNumber','type':'int'},{'name':'pageSize','type':'int'}]"; + Map sqlParamPage = DbUtil.buildSqlParams(data, DbUtil.pageListSQL(data), pageListParams,"page"); + Db.use(DbUtil.MASTER).delete(" delete from api_config where path = ? ",new Object[]{sqlParamPage.get("path")}); + Db.use(DbUtil.MASTER).save("api_config",DbUtil.getPkNames(ds,"api_config"),DbUtil.getTableRecord(ds,"api_config",sqlParamPage)); +// DbUtil.executeSQL(ds,sqlParamPage,DbUtil.insertSQL(data)); + + + Map sqlParamUpdate = DbUtil.buildSqlParams(data, DbUtil.updateSQL(data), DbUtil.updateSQLParams(data),"update"); + Db.use(DbUtil.MASTER).delete(" delete from api_config where path = ? ",new Object[]{sqlParamUpdate.get("path")}); + Db.use(DbUtil.MASTER).save("api_config",DbUtil.getPkNames(ds,"api_config"),DbUtil.getTableRecord(ds,"api_config",sqlParamUpdate)); +// DbUtil.executeSQL(ds,sqlParamUpdate,DbUtil.insertSQL(data)); + + //String className = GenUtils.genTemplateStr(data, "${classInfo.className?uncap_first}"); + //List apis = Db.use(DbUtil.MASTER).query(" select id,path from api_config where path like ? ",new Object[]{"%"+className+"%"}); + //return new Result(200,"脚本接口初始化成功!",apis); + return null; + } + @GetMapping("/api/test111/test111") + @ResponseBody + public String test111333(HttpServletRequest request){ + System.out.println("Request URI: " + request.getRequestURI()); + return "111"; + } + @GetMapping("/abc/test111") + @ResponseBody + public String test111333abc(HttpServletRequest request){ + System.out.println("Request URI: " + request.getRequestURI()); + return "111abc"; + } + @GetMapping("/api/test111/test222") + public String test222333(HttpServletRequest request){ + System.out.println("Request URI: " + request.getRequestURI()); + return "thymeleaf"; + } + + + + } diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/TestGroovy.groovy b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/TestGroovy.groovy new file mode 100644 index 000000000..f7ef8c627 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/controller/TestGroovy.groovy @@ -0,0 +1,21 @@ +//package com.bjc.lcp.core.api.controller; +// +//import com.alibaba.fastjson2.JSON +//import com.alibaba.fastjson2.TypeReference +// +///** +// * groove class +// */ +//class TestGroovy { +// +// void print() { +// System.out.println("hello word!!!!"); +// } +// +// List printArgs(String str1, String str2, String str3) { +// String jsonString = "[\""+str1+"\",\""+str2+"\",\""+str3+"\"]"; +// return JSON.parseObject(jsonString, new TypeReference>() {}); +// } +// +// +//} \ No newline at end of file diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/DbUtil.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/DbUtil.java new file mode 100644 index 000000000..8ce75e60e --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/DbUtil.java @@ -0,0 +1,283 @@ +package com.bjc.lcp.api.service; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.db.meta.MetaUtil; +import cn.hutool.db.meta.Table; +import com.alibaba.fastjson2.JSON; +//import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Record; +//import com.jfinal.plugin.druid.DruidPlugin; +import com.jun.plugin.common.generator.GeneratorUtil; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Record; +import com.jun.plugin.groovy.util.JdbcUtil; +import com.jun.plugin.sql.SqlEngine; +import com.jun.plugin.sql.SqlMeta; +import freemarker.template.TemplateException; +import lombok.extern.slf4j.Slf4j; + +import javax.sql.DataSource; +import java.io.IOException; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class DbUtil { + + public static String MASTER = "master"; + + + public static Object executeSQL(DataSource ds, Map sqlParam, String deleteSQL) + throws SQLException { + SqlMeta sqlMeta = SqlEngine.getEngine().parse(deleteSQL, sqlParam); + Object datas = SqlEngine.executeSql(ds.getConnection(), sqlMeta.getSql(), sqlMeta.getJdbcParamValues()); + System.err.println(JSON.toJSONString(datas)); + return datas; + } + + public static void initDb(String configName, String url, String username, String password) { + Boolean isExtsis = true; + try { + Db.use(configName); + } catch (IllegalArgumentException e) { + isExtsis = false; + log.warn(e.getMessage()); + } + if( !isExtsis ){ + Db.init(url,username,password); +// DruidPlugin dp = new DruidPlugin(url, username, password); +// ActiveRecordPlugin arp = new ActiveRecordPlugin(configName, dp); +// arp.setDevMode(true); +// arp.setShowSql(true); +// dp.start(); +// arp.start(); + log.warn("Config have bean created by configName: {}",configName); + } + } + + public static String updateSQL(HashMap data) throws IOException, TemplateException { + String updateSQL = " UPDATE ${classInfo.tableName}\r\n" + " \r\n" + + " <#list classInfo.fieldList as fieldItem >\r\n" + + " <#if fieldItem.columnName != \"id\" && fieldItem.columnName != \"AddTime\" && fieldItem.columnName != \"UpdateTime\" >\r\n" + + " ${fieldItem.columnName} = ${r\"#{\"}${fieldItem.fieldName}${r\"}\"}<#if fieldItem_has_next>,${r\"\"}\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " WHERE " + + " <#list classInfo.pkfieldList as fieldItem >\r\n" + + " <#if fieldItem.isPrimaryKey != false > " + + " ${fieldItem.columnName} = ${r\"#{\"}${fieldItem.fieldName}${r\"}\"} <#if fieldItem_has_next>AND " + + " " + + " <#if fieldItem.isPrimaryKey == false > " + + " ${fieldItem.columnName} = ${r\"#{\"}${fieldItem.fieldName}${r\"}\"} <#if fieldItem_has_next>AND ${r\"\"} " + + " " + + " \r\n"; + return GeneratorUtil.genTemplateStr(data, "update", updateSQL); + } + public static String updateSQLParams(HashMap data) throws IOException, TemplateException { + String paramsSQLTemplate = " [ \r\n" + + " <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>\r\n" + + " <#list classInfo.fieldList as fieldItem >\r\n" +// + " <#if fieldItem.columnName != \"id\" >\r\n" + + " {'name':'${fieldItem.fieldName}','type':'${fieldItem.columnType}','notNull':${fieldItem.notNull?string('true', 'false')},'maxLength':${fieldItem.columnSize?c}}<#if fieldItem_has_next>, \r\n" +// + " \r\n" + + " \r\n" + + " \r\n" + + " ] "; + String params = GeneratorUtil.genTemplateStr(data, paramsSQLTemplate); + return params; + } + + + public static Map buildSqlParams(HashMap data, String sql, + String params, String cuudFlag) throws IOException, TemplateException { + Map sqlParam = new HashMap(); + String className = GeneratorUtil.genTemplateStr(data, "${classInfo.className?uncap_first}"); + String path = "/api/"+GeneratorUtil.genTemplateStr(data, "${classInfo.className?uncap_first}")+"/"+cuudFlag; + sqlParam.put("id", IdUtil.fastSimpleUUID()); + sqlParam.put("refs", DbUtil.MASTER); + sqlParam.put("path", path); + sqlParam.put("name", path); + // sqlParam.put("method", "method-value"); + sqlParam.put("params", params); +// sqlParam.put("interfaceId", className + "-"+cuudFlag); + sqlParam.put("bean_name", className + "-"+cuudFlag); + sqlParam.put("datasource_id", "local"); + sqlParam.put("script_type", "SQL"); + sqlParam.put("script_content", sql); + sqlParam.put("status", "ENABLE"); + sqlParam.put("group_name", className); + sqlParam.put("sort", "0"); + sqlParam.put("extend_info", "extendInfo-value"); + sqlParam.put("open_trans", "1"); + sqlParam.put("relutl_type", null); + sqlParam.put("creator", "admin"); + sqlParam.put("created_time", DateUtil.now()); + sqlParam.put("update_time", DateUtil.now()); + sqlParam.put("last_update", "admin"); + return sqlParam; + } + + + + public static String insertSQL(HashMap data) throws IOException, TemplateException { + String insertSQL = " INSERT INTO ${classInfo.tableName}\r\n" + + " \r\n" + + " <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>\r\n" + + " <#list classInfo.fieldList as fieldItem >\r\n" + + " <#if fieldItem.columnName != \"id\" >\r\n" + + " \r\n" + + " ${fieldItem.columnName}<#if fieldItem_has_next>,\r\n" + + " ${r\"\"}\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>\r\n" + + " <#list classInfo.fieldList as fieldItem >\r\n" + + " <#if fieldItem.columnName != \"id\" >\r\n" + + " <#--<#if fieldItem.columnName=\"addtime\" || fieldItem.columnName=\"updatetime\" >\r\n" + + " ${r\"\"}\r\n" + + " NOW()<#if fieldItem_has_next>,\r\n" + + " ${r\"\"}\r\n" + + " <#else>-->\r\n" + + " \r\n" + + " ${r\"#{\"}${fieldItem.fieldName}${r\"}\"}<#if fieldItem_has_next>,\r\n" + + " ${r\"\"}\r\n" + + " <#---->\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " "; + return GeneratorUtil.genTemplateStr(data, "insert", insertSQL); + } + + public static String insertSQLParams(HashMap data) throws IOException, TemplateException { + String paramsSQLTemplate = " [ \r\n" + + " <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>\r\n" + + " <#list classInfo.fieldList as fieldItem >\r\n" + + " <#if fieldItem.columnName != \"id\" >\r\n" + + " {'name':'${fieldItem.fieldName}','type':'${fieldItem.columnType}','notNull':${fieldItem.notNull?string('true', 'false')},'maxLength':${fieldItem.columnSize?c}}<#if fieldItem_has_next>, \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " ] "; + String params = GeneratorUtil.genTemplateStr(data, paramsSQLTemplate); + return params; + } + + public static String pageListSQL(HashMap data) throws IOException, TemplateException { + String pageListSQL = " SELECT <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> \r\n" + + " <#list classInfo.fieldList as fieldItem > \r\n" + + " ${fieldItem.columnName} as ${fieldItem.fieldName} <#if fieldItem_has_next>, \r\n" + + " \r\n" + " \r\n" + + " FROM ${classInfo.tableName} \r\n" + + " LIMIT ${r\"#{pageNumber}\"}, ${r\"#{pageSize}\"} "; + return GeneratorUtil.genTemplateStr(data, "pageListSQL", pageListSQL); + } + + + public static String pageListCountSQL(HashMap data) throws IOException, TemplateException { + String pageListCountSQL = " SELECT count(1)\r\n" + + " FROM ${classInfo.tableName} "; + return GeneratorUtil.genTemplateStr(data, "pageListCountSQL", pageListCountSQL); + } + + + + public static String loadSQL(HashMap data) throws IOException, TemplateException { + String loadSQL = " SELECT <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>\r\n" + + " <#list classInfo.fieldList as fieldItem >\r\n" + + " ${fieldItem.columnName} as ${fieldItem.fieldName} <#if fieldItem_has_next>,\r\n" + + " \r\n" + + " \r\n" + + " FROM ${classInfo.tableName}\r\n" + + " WHERE " + + " <#list classInfo.pkfieldList as fieldItem >\r\n" + + " <#if fieldItem.isPrimaryKey != false > " + + " ${fieldItem.columnName} = ${r\"#{\"}${fieldItem.fieldName}${r\"}\"} <#if fieldItem_has_next>AND " + + " " + + " <#if fieldItem.isPrimaryKey == false > " + + " ${fieldItem.columnName} = ${r\"#{\"}${fieldItem.fieldName}${r\"}\"} <#if fieldItem_has_next>AND ${r\"\"} " + + " " + + " \r\n"; + return GeneratorUtil.genTemplateStr(data, "load", loadSQL); + } + public static String loadSQLParams(HashMap data) throws IOException, TemplateException { + String paramsSQLTemplate = " [ \r\n" + + "<#list classInfo.pkfieldList as fieldItem >" + + " <#if fieldItem.isPrimaryKey != false >" + + " {'name':'${fieldItem.fieldName}','type':'${fieldItem.columnType}','notNull':${fieldItem.notNull?string('true', 'false')},'maxLength':${fieldItem.columnSize?c}}<#if fieldItem_has_next>, \r\n" + + "" + + "" + + " ] "; + String params = GeneratorUtil.genTemplateStr(data, paramsSQLTemplate); + return params; + } + + @SuppressWarnings("unused") + public static String deleteSQL(HashMap data) throws IOException, TemplateException, SQLException { + String deleteSQLTemplate = " DELETE FROM ${classInfo.tableName} \r\n" + + " WHERE " + + " <#list classInfo.pkfieldList as fieldItem >\r\n" + + " <#if fieldItem.isPrimaryKey != false > " + + " ${fieldItem.columnName} = ${r\"#{\"}${fieldItem.fieldName}${r\"}\"} <#if fieldItem_has_next>AND " + + " " + + " <#if fieldItem.isPrimaryKey == false > " + + " ${fieldItem.columnName} = ${r\"#{\"}${fieldItem.fieldName}${r\"}\"} <#if fieldItem_has_next>AND ${r\"\"} " + + " " + + " \r\n"; + String deleteSQL = GeneratorUtil.genTemplateStr(data, deleteSQLTemplate); + return deleteSQL; + } + + public static String deleteSQLParams(HashMap data) throws IOException, TemplateException { + String paramsSQLTemplate = " [ \r\n" + + "<#list classInfo.pkfieldList as fieldItem >" + + " <#if fieldItem.isPrimaryKey != false >" + + " {'name':'${fieldItem.fieldName}','type':'${fieldItem.columnType}','notNull':${fieldItem.notNull?string('true', 'false')},'maxLength':${fieldItem.columnSize?c}}<#if fieldItem_has_next>, \r\n" + + "" + + "" + + " ] "; + String params = GeneratorUtil.genTemplateStr(data, paramsSQLTemplate); + return params; + } + + + public static String printSQLParams(HashMap data) + throws IOException, TemplateException, SQLException { + String deleteSQLTemplate = " Map sqlParam = new HashMap();\r\n" + + "<#list classInfo.pkfieldList as fieldItem >" + "<#if fieldItem.isPrimaryKey != false >" + + " sqlParam.put(\"${fieldItem.fieldName}\", \"${fieldItem.fieldName}-value\");\r\n" + "" + + ""; + GeneratorUtil.genTemplateStr(data, "delete", deleteSQLTemplate); + deleteSQLTemplate = " Map sqlParam = new HashMap();\r\n" + + "<#list classInfo.fieldList as fieldItem >" + "<#if fieldItem.isPrimaryKey == false >" + + " sqlParam.put(\"${fieldItem.fieldName}\", \"${fieldItem.fieldName}-value\");\r\n" + "" + + ""; + GeneratorUtil.genTemplateStr(data, "delete", deleteSQLTemplate); + return null; + } + + + public static Record getTableRecord(DataSource ds, String tableName, Map params){ + Record record = new Record(); + Table table = MetaUtil.getTableMeta(ds,tableName); + table.getColumns().forEach(c->{ + record.set(c.getName(), MapUtil.getStr(params,c.getName())); + }); + return record; + } + + public static String getPkNames(DataSource ds, String tableName){ + Table table = MetaUtil.getTableMeta(ds,tableName); + return String.join(",",table.getPkNames()); + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/GenTableCRUDSQLComponent.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/GenTableCRUDSQLComponent.java new file mode 100644 index 000000000..2bf02074a --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/GenTableCRUDSQLComponent.java @@ -0,0 +1,109 @@ +package com.bjc.lcp.api.service; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.db.meta.MetaUtil; +import cn.hutool.db.meta.Table; +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson2.JSON; +//import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +//import com.jfinal.plugin.activerecord.Db; +//import com.jfinal.plugin.activerecord.Record; +//import com.jfinal.plugin.druid.DruidPlugin; +import com.jun.plugin.common.Result; +import com.jun.plugin.common.base.interfaces.IExecutor; +import com.jun.plugin.db.record.Db; +import com.jun.plugin.db.record.Record; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +/** + * 组件ID:BAS000000000100 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: 参 数1:要执行的SQL语句 参 数2:sql参数 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_groovy,测试Jfinal-CURD-保存在庫裡面 + */ +public class GenTableCRUDSQLComponent implements IExecutor> { + + public static void initDb(String configName, String url, String username, String password) { + Db.init(url,username,password); +// DruidPlugin dp = new DruidPlugin(url, username, password); +// ActiveRecordPlugin arp = new ActiveRecordPlugin(configName, dp); +// // 与 jfinal web 环境唯一的不同是要手动调用一次相关插件的start()方法 +// dp.start(); +// arp.start(); + } + + @Override + public Result execute(Map params) throws Exception { + // 校验组件参数+校验上下文参数,TODO +// if (!checkMinParaCountAndSetRespCode(3)) { +// return ERROR; +// } + // 初始化数据库 + String configName = "A000001"; + initDb(configName, SpringUtil.getProperty("spring.datasource.url"), + SpringUtil.getProperty("spring.datasource.username"), + SpringUtil.getProperty("spring.datasource.password")); + + DataSource ds = Db.use(configName).getConfig().getDataSource(); + + String tableName = MapUtil.getStr(params, "tableName"); + Table tableMeta = MetaUtil.getTableMeta(ds, tableName); + + // 执行SQL语句 eq: delete from test where id = ? + Object[] paras = MapUtil.getStr(params, "sParas").split(","); // sql语句参数清单 eq: id (多个逗号分隔) + String sResultPath = MapUtil.getStr(params, "sResult");// 执行SQL语句处理记录数存放标签 eq: 1 (更新的条数) + + try { + Object[] paramVal = paras;// { "abc", "123" }; + + // 测试代码--begin + // ************************************************************************* + Object[] sqlparams = { 22 }; + List datas = Db.use(configName) + .find("select id,title,content,remark,field_name_test from test where id > ?", sqlparams); + System.out.println(JSON.toJSONString(datas)); + + Object[] sqlUparams = { 25 }; + Object[] paras1 = { "id" }; + int ucount = Db.use(configName).update("update test set content = content + '-666' where id = ?", + sqlUparams); + System.out.println(JSON.toJSONString(ucount)); + + Object[] sqlDparams = { 26 }; + int dcount = Db.use(configName).update("delete from test where id = ?", sqlDparams); + System.out.println(JSON.toJSONString(dcount)); + +// Object[] sqliParams = Arrays.asList(10,"aaa","bbb","cccc","dddd").toArray() ; + Object[] sqliParams = new Object[5]; + sqliParams[0] = 10; + sqliParams[1] = "aaa"; + sqliParams[2] = "bbb"; + sqliParams[3] = "cccc"; + sqliParams[4] = "dddd"; + int icount = Db.use(configName).update( + "insert into test (id, title,content,remark,field_name_test ) VALUES ( ?,?, ?, ?, ? ) ", + sqliParams); + System.out.println(JSON.toJSONString(icount)); + // 测试代码--end + // ************************************************************************* + + } catch (Exception e) { + int errorCode = ((SQLException) e).getErrorCode(); + // if (errorCode == -803) { + if (e.getMessage().matches(".*Duplicate.*PRIMARY.*") || errorCode == -803 || errorCode == 1062) { + e.printStackTrace(); + throw new Exception("数据库主键冲突!"); + } else { + e.printStackTrace(); + throw new Exception("数据库操作出错!"); + } + } + return Result.success(); + } + + +} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/HttpMappingExecutor.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/HttpMappingExecutor.java new file mode 100644 index 000000000..a234ccea7 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/HttpMappingExecutor.java @@ -0,0 +1,276 @@ +//package com.bjc.lcp.api.service; +// +//import cn.hutool.core.bean.BeanUtil; +//import cn.hutool.extra.spring.SpringUtil; +//import com.alibaba.druid.pool.DruidPooledConnection; +//import com.alibaba.fastjson2.JSON; +//import com.alibaba.fastjson2.JSONObject; +//import com.gitthub.wujun728.engine.common.model.ApiConfig; +//import com.gitthub.wujun728.engine.common.model.ApiDataSource; +//import com.gitthub.wujun728.engine.common.model.ApiSql; +//import com.gitthub.wujun728.engine.groovy.cache.GroovyInnerCache; +//import com.gitthub.wujun728.engine.mapping.http.RequestMappingExecutor; +//import com.gitthub.wujun728.engine.mapping.http.cache.IApiConfigCache; +//import com.gitthub.wujun728.engine.plugin.CachePlugin; +//import com.gitthub.wujun728.engine.plugin.PluginManager; +//import com.gitthub.wujun728.engine.plugin.TransformPlugin; +//import com.gitthub.wujun728.engine.service.ApiService; +//import com.gitthub.wujun728.engine.util.JdbcUtil; +//import com.gitthub.wujun728.mybatis.sql.SqlMeta; +//import com.jun.plugin.common.Result; +//import com.jun.plugin.common.base.interfaces.AbstractExecutor; +//import com.jun.plugin.common.base.interfaces.IExecutor; +//import com.jun.plugin.common.exception.BusinessException; +//import com.jun.plugin.common.util.DbPoolManager; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.lang3.StringUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.autoconfigure.web.ServerProperties; +//import org.springframework.stereotype.Component; +//import org.springframework.util.CollectionUtils; +// +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.io.PrintWriter; +//import java.sql.Connection; +//import java.sql.SQLException; +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.List; +//import java.util.Map; +// +///** +// * 将存储的API注册为request mapping,并且提供对入参及存储的执行脚本进行解析。 输出解析后的最终脚本提供给脚本执行器`@Link +// * DataSourceDialect`。然后对结果进行封装返回 +// */ +//@SuppressWarnings({ "rawtypes" }) +//@Slf4j +//@Component("HttpMappingExecutor") +//public class HttpMappingExecutor extends RequestMappingExecutor +///*implements ICompentExecutor, ApplicationContextAware, InitializingBean */{ +// +// @Autowired +// private ApiService apiService; +// +// @Autowired +// private IApiConfigCache apiInfoCache; +// +// @Autowired +// private ServerProperties serverProperties; +// +// private List bodyMethods = Arrays.asList("POST", "PUT", "PATCH"); +// +// /** +// * 默认执行逻辑 +// */ +// public void process(HttpServletRequest request,HttpServletResponse response) throws Throwable { +//// this.request = request; +//// this.response = response; +// log.info("HttpMappingExecutor execute begin "); +//// R r = null ; +// Object data = null; +// String servletPath = request.getRequestURI(); +// PrintWriter out = null; +// try { +// out = response.getWriter(); +// // 执行SQL逻辑 ***************************************************************************************************** +// // 校验接口是否存在 +// ApiConfig config = apiInfoCache.get(servletPath); +// if (config == null) { +// response.setStatus(HttpServletResponse.SC_NOT_FOUND); +// out.append(JSON.toJSONString(Result.fail("Api not exists"))); +// } +// switch (config.getScriptType()) { +// case "SQL": +// data = doSQLProcess(config, request, response); +// break; +// case "Class": +// data = doGroovyProcess(config, request, response); +// break; +// case "Groovy": +// data = doGroovyProcess(config, request, response); +// break; +// case "Jython": // TODO +// data = doGroovyProcess(config, request, response); +// break; // TODO +// case "JavaScript": // TODO +// data = doGroovyProcess(config, request, response); +// case "Jruby":// TODO +// data = doGroovyProcess(config, request, response); +// break; +// default: +// break; +// } +// out.append(JSON.toJSONString(data)); +// } catch (Exception e) { +// response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); +// out.append(JSON.toJSONString(Result.fail(e.toString()))); +// log.error(e.toString(), e); +// } finally { +// if (out != null) +// out.close(); +// } +// log.info("HttpMappingExecutor execute end "); +// } +// +// +// +// public Object doGroovyProcess(ApiConfig config, HttpServletRequest request, HttpServletResponse response) { +// String beanName = GroovyInnerCache.getByPath(config.getPath()); +// //GroovyInfo groovyInfo = GroovyInnerCache.getGroovyInfoByPath(config.getPath()); +// Map params = getParameters(request, config); +// Object beanObj = SpringUtil.getBean(beanName); +// try { +// if(beanObj instanceof IExecutor){ +// IExecutor bean = (IExecutor) beanObj; +// return bean.execute(params); +// }else if(beanObj instanceof AbstractExecutor){ +// AbstractExecutor bean = (AbstractExecutor) beanObj; +// bean.init(request,response); +// return bean.execute(params); +// } +// } catch (BusinessException e) { +// return Result.fail(e.getMessage()); +// } catch (Exception e) { +// e.printStackTrace(); +//// if(beanObj instanceof IExecutor){ +//// IExecutor bean = (IExecutor) beanObj; +//// return bean.rollback(params); +//// }else if(beanObj instanceof AbstractExecutor){ +//// AbstractExecutor bean = (AbstractExecutor) beanObj; +//// bean.init(request,response); +//// return bean.rollback(params); +//// } +// return e.getMessage(); +// } +// return "ERROR:执行错误,请检查执行日志并捕获并处理异常!"; +// } +// +// public Object doSQLProcess(ApiConfig config, HttpServletRequest request, HttpServletResponse response) { +// try { +// ApiDataSource ds = apiService.getDatasource(config.getDatasourceId()); +// if (ds == null || ds.getId()==null) { +// response.setStatus(500); +// return Result.fail("Datasource not exists!"); +// } +// Map params = getParameters(request, config); +//// if(MapUtil.getStr(params,"pageNumber")!=null && MapUtil.getStr(params,"pageSize")!=null ){ +//// Integer size = Convert.convert(Integer.class, params.get("pageSize")); +//// Integer page = Convert.convert(Integer.class, params.get("pageNumber")); +//// params.put("pageSize", size); +//// params.put("pageNumber", size*(page-1)); +//// } +// List sqlList = config.getSqlList(); +// if (CollectionUtils.isEmpty(params) && !CollectionUtils.isEmpty(sqlList) && JSON.toJSONString(sqlList).contains("#")) { +// return Result.fail("Request parameter is not exists(请求入参不能为空)!"); +// } +// DruidPooledConnection connection = DbPoolManager.init(ds.getName(),ds.getUrl(),ds.getUsername(),ds.getPassword(),ds.getDriver()).getConnection(); +// // 是否开启事务 +// boolean flag = config.getOpenTrans() == 1 ? true : false; +// // 执行sql +// List dataList = executeSql(connection, sqlList, params, flag); +// // 执行数据转换 +// for (int i = 0; i < sqlList.size(); i++) { +// ApiSql apiSql = sqlList.get(i); +// Object data = dataList.get(i); +// // 如果此单条sql是查询类sql,并且配置了数据转换插件 +// if (data instanceof Iterable && StringUtils.isNotBlank(apiSql.getTransformPlugin())) { +// log.info("transform plugin execute"); +// List sourceData = (List) (data); // 查询类sql的返回结果才可以这样强制转换,只有查询类sql才可以配置转换插件 +// TransformPlugin transformPlugin = (TransformPlugin) PluginManager.getPlugin(apiSql.getTransformPlugin()); +// Object resData = transformPlugin.transform(sourceData, apiSql.getTransformPluginParams()); +// dataList.set(i, resData);// 重新设置值 +// } +// } +// Object res = dataList; +// // 如果只有单条sql,返回结果不是数组格式 +// if (dataList.size() == 1) { +// res = dataList.get(0); +// } +// // 设置缓存 +// if (StringUtils.isNoneBlank(config.getCachePlugin())) { +// CachePlugin cachePlugin = (CachePlugin) PluginManager.getPlugin(config.getCachePlugin()); +// ApiConfig apiConfig = new ApiConfig(); +// BeanUtil.copyProperties(config,apiConfig, false); +// cachePlugin.set(apiConfig, params, res); +// } +// return res; +// } catch (Exception e) { +// e.printStackTrace(); +// throw new RuntimeException(e.getMessage()); +// } +// } +// +// +// public List executeSql(Connection connection, List sqlList, Map sqlParam, +// boolean flag) { +// List dataList = new ArrayList<>(); +// SqlMeta _sqlMeta = null; +// try { +// if (flag) +// connection.setAutoCommit(false); +// else +// connection.setAutoCommit(true); +// for (ApiSql apiSql : sqlList) { +// SqlMeta sqlMeta = JdbcUtil.getEngine().parse(apiSql.getSqlText(), sqlParam); +// _sqlMeta = sqlMeta; +// Object data = JdbcUtil.executeSql(connection, sqlMeta.getSql(), sqlMeta.getJdbcParamValues()); +// log.info("SQL执行-,当前执行的SQL:{},当前执行的SQL参数:{}",_sqlMeta.getSql(),_sqlMeta.getJdbcParamValues()); +// dataList.add(data); +// } +// if (flag) +// connection.commit(); +// return dataList; +// } catch (Exception e) { +// try { +// if (flag) +// connection.rollback(); +// if(_sqlMeta !=null) { +// log.error("SQL执行失败,当前执行的SQL:{},当前执行的SQL参数:{}",_sqlMeta.getSql(),_sqlMeta.getJdbcParamValues()); +// } +// } catch (SQLException ex) { +// ex.printStackTrace(); +// } +// if(_sqlMeta !=null) { +// throw new RuntimeException(e +";\n\t SQL执行失败,当前执行的SQL:["+_sqlMeta.getSql()+"],当前执行的SQL参数:"+_sqlMeta.getJdbcParamValues()+""); +// }else { +// throw new RuntimeException(e); +// } +// } finally { +// if (connection != null) { +// try { +// connection.close(); +// } catch (SQLException e) { +// e.printStackTrace(); +// } +// } +// } +// } +// +// +//// @Override +//// public void afterPropertiesSet() throws Exception { +////// GroovyScriptFactory.setGroovyParserEngine(this); +//// } +//// +//// @Override +//// public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { +//// this.applicationContext = applicationContext; +//// } +//// +//// +//// +//// @Override +//// public Result rollback(Map parms) { +//// // TODO Auto-generated method stub +//// return null; +//// } +//// +//// +//// @Override +//// public String bascName() { +//// return null; +//// } +// +// +//} diff --git a/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/TestUploadService.java b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/TestUploadService.java new file mode 100644 index 000000000..b4fff3d98 --- /dev/null +++ b/jun_api_online_groovy/src/main/java/com/bjc/lcp/api/service/TestUploadService.java @@ -0,0 +1,56 @@ +package com.bjc.lcp.api.service; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.jun.plugin.common.base.interfaces.AbstractExecutor; +import com.jun.plugin.common.base.interfaces.IExecutor; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Map; + +/** + * 组件ID:BAS000000000100 + * 描 述:执行指定的SQL语句(insert/update/delete/select语句) + * 版本历史:1.0.0版 参数说明: + * 参 数1:要执行的SQL语句 + * 参 数2:sql参数 + * 参 数3:执行SQL语句处理记录数存放标签 + * + * 说明:需要把该代码放进DB,api_config,测试JSONOBject对象直接返回-保存在庫裡面 + */ +public class TestUploadService extends AbstractExecutor> implements IExecutor> { + + @Override + public JSONObject execute(Map params) { + HttpServletRequest request = (HttpServletRequest) params.get("_request"); + super.parameters = params; + String servletPath = (String) params.get("path"); + System.out.println(JSON.toJSONString(params)); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + MultipartFile file = multipartRequest.getFile("file"); // 通过参数名获取指定文件 + try { + FileUtil.writeBytes(file.getBytes(), "D:/abc/"+RandomUtil.randomInt()+file.getOriginalFilename()); + } catch (IOException e) { + throw new RuntimeException(e); + } + String bizid = multipartRequest.getParameter("bizid"); + String fileName = file.getOriginalFilename(); + + JSONObject json = new JSONObject(); + json.put("fileName", fileName); + json.put("bizid", getPara("bizid")); + json.put("filePaht", bizid); + return json; + } + +// @Override +// public JSONObject rollback(Map parms) { +// return null; +// } + +} diff --git a/jun_api_online_groovy/src/main/resources/application-sqlite.yml b/jun_api_online_groovy/src/main/resources/application-sqlite.yml new file mode 100644 index 000000000..a43ec1e6f --- /dev/null +++ b/jun_api_online_groovy/src/main/resources/application-sqlite.yml @@ -0,0 +1,14 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: org.sqlite.JDBC + druid: + # 主库数据源 + master: + # 发布后 + # url: jdbc:sqlite:./sqlite/code-generator.db + # 开发时 + url: jdbc:sqlite::resource:static/sqlite/code-generator.db + username: root + password: password \ No newline at end of file diff --git a/jun_api_online_groovy/src/main/resources/application-test.yml b/jun_api_online_groovy/src/main/resources/application-test.yml new file mode 100644 index 000000000..988437b9a --- /dev/null +++ b/jun_api_online_groovy/src/main/resources/application-test.yml @@ -0,0 +1,86 @@ +spring: + redis: + host: localhost # Redis服务器地址 + database: 0 # Redis数据库索引(默认为0) + port: 6379 # Redis服务器连接端口 + password: # Redis服务器连接密码(默认为空) + jedis: + pool: + max-active: 8 # 连接池最大连接数(使用负值表示没有限制) + max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-idle: 8 # 连接池中的最大空闲连接 + min-idle: 0 # 连接池中的最小空闲连接 + timeout: 3000 # 连接超时时间(毫秒 + # mysql + datasource: + type: com.alibaba.druid.pool.DruidDataSource + #MySQL配置 + driverClassName: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/db_qixing_bk?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8 + username: root + password: ENC(KX2tfUq8cZG3IXeAwZgk5w==) + #oracle配置 + # driverClassName: oracle.jdbc.OracleDriver + # url: jdbc:oracle:thin:@47.100.206.162:1521:xe + # username: renren + # password: 123456 + #SQLServer配置 + # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver + # url: jdbc:sqlserver://192.168.10.10:1433;DatabaseName=renren_fast + # username: sa + # password: 123456 + #PostgreSQL配置 + # driverClassName: org.postgresql.Driver + # url: jdbc:postgresql://192.168.10.10:5432/renren_fast + # username: postgres + # password: 123456 + + groovy-api: +# servicename: jun-engine-api +# enabled: true +# context: /api +# api_config: api_config +# gateway: ~ +# config: +# sql: sql.xml +# datasource: datasource.xml +# service-title: API平台 +# file-path: ~ +# datasource: +# dbtype: +# url: +# username: +# password: +# class-model: +# transcation: true +# sql-model: +# find-one-suffix: /first +# pager-suffix: /page +# count-suffix: /count + + +filepath: "D:\\files\\" +file: + #文件上传目录 绝对路径 末尾请加 / + path: D:/files/ #windows + #path: /home/data/files/ #linux + #文件预览、下载的url, 末尾请勿加 / + url: http://qixing.vip321.vip/files + qiniuAccessKey: ts0n9OF16ekFkDkZTTlpmyPI-tP3HKQDyw_GR4o2 + qiniuBucketName: qixing-files + qiniuDomain: http://qiniu.vip321.vip + qiniuPrefix: upload + qiniuSecretKey: c-OjjwV3ZgzCQwxc6W_bsTFKuDg8qeyqohyJU0RL + type: 1 + + +# AES密码加密私钥(Base64加密) +encryptAESKey: V2FuZzkyNjQ1NGRTQkFQSUpXVA== +# JWT认证加密私钥(Base64加密) +encryptJWTKey: U0JBUElKV1RkV2FuZzkyNjQ1NA== +# AccessToken过期时间-5分钟-5*60(秒为单位) +accessTokenExpireTime: 300 +# RefreshToken过期时间-30分钟-30*60(秒为单位) +refreshTokenExpireTime: 1800 +# Shiro缓存过期时间-5分钟-5*60(秒为单位)(一般设置与AccessToken过期时间一致) +shiroCacheExpireTime: 300 \ No newline at end of file diff --git a/jun_api_online_groovy/src/main/resources/application.yml b/jun_api_online_groovy/src/main/resources/application.yml new file mode 100644 index 000000000..f98a5c985 --- /dev/null +++ b/jun_api_online_groovy/src/main/resources/application.yml @@ -0,0 +1,77 @@ +# 端口 +server: + port: 8888 + http2: + enabled: true + +spring: + profiles: + active: test + mvc: + throw-exception-if-no-handler-found: true + hidden-method: + filter: + enabled: true + resources: + add-mappings: false + application: + name: groovy_api_service + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + # 文件大小限制 + servlet: + multipart: + max-file-size: 10MB + max-request-size: 100MB + main: + allow-bean-definition-overriding: true + # redis token信息 + redis: + key: + prefix: + userToken: "user:token:" + passwordError: "user:password:error:" + permissionRefresh: "user:token:permissionRefresh:" + expire: + userToken: 604800 # 7天 7*24*3600 + passwordError: 3600 # 一个小时 + permissionRefresh: 604800 # 7天 7*24*3600 + allowMultipleLogin: true # 允许多处登陆 + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath:mapper/${project.database}/**/*.xml,classpath:mapper/*.xml + global-config: + db-config: + logic-delete-value: 0 + logic-not-delete-value: 1 + logic-delete-field: deleted + +#使用代码生成模块时 指定要生成的表存在于哪种数据库,可选值有【mysql、oracle、sqlServer】 +project: + database: mysql + datasource: + url: ${spring.datasource.url} + driver-class-name: ${spring.datasource.driver-class-name} + username: ${spring.datasource.username} + password: + groovy-api: + enable: true + servicename: jun-engine-api + context: /api + datasource: + dbtype: ${project.database} + url: ${spring.datasource.url} + username: ${spring.datasource.username} + password: + api_config: api_config + +jasypt: + algorithm: PBEWithMD5AndDES + encryptor: + password: 123456@@ + +shiro: + enable: false diff --git a/jun_api_online_groovy/src/main/resources/conf/server.xml b/jun_api_online_groovy/src/main/resources/conf/server.xml new file mode 100644 index 000000000..f4ad219d7 --- /dev/null +++ b/jun_api_online_groovy/src/main/resources/conf/server.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/jun_api_online_groovy/src/main/resources/logback-spring.xml b/jun_api_online_groovy/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..82058f74c --- /dev/null +++ b/jun_api_online_groovy/src/main/resources/logback-spring.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${LOG_PATH}/${LOG_FILE} + + ${FILE_LOG_PATTERN} + + + ${LOG_PATH}/${LOG_HISTORY} + 30 + + + + + + + + 0 + 500 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_api_online_groovy/src/main/resources/templates/thymeleaf.html b/jun_api_online_groovy/src/main/resources/templates/thymeleaf.html new file mode 100644 index 000000000..6fb2529e9 --- /dev/null +++ b/jun_api_online_groovy/src/main/resources/templates/thymeleaf.html @@ -0,0 +1 @@ +

HWLLOW 111 222 3333

\ No newline at end of file diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/Tester.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/Tester.java new file mode 100644 index 000000000..0a08682ea --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/Tester.java @@ -0,0 +1,23 @@ +package com.jun.plugin; + +import com.bjc.lcp.ApiServiceApplication; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * 单元测试 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ApiServiceApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class Tester { + + @Test + public void test() { + + } +} + + + diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyAutoBuildClassUtils.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyAutoBuildClassUtils.java new file mode 100644 index 000000000..1ff2c7e49 --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyAutoBuildClassUtils.java @@ -0,0 +1,52 @@ +package com.jun.plugin.groovy; + +import groovy.lang.GroovyClassLoader; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +/** + * 使用groovy将一段代码动态构造成一个类 + */ +public class GroovyAutoBuildClassUtils { + /** + * 缓存Class类对象 + */ + private Map> cache = new HashMap<>(); + /** + * 缓存代码 + */ + private Map codeCache = new HashMap<>(); + + private GroovyClassLoader classLoader; + + public GroovyAutoBuildClassUtils() { + //初始化GroovyClassLoader类加载器 + classLoader = new GroovyClassLoader(); + } + + /** + * 使用groovy将一段代码动态构造成一个类,构造类时请指定一个classUuid,这个字段用来减少类的重复创建问题 + * + * @param classUuid 接口的唯一标识 + * @param code 接口对应代码 + * @return + */ + public Class buildClass(String classUuid, String code) { + //如果代码有改变过或者没有加载过,都必须重新加载 +// if (code == null || "".equals(code) || StringUtils.isEmpty(classUuid)) { +// return null; +// } +// Class clazz = cache.get(classUuid); +// if (clazz == null || !code.equals(codeCache.get(classUuid))) { +// clazz = classLoader.parseClass(code); +// cache.put(classUuid, clazz); +// codeCache.put(classUuid, code); +// } + Class clazz = classLoader.parseClass(code); + return clazz; + } + +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp.java new file mode 100644 index 000000000..1834da9d3 --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp.java @@ -0,0 +1,89 @@ +package com.jun.plugin.groovy; + +import groovy.lang.GroovyClassLoader; +import groovy.lang.GroovyObject; +import org.codehaus.groovy.control.CompilerConfiguration; + +import java.io.File; +import java.util.List; + +/** + * @Title: GroovyClassLoaderApp + * @Description: 演示 GroovyClassLoader 方式 + */ +public class GroovyClassLoaderApp { + + private static GroovyClassLoader groovyClassLoader = null; + + public static void initGroovyClassLoader() { + CompilerConfiguration config = new CompilerConfiguration(); + config.setSourceEncoding("UTF-8"); + // 设置该GroovyClassLoader的父ClassLoader为当前线程的加载器(默认) + groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config); + } + + + public static void main(String[] args) { + loadClass(); + System.out.println("======================"); + loadFile(); + } + + /** + * 通过类加载groovy + */ + private static void loadClass(){ + GroovyObject groovyObject = null; + try { + groovyObject = (GroovyObject) GroovyClassLoaderApp.class.getClassLoader().loadClass("com.jun.plugin.groovy.TestGroovy").newInstance(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + // 执行无参函数 + groovyObject.invokeMethod("print",null); + + System.out.println("============================"); + + // 执行有参函数 + Object[] objects = new Object[]{"abc", "def", "ghi"}; + List ls=(List) groovyObject.invokeMethod("printArgs", objects); + ls.stream().forEach(System.out::println); + } + + /** + * 通过文件路径加载groovy + * @return + */ + private static boolean loadFile(){ + File groovyFile = new File("src/main/java/com/jun/plugin/groovy/TestGroovy.groovy"); + if (!groovyFile.exists()) { + System.out.println("文件不存在"); + return false; + } + + initGroovyClassLoader(); + + try { + List result; + // 获得TestGroovy加载后的class + Class groovyClass = groovyClassLoader.parseClass(groovyFile); + // 获得TestGroovy的实例 + GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); + // 反射调用printArgs方法得到返回值 + Object methodResult = groovyObject.invokeMethod("printArgs", new Object[] {"chy", "zjj", "xxx"}); + if (methodResult != null) { + result =(List) methodResult; + result.stream().forEach(System.out::println); + } + return true; + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return false; + } +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp2.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp2.java new file mode 100644 index 000000000..cc12e908c --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp2.java @@ -0,0 +1,139 @@ +package com.jun.plugin.groovy; + +import groovy.lang.GroovyClassLoader; +import groovy.lang.GroovyObject; + +import org.apache.ibatis.reflection.DefaultReflectorFactory; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.factory.DefaultObjectFactory; +import org.apache.ibatis.reflection.factory.ObjectFactory; +import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory; +import org.codehaus.groovy.control.CompilerConfiguration; + +import java.io.File; +import java.util.List; + +/** + * @Title: GroovyClassLoaderApp + * @Description: 演示 GroovyClassLoader 方式 + */ +public class GroovyClassLoaderApp2 { + +// private static GroovyClassLoader groovyClassLoader = null; +// private static GroovyClassLoader groovyClassLoader11 = null; + + public static void initGroovyClassLoader() { + CompilerConfiguration config = new CompilerConfiguration(); + config.setSourceEncoding("UTF-8"); + // 设置该GroovyClassLoader的父ClassLoader为当前线程的加载器(默认) +// groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config); +// groovyClassLoader11 = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config); + + } + + + public static void main(String[] args) { +// loadClass(); + System.out.println("======================"); + loadFile(); + } + + /** + * 通过文件路径加载groovy + * @return + */ + @SuppressWarnings("unchecked") + private static boolean loadFile(){ +// initGroovyClassLoader(); + GroovyAutoBuildClassUtils groovyClassLoader = new GroovyAutoBuildClassUtils(); + try { + List result; + // 获得TestGroovy加载后的class + Class groovyClass11 = groovyClassLoader.buildClass("test2"," package com.jun.plugin.groovy;\r\n" + + "\r\n" + + "import java.io.Serializable;\r\n" + + "\r\n" + + "public class Param implements Serializable{\r\n" + + " \r\n" + + " String msg;\r\n" + + "\r\n" + + " public String getMsg() {\r\n" + + " return msg;\r\n" + + " }\r\n" + + "\r\n" + + " public void setMsg(String msg) {\r\n" + + " this.msg = msg;\r\n" + + " }\r\n" + + "}\r\n" + + " "); + Class groovyClass = groovyClassLoader.buildClass("test2"," package com.jun.plugin.groovy;\r\n" + + "\r\n" + + "import com.alibaba.fastjson.JSON\r\n" + + "import com.alibaba.fastjson.TypeReference\r\n" + + "import com.jun.plugin.groovy.Param;\r\n" + + " \r\n" + + "/**\r\n" + + " * groove class\r\n" + + " */\r\n" + + "class TestGroovy {\r\n" + + " \r\n" + + " void print() {\r\n" + + " System.out.println(\"hello word!!!!\");\r\n" + + " }\r\n" + + " \r\n" + + " List printArgs(String str1, String str2, String str3) {\r\n" + + " String jsonString = \"[\\\"\"+str1+\"\\\",\\\"\"+str2+\"\\\",\\\"\"+str3+\"\\\"]\";\r\n" + + " return JSON.parseObject(jsonString, new TypeReference>() {});\r\n" + + " }\r\n" + + " void sayHello(Param p) {\r\n" + + " System.out.println(\"年龄是:\" + p.getMsg());\r\n" + + " }\r\n" + + " \r\n" + + "} "); + // 获得TestGroovy的实例 + GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); + GroovyObject param = (GroovyObject) groovyClass11.newInstance(); + MetaObject obj = MetaObject.forObject(param,new DefaultObjectFactory(),new DefaultObjectWrapperFactory(), new DefaultReflectorFactory()); + obj.setValue("msg", "66666666666"); + // 反射调用printArgs方法得到返回值 + //Object methodResult = groovyObject.invokeMethod("printArgs", new Object[] {"chy", "zjj", "xxx"}); + Object methodResult = groovyObject.invokeMethod("sayHello", new Object[] {param}); + if (methodResult != null) { + result =(List) methodResult; + result.stream().forEach(System.out::println); + } + return true; + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return false; + } + + + + /** + * 通过类加载groovy + */ + private static void loadClass(){ + GroovyObject groovyObject = null; + try { + groovyObject = (GroovyObject) GroovyClassLoaderApp2.class.getClassLoader().loadClass("com.jun.plugin.groovy.TestGroovy").newInstance(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + // 执行无参函数 + groovyObject.invokeMethod("print",null); + + System.out.println("============================"); + + // 执行有参函数 + Object[] objects = new Object[]{"abc", "def", "ghi"}; + List ls=(List) groovyObject.invokeMethod("printArgs", objects); + ls.stream().forEach(System.out::println); + } +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp3.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp3.java new file mode 100644 index 000000000..7bd9d7041 --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassLoaderApp3.java @@ -0,0 +1,58 @@ +package com.jun.plugin.groovy; + +import groovy.lang.GroovyClassLoader; +import groovy.lang.GroovyObject; +import org.codehaus.groovy.control.CompilerConfiguration; + +import java.io.File; +import java.util.List; + +public class GroovyClassLoaderApp3 { + public static void main(String[] args) { + GroovyAutoBuildClassUtils groovy = new GroovyAutoBuildClassUtils(); + try { + //classUUid: 需要保证唯一 + //code:通常从数据库查询获取,为了做测试直接将代码放进去 + Class clazz = groovy.buildClass("test", "package com.jun.plugin.groovy;\n" + + "\n" + + "public class GroovyTestImpl implements GroovyTest {\n" + + " @Override\n" + + " public int sum(int a, int b) {\n" + + " return a + b;\n" + + " }\n" + + "}"); + Class clazz2 = groovy.buildClass("test2", "package com.jun.plugin.groovy;\n" + + "\n" + + "public class GroovyTestImpl2 implements GroovyTest {\n" + + " @Override\n" + + " public int sum(int a, int b) {\n" + + " return a + b+111111111;\n" + + " }\n" + + "}"); +// Class clazz = groovy.buildClass("test", "package com.jun.plugin.groovy;\n" + +// "\n" + +// "public class GroovyTestImpl implements GroovyTest {\n" + +// " @Override\n" + +// " public int sum(int a, int b) {\n" + +// " return a + b;\n" + +// " }\n" + +// "}"); +// Class clazz2 = groovy.buildClass("test2", "package com.jun.plugin.groovy;\n" + +// "\n" + +// "public class GroovyTestImpl2 implements GroovyTest {\n" + +// " @Override\n" + +// " public int sum(int a, int b) {\n" + +// " return a + b+111111111;\n" + +// " }\n" + +// "}"); + GroovyTest groovyTest = (GroovyTest) clazz.newInstance(); + GroovyTest groovyTest2 = (GroovyTest) clazz2.newInstance(); + int sum = groovyTest.sum(1, 2); + int sum2 = groovyTest2.sum(1, 2); + System.out.println("运算结果: " + sum); + System.out.println("运算结果: " + sum2); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassTest.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassTest.java new file mode 100644 index 000000000..920b5ac6b --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyClassTest.java @@ -0,0 +1,84 @@ +package com.jun.plugin.groovy; + +import groovy.lang.GroovyClassLoader; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.codehaus.groovy.control.CompilerConfiguration; +public class GroovyClassTest { + public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException { + //字符串转java + //groovy提供了一种将字符串文本代码直接转换成Java Class对象的功能 + CompilerConfiguration config = new CompilerConfiguration(); + config.setSourceEncoding("UTF-8"); + // 设置该GroovyClassLoader的父ClassLoader为当前线程的加载器(默认) + System.out.print("Thread.currentThread().getContextClassLoader()="+Thread.currentThread().getContextClassLoader()); + GroovyClassLoader groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config); + GroovyClassLoader groovyClassLoaderObj = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config); + //里面的文本是Java代码,但是我们可以看到这是一个字符串我们可以直接生成对应的Class对象,而不需要我们写一个.java文件 + Class clazz = groovyClassLoader.parseClass(" package com.jun.plugin.groovy;\r\n" + + "import com.jun.plugin.groovy.Param;\r\n" + + "public class Main {\r\n" + + " \r\n" + + " public int age = 666;\r\n" + + "\r\n" + + " public void sayHello() {\r\n" + + " System.out.println(\"年龄是:\" + age);\r\n" + + " }\r\n" + + " public void sayHello(Param p) {\r\n" + + " System.out.println(\"年龄是:\" + p.getMsg());\r\n" + + " }\r\n" + + "}\r\n" + + " "); + Class clazzObj = groovyClassLoaderObj.parseClass(" package com.jun.plugin.groovy;\r\n" + + "\r\n" + + "import java.io.Serializable;\r\n" + + "\r\n" + + "public class Param implements Serializable{\r\n" + + " \r\n" + + " String msg;\r\n" + + "\r\n" + + " public String getMsg() {\r\n" + + " return msg;\r\n" + + " }\r\n" + + "\r\n" + + " public void setMsg(String msg) {\r\n" + + " this.msg = msg;\r\n" + + " }\r\n" + + "} "); + Method[] methods = clazz.getDeclaredMethods(); + Method method = clazz.getDeclaredMethod("sayHello",Param.class); + try { + + method.invoke(clazz.newInstance(),clazzObj.newInstance()); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + + public static void Testmain(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException { + //字符串转java + //groovy提供了一种将字符串文本代码直接转换成Java Class对象的功能 + GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); + //里面的文本是Java代码,但是我们可以看到这是一个字符串我们可以直接生成对应的Class对象,而不需要我们写一个.java文件 + Class clazz = groovyClassLoader.parseClass("package com.xxl.job.core.glue;\n" + + "\n" + + "public class Main {\n" + + "\n" + + " public int age = 22;\n" + + " \n" + + " public void sayHello() {\n" + + " System.out.println(\"年龄是:\" + age);\n" + + " }\n" + + "}\n"); + + Method method = clazz.getDeclaredMethod("sayHello"); + try { + method.invoke(clazz.newInstance()); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } +} diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyTest.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyTest.java new file mode 100644 index 000000000..ddb086376 --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/GroovyTest.java @@ -0,0 +1,10 @@ +package com.jun.plugin.groovy; + +public interface GroovyTest { + + /** + * 求和计算 + */ + int sum(int a, int b); + +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/Main.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/Main.java new file mode 100644 index 000000000..12cfca671 --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/Main.java @@ -0,0 +1,13 @@ +package com.jun.plugin.groovy; +import com.jun.plugin.groovy.Param; +public class Main { + + public int age = 666; + + public void sayHello() { + System.out.println("年龄是:" + age); + } + public void sayHello(Param p) { + System.out.println("年龄是:" + p.getMsg()); + } +} diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/Param.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/Param.java new file mode 100644 index 000000000..914b079e7 --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/Param.java @@ -0,0 +1,16 @@ +package com.jun.plugin.groovy; + +import java.io.Serializable; + +public class Param implements Serializable{ + + String msg; + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/TestGroovy.groovy b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/TestGroovy.groovy new file mode 100644 index 000000000..d0963293b --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/groovy/TestGroovy.groovy @@ -0,0 +1,24 @@ +package com.jun.plugin.groovy; + +import com.alibaba.fastjson2.JSON +import com.alibaba.fastjson2.TypeReference +import com.jun.plugin.groovy.Param; + +/** + * groove class + */ +class TestGroovy { + + void print() { + System.out.println("hello word!!!!"); + } + + List printArgs(String str1, String str2, String str3) { + String jsonString = "[\""+str1+"\",\""+str2+"\",\""+str3+"\"]"; + return JSON.parseObject(jsonString, new TypeReference>() {}); + } + void sayHello(Param p) { + System.out.println("年龄是:" + p.getMsg()); + } + +} \ No newline at end of file diff --git a/jun_api_online_groovy/src/test/java/com/jun/plugin/test/CommonDBCompoent.java b/jun_api_online_groovy/src/test/java/com/jun/plugin/test/CommonDBCompoent.java new file mode 100644 index 000000000..fbc800b83 --- /dev/null +++ b/jun_api_online_groovy/src/test/java/com/jun/plugin/test/CommonDBCompoent.java @@ -0,0 +1,63 @@ +//package com.jun.plugin.test; +// +//import cn.hutool.core.util.RandomUtil; +//import cn.hutool.extra.spring.SpringUtil; +//import com.alibaba.druid.pool.DruidDataSource; +//import com.alibaba.fastjson2.JSON; +//import com.jun.plugin.common.Result; +//import com.jun.plugin.common.base.interfaces.IExecutor; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.stereotype.Component; +// +//import javax.annotation.PostConstruct; +//import java.util.Arrays; +//import java.util.Map; +// +//@Component +//public class CommonDBCompoent implements IExecutor> { +// +// @Autowired +// JdbcTemplate jt; +// static DruidDataSource ds = new DruidDataSource(); +// +// @PostConstruct +// public void test(){ +// ds.setUrl(SpringUtil.getProperty("project.datasource.url")); +// ds.setUsername(SpringUtil.getProperty("project.datasource.username")); +// ds.setPassword(SpringUtil.getProperty("project.datasource.password")); +// } +// +// @Override +// public Result execute(Map params) { +// //JdbcTemplate jt = new JdbcTemplate(ds); +// if(jt!=null) { +// System.out.println("jdbcTemplate初始化成功" ); +// } +// Object[] sqliParams = Arrays.asList("aaa"+ RandomUtil.randomInt(),"bbb"+ RandomUtil.randomInt(),"cccc"+ RandomUtil.randomInt(),"dddd"+ RandomUtil.randomInt()).toArray() ; +// int icount = jt.update("insert into test (title,content,remark,field_name_test ) VALUES ( ?, ?, ?, ? ) ", sqliParams); +// System.out.println(JSON.toJSONString(Result.success(icount))); +// return Result.success(icount); +// } +// +//// @Override +//// public Result rollback(Map params) { +//// return null; +//// } +// +// public static void main(String[] args) throws Exception { +// System.out.println("11111111111111111111111111111111111111 22222222222222222222222222 "); +// System.out.println("SpringUtil.getProperty(\"project.datasource.url\")="+SpringUtil.getProperty("project.datasource.url")); +// JdbcTemplate jt1 = SpringUtil.getBean(JdbcTemplate.class); +// if(jt1!=null) { +// System.out.println("jdbcTemplate初始化成功 1111" ); +// }else{ +// jt1 = SpringUtil.getBean(JdbcTemplate.class); +// } +// Object[] sqliParams = Arrays.asList("aaa"+ RandomUtil.randomInt(),"bbb"+ RandomUtil.randomInt(),"cccc"+ RandomUtil.randomInt(),"dddd"+ RandomUtil.randomInt()).toArray() ; +// int icount = SpringUtil.getBean(JdbcTemplate.class).update("insert into test (title,content,remark,field_name_test ) VALUES ( ?, ?, ?, ? ) ", sqliParams); +// System.out.println("333333333333333333333333333 22222222222222222222222222 "); +// } +// +// +//} diff --git a/jun_api_online_groovy/test666.sql b/jun_api_online_groovy/test666.sql new file mode 100644 index 000000000..65ef0fb3d --- /dev/null +++ b/jun_api_online_groovy/test666.sql @@ -0,0 +1,66 @@ +/* +SQLyog Community v13.1.7 (64 bit) +MySQL - 10.4.24-MariaDB : Database - test666 +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*Table structure for table `api_config` */ + +DROP TABLE IF EXISTS `api_config`; + +CREATE TABLE `api_config` ( + `id` varchar(255) NOT NULL, + `path` varchar(255) DEFAULT NULL, + `name` varchar(255) DEFAULT NULL, + `note` varchar(255) DEFAULT NULL, + `params` text DEFAULT NULL, + `status` int(11) DEFAULT NULL, + `datasource_id` varchar(255) DEFAULT NULL, + `previlege` int(11) DEFAULT NULL, + `group_id` varchar(255) DEFAULT NULL, + `cache_plugin` varchar(255) DEFAULT NULL, + `cache_plugin_params` varchar(255) DEFAULT NULL, + `create_time` varchar(20) DEFAULT NULL, + `update_time` varchar(20) DEFAULT NULL, + `content_type` varchar(50) DEFAULT NULL, + `open_trans` int(11) DEFAULT NULL, + `json_param` text DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `api_config` */ + +insert into `api_config`(`id`,`path`,`name`,`note`,`params`,`status`,`datasource_id`,`previlege`,`group_id`,`cache_plugin`,`cache_plugin_params`,`create_time`,`update_time`,`content_type`,`open_trans`,`json_param`) values ('1','test','test','test','[{\'name\':\'id\',\'type\':\'string\'}]',1,'11',1,'1','','1',NULL,NULL,'application/x-www-form-urlencoded',1,NULL); + +/*Table structure for table `api_datasource` */ + +DROP TABLE IF EXISTS `api_datasource`; + +CREATE TABLE `api_datasource` ( + `id` varchar(255) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `note` varchar(255) DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + `url` varchar(255) DEFAULT NULL, + `username` varchar(255) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `driver` varchar(100) DEFAULT NULL, + `table_sql` varchar(255) DEFAULT NULL, + `create_time` varchar(20) DEFAULT NULL, + `update_time` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `api_datasource` */ + +insert into `api_datasource`(`id`,`name`,`note`,`type`,`url`,`username`,`password`,`driver`,`table_sql`,`create_time`,`update_time`) values ('11','master','master','mysql','jdbc:mysql://localhost:3306/test666?useUnicode=true&characterEncoding=utf-8&useSSL=false','root',NULL,'com.mysql.jdbc.Driver',NULL,NULL,NULL); + \ No newline at end of file diff --git a/jun_pc_web/.gitignore b/jun_pc_web/.gitignore new file mode 100644 index 000000000..6f2277a2f --- /dev/null +++ b/jun_pc_web/.gitignore @@ -0,0 +1,19 @@ +# Build and Release Folders +bin-debug/ +bin-release/ +[Oo]bj/ +[Bb]in/ + +# Other files and folders +.settings/ + +# Executables +*.swf +*.air +*.ipa +*.apk + +# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` +# should NOT be excluded as they contain compiler settings and other important +# information for Eclipse / Flash Builder. +/.user.ini diff --git a/jun_pc_web/.htaccess b/jun_pc_web/.htaccess new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/jun_pc_web/.htaccess @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/400.html b/jun_pc_web/ErrorFiles/400.html new file mode 100644 index 000000000..bc32e15d4 --- /dev/null +++ b/jun_pc_web/ErrorFiles/400.html @@ -0,0 +1,17 @@ + + + + +400状态页面 + + + +
+ +

+

{错误请求} 服务器不能接受此应答!

+
+ + diff --git a/jun_pc_web/ErrorFiles/401.html b/jun_pc_web/ErrorFiles/401.html new file mode 100644 index 000000000..c417dd305 --- /dev/null +++ b/jun_pc_web/ErrorFiles/401.html @@ -0,0 +1,17 @@ + + + + +401状态页面 + + + +
+ +

+

{未授权} 请求需要身份验证!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/403.html b/jun_pc_web/ErrorFiles/403.html new file mode 100644 index 000000000..7b7c2dab1 --- /dev/null +++ b/jun_pc_web/ErrorFiles/403.html @@ -0,0 +1,17 @@ + + + + +403状态页面 + + + +
+ +

+

{禁止} 服务器拒绝请求!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/404.html b/jun_pc_web/ErrorFiles/404.html new file mode 100644 index 000000000..613873046 --- /dev/null +++ b/jun_pc_web/ErrorFiles/404.html @@ -0,0 +1,17 @@ + + + + +404状态页面 + + + +
+ +

+

{未找到} 法海不懂爱~页面不出来!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/429.html b/jun_pc_web/ErrorFiles/429.html new file mode 100644 index 000000000..62237f2d2 --- /dev/null +++ b/jun_pc_web/ErrorFiles/429.html @@ -0,0 +1,17 @@ + + + + +UPUPW安全防护智能感知系统 + + + +
+

+

UPUPW服务器安全防护智能感知系统

+

☸ 您与页面的距离相差60秒...... 如等不到可能已被黑洞吞噬 ☸

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/500.html b/jun_pc_web/ErrorFiles/500.html new file mode 100644 index 000000000..d08a7f20a --- /dev/null +++ b/jun_pc_web/ErrorFiles/500.html @@ -0,0 +1,17 @@ + + + + +500状态页面 + + + +
+ +

+

{服务器遇到错误} 无法完成请求!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/502.html b/jun_pc_web/ErrorFiles/502.html new file mode 100644 index 000000000..56f8fcf0f --- /dev/null +++ b/jun_pc_web/ErrorFiles/502.html @@ -0,0 +1,17 @@ + + + + +502状态页面 + + + +
+ +

+

{无效响应} 网关或代理有误!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/503.html b/jun_pc_web/ErrorFiles/503.html new file mode 100644 index 000000000..c19d10d97 --- /dev/null +++ b/jun_pc_web/ErrorFiles/503.html @@ -0,0 +1,17 @@ + + + + +503状态页面 + + + +
+ +

+

{服务不可用} 服务器过载或暂停!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/504.html b/jun_pc_web/ErrorFiles/504.html new file mode 100644 index 000000000..b8655a39d --- /dev/null +++ b/jun_pc_web/ErrorFiles/504.html @@ -0,0 +1,17 @@ + + + + +504状态页面 + + + +
+ +

+

{网关超时} 超时或解析器有误!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/ErrorFiles/510.html b/jun_pc_web/ErrorFiles/510.html new file mode 100644 index 000000000..28c894094 --- /dev/null +++ b/jun_pc_web/ErrorFiles/510.html @@ -0,0 +1,17 @@ + + + + +510状态页面 + + + +
+ +

+

{资源超限} 访问或下载资源超过限制!

+
+ + \ No newline at end of file diff --git a/jun_pc_web/README.md b/jun_pc_web/README.md new file mode 100644 index 000000000..7058edc5c --- /dev/null +++ b/jun_pc_web/README.md @@ -0,0 +1,71 @@ +# 📐 勾股Admin Layui +![输入图片说明](https://admin.gougucms.com/assets/gougu/images/gouguadmin.jpg) +### 📋 项目介绍 +勾股Admin是一款开基于Layui最新版扩展的Web UI解决方案。封装了Layui的自身调用方法和一些常用的工具函数,整合部分第三方开源的组件。更多是为服务端程序员量身定做,为使用者提供相对完善的前端UI开发方案。 + +预览演示地址:https://admin.gougucms.com +开发交流QQ群:24641076 + +### ⭕ 开源项目 +1. [开源项目系列:勾股OA —— OA协同办公系统](https://gitee.com/gougucms/office) +2. [开源项目系列:勾股CMS —— CMS内容管理系统框架](https://gitee.com/gougucms/gougucms) +3. [开源项目系列:勾股BLOG —— 个人&工作室博客系统](https://gitee.com/gougucms/blog) +4. [开源项目系列:勾股DEV —— 项目研发管理系统](https://gitee.com/gougucms/dev) +5. [开源项目系列:勾股Admin —— 基于Layui的Web UI解决方案](https://gitee.com/gouguopen/guoguadmin) + +### 📚 安装使用 +只需引用一个CSS文件和两个JS文件,声明需要加载的模块,然后初始化操作即可。 +1. 引用CSS文件,放在页头。 +```html + +``` +PS:如果是布局母模板需要引入 layout.css。 +```html + +``` +2. 声明需要加载的模块,并完成初始化元素操作函数等,放在页脚。 +```javascript +//声明需要加载的模块 +const moduleInit = ['tool', 'admin']; + +//初始化操作 +function gouguInit() { + //do something here +} +``` +3. 引用JS文件,放在页面的最下面。 +```html + + +``` +PS:如果是项目使用的是模板继承方式开发的话,把引入文件固定写在母模板,然后只需要在子模板声明需要加载的模块,并完成初始化元素操作函数即可。 + +### ✳️ 目录结构 +``` +┌── assets # 静态资源 +│ ├── gougu # 核心文件 +│ │ ├── images # 图片文件 +│ │ ├── module # 封装或第三方组件 +│ │ ├── css # 样式 +│ │ ├── gouguInit.js # Lyui调用文件方法 +│ ├── icon # icon文件 +│ ├── layui # layui文件 +│ ├── third_party # 第三方插件文件 +├── json # 页面展示模拟数据Json格式 +├── view # 页面文件 +│ ├── base # 基础组件页面 +│ ├── form # 表单组件页面 +│ ├── home # 推荐效果页面 +│ ├── table # 数据表组件页面 +├── index.html # 入口文件 + +``` + +**PS:项目会不定时进行更新,建议⭐star⭐和👁️watch👁️一份。** + +### ⭐ 参与贡献步骤 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request diff --git a/jun_pc_web/_view/base/badge.html b/jun_pc_web/_view/base/badge.html new file mode 100644 index 000000000..804958ca2 --- /dev/null +++ b/jun_pc_web/_view/base/badge.html @@ -0,0 +1,102 @@ + + + + + + 徽章 + + + + + + + + +
+
+
+
+
小圆点徽章
+
+ + + + + + + +
+
+
+
+
+
常规弧形徽章
+
+ 6 + 99 + 61728 + + + 绿 + + + + +
+
+
+
+
+
边框徽章
+
+ 6 + Hot +
+
+
+
+
+
与其它元素的搭配
+
+ + + +

+ +
    <-- + 小Tips:这里有没有发现,设置导航靠右对齐(或居中对齐)其实非常简单 --> +
  • + 控制台9 +
  • +
  • + 个人中心 +
  • +
+
+ +
+
    +
  • 网站设置
  • +
  • 用户管理
  • +
  • 最新邮件99+
  • +
+
+
+ +
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/base/button.html b/jun_pc_web/_view/base/button.html new file mode 100644 index 000000000..3653bf598 --- /dev/null +++ b/jun_pc_web/_view/base/button.html @@ -0,0 +1,140 @@ + + + + + + 按钮 + + + + + + + + + +
+
+
+
按钮主题
+
+
+ + + + + + +
+
+
+
+
按钮尺寸
+
+
+ + + + +
+
+ +
+
+
+
+
按钮图标
+
+
+ + + + + + + +
+ + + + + + + + +
+ + + + + + + +
+
+
+
+
按钮圆角
+
+
+ + + + + + +
+
+
+
+
按钮混搭
+
+
+ + 链接跳转按钮 + + + + +
+
+
+
+
按钮组合
+
+
+
+ + + +
+
+ + + + +
+
+ + + + +
+
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/base/image.html b/jun_pc_web/_view/base/image.html new file mode 100644 index 000000000..2a43d6143 --- /dev/null +++ b/jun_pc_web/_view/base/image.html @@ -0,0 +1,78 @@ + + + + + + 按钮 + + + + + + + + + + +
+
+

图片垂直、水平居中

+
+
+ +
+
+
+ +
+

小圆角图片

+
+
+ +
+
+
+ +
+

圆角图片

+
+
+ +
+
+
+
+

图片自适应裁剪

+
+
+
+ +
+
+

4:3比例截取

+
+
+
+ +
+
+

16:9比例截取

+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/base/layout.html b/jun_pc_web/_view/base/layout.html new file mode 100644 index 000000000..6fedfc18c --- /dev/null +++ b/jun_pc_web/_view/base/layout.html @@ -0,0 +1,273 @@ + + + + + + Layout 布局 + + + + + + + + + + + +
+ +
两列
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
三列
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
四列
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
五列
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
六列
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/base/tag.html b/jun_pc_web/_view/base/tag.html new file mode 100644 index 000000000..1d1302e85 --- /dev/null +++ b/jun_pc_web/_view/base/tag.html @@ -0,0 +1,82 @@ + + + + + + Tag标签 + + + + + + + + +
+
+
+
+
主题风格
+
+
+ + + + +
+
+
+
+
+
+
动态操作
+
+
+ + + + +
+
+
+
+
+
+
删除功能
+
+
+ + + + + +
+
+
+
+
+
+
新建功能
+
+
+ + + + +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/form/editormd.html b/jun_pc_web/_view/form/editormd.html new file mode 100644 index 000000000..1d5bbc861 --- /dev/null +++ b/jun_pc_web/_view/form/editormd.html @@ -0,0 +1,236 @@ + + + + + + Editormd Mardown编辑器 + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
商品标题 *状态 * + + +
关键字 * + + + 商品分类* + +
商品卖点 * + + 缩略图 * +
+ +
+ + +
+
+
商品简介 + +
商品标签 * + + + + + + +
市场价格 * + + 实际价格 * + + 是否包邮 * + + +
首页显示 + + + 属性 + + 排序 + +
商品图集 +
+ +
+ +
+
+
商品介绍*当前为EditorMD Mardown编辑器
+
+ +
+
+
+
+ + + + +
+
+ + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/form/index.html b/jun_pc_web/_view/form/index.html new file mode 100644 index 000000000..4754e674d --- /dev/null +++ b/jun_pc_web/_view/form/index.html @@ -0,0 +1,361 @@ + + + + + + 表单页面 + + + + + + + + +
+
+
+
+

输入框

+
+
+ +
+
+ +
+
+ +
+
+
+
+

下拉选择框

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+

复选框

+
+
+ + + + +
+
+ + + + +
+
+
+
+

开关

+
+
+    +    +    +    +
+
+
+
+

单选框

+
+
+ + + +
+
+
+
+

文本域

+
+
+ +
+
+
+
+
+
+

响应式表单组合

+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ + + + + + + + + +
+
+
+ +
+ +
+
+
+ +
+ + + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
+ +
+

表格式表单组合

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
员工姓名* + + + 手机号码* + + +
入职日期* + + + 员工性别* + + + +
所在部门* + + + 岗位职称* + + +
员工类型* + + + + + 账号状态 + + + +
员工简介 + +
+
+ + +
+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/form/tinymce.html b/jun_pc_web/_view/form/tinymce.html new file mode 100644 index 000000000..18190a042 --- /dev/null +++ b/jun_pc_web/_view/form/tinymce.html @@ -0,0 +1,175 @@ + + + + + + tinyMCE富文本编辑器 + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
文章标题 *
文章分类* + + 关键字* + + + 状态* + + +
排序 + + 首页显示 + + + 属性 + +
是否原创 + + + 作者/来源 + + 来源链接 + +
摘要 + + 缩略图 +
+ +
+ + +
+
+
文章内容*TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。接口丰富,可扩展性强,有能力可以无限拓展功能,界面好看,符合现代审美。
+ +
+
+ + + + +
+
+ + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/form/upload.html b/jun_pc_web/_view/form/upload.html new file mode 100644 index 000000000..a37394a5e --- /dev/null +++ b/jun_pc_web/_view/form/upload.html @@ -0,0 +1,76 @@ + + + + + + 表单页面 + + + + + + + + + +
+
+
+
+

文件上传

+
+ +
+ +
+ +
+
+
+
+

文件上传

+
+ +
+
+
+
+
+

文件上传

+
+ +
+
+ +
+

文件上传

+
+ +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/form/verify.html b/jun_pc_web/_view/form/verify.html new file mode 100644 index 000000000..c61b29387 --- /dev/null +++ b/jun_pc_web/_view/form/verify.html @@ -0,0 +1,194 @@ + + + + + + 表单验证 + + + + + + + + +
+
+
+

表单验证

+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
请填写6到12位密码
+
+
+
+ +
+ +
+
-
+
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/home/analysis.html b/jun_pc_web/_view/home/analysis.html new file mode 100644 index 000000000..ecd2aa1cc --- /dev/null +++ b/jun_pc_web/_view/home/analysis.html @@ -0,0 +1,412 @@ + + + + + + 商业职能 + + + + + + + + + +
+
+
+
+
今日访问
+
+
126,560
+
+ 周同比 12% + + 日同比 3% + +
+
日访问量 1,234
+
+
+
+
+
+
+
下载数量
+
+
6,560
+
+
+
+
总数 1,234
+
+
+
+
+
+
+
流量统计
+
+
6,560
+
+
+
+
日访问量 1,234
+
+
+
+
+
+
+
转化率
+
+
83%
+
+
+
+
+
+
+
+
转化数量 12,234
+
+
+
+
+ + +
+
+
地域分布
+
+
+
+
+
+ +
+
+
在线人数
+
+
+
+
+
+
+
+
浏览器分布
+
+
+
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/home/gougublog.html b/jun_pc_web/_view/home/gougublog.html new file mode 100644 index 000000000..559c086c4 --- /dev/null +++ b/jun_pc_web/_view/home/gougublog.html @@ -0,0 +1,519 @@ + + + + + + 勾股博客 + + + + + + + + +
+
+
+
+
+
+ + + + + + + + +
+
系统用户
+
2
+
+
注册用户
+
33
+
+
文章
+
130
+
+
动态
+
66
+
+
图片
+
59
+
+
+
+
注册用户
+
+
+
+
+
+
文章列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
系统信息
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。
服务器系统LinuxPHP版本7.2.33
上传附件限制50M执行时间限制300秒
勾股BLOG版本2.4.26勾股BLOG文档
ThinkPHP版本6.0.12LTSTP6文档
Layui版本2.6.8Layui文档
BUG反馈hdm58@qq.com
QQ交流群搜Q群:24641076,或点击 gougucms交流群
同系列开源软件勾股CMS勾股OA勾股DEV
🍗🍗
给作者加鸡腿
🍗🍗
+ +
+
+
+
+
用户留言
+
+
    +
  • +

    素还真

    +

    迷惘时,不要想太多,只要循心而往,那就是方向了…

    + 5月16日14:26 + 回复 +
  • +
  • +

    忌霞殇

    +

    每一个人的心中,都有一个隐密的角落,他不想打开让人发现。因为发现不代表照进来的就是阳光,或许更是黑暗。所以,他掩饰、隐藏。但又何妨,人本就与隐藏共同生活。

    + 5月15日 18:25 + 回复 +
  • +
  • +

    抚棺与化蝶

    +

    人生,没有谁必须为另一个人负起责任的道理。 注定的缘分,不管错生几次,还是会相遇的。

    + 5月12日 15:53 + 回复 +
  • +
  • +

    宫无后

    +

    你以为只要长得漂亮就有男生喜欢?你以为只要有了钱漂亮妹子就自己贴上来了?你以为学霸就能找到好工作?我告诉你吧,这些都是真的!

    + 5月10日 09:22 + 回复 +
  • +
  • +

    南风不竞

    +

    有心天下,却输一笔多情,我的山水落在你的眉间,你肯入画吗?

    + 4月29日 10:11 + 回复 +
  • +
  • +

    皇甫笑禅

    +

    一个人要退到哪里,才不是江湖。

    + 4月28日 10:02 + 回复 +
  • +
  • +

    倦收天

    +

    当初的景,当初的人,皆已不复当初,就连当初的记忆,也开始模糊。

    + 4月15日 09:10 + 回复 +
  • +
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/home/gougudev.html b/jun_pc_web/_view/home/gougudev.html new file mode 100644 index 000000000..cf35682fc --- /dev/null +++ b/jun_pc_web/_view/home/gougudev.html @@ -0,0 +1,922 @@ + + + + + + 勾股DEV + + + + + + + + +
+
+
+
+
+
+
+
+
Hi 勾股挨踢,我是勾股DEV,是您工作中必不可少的伙伴!
+
勾股DEV是一款敏捷研发协作系统工具,帮助研发团队透明化工作进展,提升协作效率,推动项目进度。
+
+
+
+
最新企业公告
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号ID公告分类公告标题发布时间
N1001普通公告勾股DEV研发项目管理系统 + v1.0正式版发布2022-04-24 :08:46
N1000紧急公告勾股DEV开放使用通知 + 2022-04-12 :16:39
+
+
+
+
我参与的项目
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号ID状态项目主题负责人任务计划工期
M1005进行中勾股DEV(PRO版) + 勾股挨踢32022-05-15至2022-05-31
M1004未开始勾股BLOG3.0 + 勾股挨踢02022-06-15至2022-06-30
M1003未开始勾股CMS3.0 + 勾股挨踢02022-05-25至2022-06-10
M1002未开始勾股OA3.0开发 + 勾股挨踢22022-02-18至2022-05-20
M1001进行中勾股DEV二期开发 + 勾股挨踢132022-04-25至2022-05-15
M1000已完成勾股DEV一期开发 + 勾股挨踢272022-03-01至2022-04-20
+
+
+ +
+
我参与的任务
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号ID状态任务主题类型预估工时计划完成日期
T1045进行中 + + 工作记录关联项目计划功能开发 + 需求56.02022-05-20
T1014进行中 + + 系统消息模板制定 + 需求5.02022-05-10
T1037已完成 + + 二期项目模块修改调整 + 需求8.02022-05-09
T1036已完成 + + 二期的任务模块修改调整 + 需求5.02022-05-07
T1035已完成 + + 二期的产品模块修改调整 + 需求8.02022-05-08
T1032已完成 + + 知识库列表页收藏数功能调整 + 设计1.02022-04-25
T1030已完成 + + 把列表页的“操作”去除,改成点击标题查看详情 + 需求2.02022-04-24
T1020已完成 + + 实现在文档编写时候,直接粘贴图片的截屏功能 + 需求5.02022-04-30
T1016已完成 + + 任务页面缺少分页功能 + 设计2.02022-04-18
T1015已完成 + + 各个模块详情页浏览统一打开 + 需求10.02022-04-20
+
+
+ +
+
最新知识文档
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号ID所属分类知识主题阅览数创建员工创建时间
K1003行业技能勾股OA在线文档 + 144欧阳产品2022-04-25 17:08
K1002行业技能勾股BLOG在线文档 + 25欧阳产品2022-04-25 17:02
K1001行业技能勾股CMS在线文档 + 49欧阳产品2022-04-25 16:56
K1000行业技能勾股DEV的使用说明 + 145超级员工2022-04-14 17:21
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + +
+
产品
+
5
+
+
项目
+
7
+
+
任务
+
46
+
+
知识库
+
4
+
+
+ +
+
系统信息
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。
服务器系统LinuxPHP版本7.2.33
上传附件限制50M执行时间限制300秒
ThinkPHP版本6.0.8Layui版本2.6.8
勾股DEV2.5.15勾股DEV文档
BUG反馈hdm58@qq.com
QQ交流群搜Q群:24641076,或点击 gougucms交流群
同系列开源软件勾股CMS勾股BLOG勾股OA
🍗🍗🍗
给作者加鸡腿
🍗🍗🍗
+ +
+
+
+ +
+
我的工作情况
+
+ + + + + + + + + + + + + + + + + + + + + +
+
参与项目
+
7
+
+
已完成
+
1
+
+
未完成
+
6
+
+
完成率
+
14.29%
+
影响力
+
+
参与任务
+
21
+
+
已完成
+
19
+
+
未完成
+
2
+
+
完成率
+
90.48%
+
拼效率
+
+
工作记录
+
36
+
+
总工时
+
94
+
+
任务延期
+
19
+
+
延期率
+
90.48%
+
勤奋度
+
+
+
+ +
+
最活跃员工最近30天前十的活跃度 +
+
+
+
+
+
+
员工最新动态
+
+
    +
  • + +
    +
    22分钟前,勾股挨踢登录了系统
    +
    +
  • + +
    +
    23分钟前,超级员工登录了系统
    +
    +
  • + +
    +
    3小时前,勾股技术登录了系统
    +
    +
  • + +
    +
    6小时前,欧阳产品查看了知识库文档
    +
    +
  • + +
    +
    7小时前,欧阳产品登录了系统
    +
    +
  • + +
    +
    7小时前,欧阳产品登录了系统
    +
    +
  • + +
    +
    13小时前,勾股技术登录了系统
    +
    +
  • + +
    +
    13小时前,勾股技术查看了知识库文档
    +
    +
  • + +
    +
    13小时前,勾股技术查看了知识库文档
    +
    +
  • + +
    +
    13小时前,勾股技术登录了系统
    +
    +
  • + +
    +
    昨天,欧阳产品登录了系统
    +
    +
  • + +
    +
    昨天,李工登录了系统
    +
    +
  • + +
    +
    昨天,勾股技术查看了知识库文档
    +
    +
  • + +
    +
    昨天,勾股技术查看了知识库文档
    +
    +
  • + +
    +
    昨天,勾股技术查看了知识库文档
    +
    +
  • +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/home/gouguoa.html b/jun_pc_web/_view/home/gouguoa.html new file mode 100644 index 000000000..13bf7fa35 --- /dev/null +++ b/jun_pc_web/_view/home/gouguoa.html @@ -0,0 +1,544 @@ + + + + + + 勾股OA + + + + + + + + + +
+
+
+
+ + +
+
+
+
    +
  • 企业公告

  • +
  • 知识列表

  • +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+

系统介绍

+ +
+
+

勾股OA是一款实用的企业办公系统框架。集成了系统设置、人事管理、消息管理、审批管理、日常办公、财务管理等基础模块。系统简约,易于功能扩展,方便二次开发,让开发者更专注于业务深度需求的开发,通过二次开发之后可以用来做CRM,ERP,业务管理等系统。

+
+
+
+

系统信息

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。
服务器系统LinuxPHP版本7.2.33
上传附件限制50M执行时间限制300秒
勾股BLOG版本2.4.26勾股BLOG文档
ThinkPHP版本6.0.12LTSTP6文档
Layui版本2.6.8Layui文档
BUG反馈hdm58@qq.com
QQ交流群搜Q群:24641076,或点击 gougucms交流群
同系列开源软件勾股CMS勾股OA勾股DEV
🍗🍗
给作者加鸡腿
🍗🍗
+ +
+
+
+ +
+

项目报告

+
+
+

完成率(日同比 28%

+
+
+
+

回款率(日同比 11%

+
+
+
+
+ +
+

实时监控

+
+
+

CPU使用率

+
+
+
+

内存占用率

+
+
+
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/home/index.html b/jun_pc_web/_view/home/index.html new file mode 100644 index 000000000..32df4ebd0 --- /dev/null +++ b/jun_pc_web/_view/home/index.html @@ -0,0 +1,377 @@ + + + + + + 勾股Admin指南 + + + + + + + + + +
+
+
+
+

简介1222【一键CRUD建表样例,请滚到底部查看111】

+
+

现今,前端主要是以 React 和 Vue 为代表的 JS 框架盛行的时代,但还是有很多后端开发人员在使用Layui,因为Layui门槛极低,拿来即用,无需涉足各种前端工具的复杂配置,程序员只需面对浏览器本身,就能让业务所需要的一切元素与交互快速实现。


+

勾股Admin是一款开基于Layui的最新版扩展的Web UI解决方案。封装了Layui的自身调用方法和一些常用的工具函数,整合部分第三方开源的组件。更多是为服务端程序员量身定做,为使用者提供相对完善的前端UI开发方案,相信她是一个很好的前端轮子。


+

开源项目地址:https://gitee.com/gouguopen/guoguadmin


+

PS:项目会不定时进行更新,建议⭐star⭐和👁️watch👁️一份。

+
+
+
+

使用

+
+

只需引用一个CSS文件和两个JS文件,声明需要加载的模块,然后初始化操作即可。

+

1、引用CSS文件,放在页头。

+
<link rel="stylesheet" href="/assets/gougu/css/gougu.css">
+

PS:如果是布局母模板需要引入 layout.css。

+
<link rel="stylesheet" href="/assets/gougu/css/layout.css">
+

2、声明需要加载的模块,并完成初始化元素操作函数等,放在页脚。

+
<script>
+//声明需要加载的模块
+const moduleInit = ['tool', 'admin'];
+
+//初始化操作
+function gouguInit() {
+	//do something here
+}
+</script>
+

3、引用JS文件,放在页面的最下面。

+
<script src="/assets/layui/layui.js"></script>
+<script src="/assets/gougu/gouguInit.js"></script>
+

PS:如果是项目使用的是模板继承方式开发的话,把引入文件固定写在母模板,然后只需要在子模板声明需要加载的模块,并完成初始化元素操作函数即可。

+
+
+
+

目录结构

+
+

+┌── assets					# 静态资源
+│   ├── gougu				# 核心文件
+│	│	├── images			# 图片文件
+│	│	├── module			# 封装或第三方组件
+│	│	├── css			    # 样式
+│	│	├── gouguInit.js	# Lyui调用文件方法
+│	├── icon				# icon文件
+│	├── layui				# layui文件
+│	├── third_party			# 第三方插件文件
+├── json					# 页面展示模拟数据Json格式
+├── view					# 页面文件
+│	├── base				# 基础组件页面
+│	├── form				# 表单组件页面
+│	├── home				# 推荐效果页面
+│	├── table				# 数据表组件页面
+├── index.html				# 入口文件
+
+

PS:项目会不定时进行更新,建议⭐star⭐和👁️watch👁️一份。

+
+
+ +
+

module 封装或第三方组件

+
+

+┌── admin.js				# admin组件,一般在布局页面的母页面使用
+├── tool.js					# 工具类组件,一般每个页面都使用都到(右侧是针对tool工具类的使用讲解)
+├── tag.js					# tag组件
+├── tagpicker.js			# tag新增选择组件
+├── treeGrid.js				# 树形菜单组件
+├── treetable.js			# 树形表格组件
+├── formSelects.js			# 表单下来选择选项之间,支持多选、单选
+├── tinymce.js				# tinymce富文本编辑器
+├── editormd.js				# editormd Markdown编辑器
+
+

PS:以上组件都在项目的assets\gougu\module\目录内,会不定时进行更新,建议关注项目,获取更新。

+
+
+ +
+

third_party 第三方插件

+
+

+┌── echart				# 强大的chart插件
+├── fullcalendar		# 强大的日历插件
+├── prism				# 轻巧实用的代码高亮插件
+
+

PS:以上组件都在项目的assets\third_party\目录内,会不定时进行更新,建议关注项目,获取更新。

+
+
+ +
+

一键CRUD视频教程

+
+ +
+
+
+

一键CRUD建表样例

+
+

+-- ----------------------------
+-- Table structure for cms_course
+-- ----------------------------
+DROP TABLE IF EXISTS `cms_course`;
+CREATE TABLE `cms_course`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `cate_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类ID',
+  `course_type` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '类型:1线下课程,2视频课程,3音频课,4直播课',
+  `type` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '属性:1精华 2热门 3推荐',
+  `is_home` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否首页显示:0否,1是',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:0下架,1正常',
+  `title` varchar(200) NOT NULL DEFAULT '' COMMENT '课程名称',
+  `thumb` varchar(255) NOT NULL DEFAULT '' COMMENT '缩略图',
+  `desc` varchar(1000) NOT NULL DEFAULT '' COMMENT '课程摘要',
+  `content` text NULL COMMENT '课程介绍',
+  `speaker` varchar(200) NOT NULL DEFAULT '' COMMENT '主讲老师',
+  `base_price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '基础价格',
+  `price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '实际价格',
+  `live_link` varchar(255) NOT NULL DEFAULT '' COMMENT '直播地址',
+  `address` varchar(255) NOT NULL DEFAULT '' COMMENT '线下开课地址',
+  `start_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '课程开始时间',
+  `end_time` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '课程结束时间',
+  `read` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '阅读量',
+  `sort` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序',
+  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` int(11) NOT NULL DEFAULT 0 COMMENT '编辑时间',
+  `delete_time` int(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '课程::crud';
+					
+
+
+ +
+
+
+

常用方法

+
+
<script>
+//以下方法在加载了tool模块后可调用
+const moduleInit = ['tool'];
+
+//初始化操作
+function gouguInit() {
+	let tool = layui.tool;
+}
+</script>
+

+//右侧打开页面,如果不传框架宽度参数的话,打开的窗口会根据1280与1920两个宽度来自适应。
+tool.side(url, width);
+
+//关闭右侧打开页面,如果传入delay参数(数字毫秒),则会延迟关闭,不传即立即关闭。
+tool.sideClose(delay);
+
+//子页面打开新的tab,参数必填,'url':链接,'title':tab标题。
+tool.tabAdd(url,title);
+
+//子页面关闭当前tab
+tool.tabClose();
+
+//子页面关闭指定tab,参数id必填,且是数字
+tool.tabDelete(id);
+
+//子页面切换到指定tab,参数id必填,且是数字
+tool.tabChange(id);
+
+//子页面刷新指定tab,参数id必填,且是数字
+tool.tabRefresh(id);
+					
+
+ + + + +
+
+
+ +
+

get、post、put、delete请求方法

+
+
<script>
+//以下方法在加载了tool模块后可调用
+const moduleInit = ['tool'];
+
+//初始化操作
+function gouguInit() {
+	let tool = layui.tool;
+}
+</script>
+
/*=================以下是常规的(get、post、put、delete)方法调用====================*/
+
+//get获取。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
+tool.get(url, data, callback);
+//例子:
+tool.get("/project/api/get_project", {}, function (res) {
+	let data = res.data;
+	console.log(data);
+});
+
+/*========================华丽的分割线============================*/
+
+//post提交。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
+tool.post(url, data, callback);
+//例子:
+let callback = function (e) {
+	layer.msg(e.msg);
+	if (e.code == 0) {
+		setTimeout(function () {
+			parent.location.reload();
+		}, 1000);					
+	}
+}
+tool.post("/article/cate/cate_add", {id:1,title:'勾股Admin'}, callback);
+
+/*========================华丽的分割线============================*/
+
+//put修改。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
+tool.put(url, data, callback);
+//例子:
+let callback = function (e) {
+	layer.msg(e.msg);
+	if (e.code == 0) {
+		parent.layui.tool.close(1000);
+	}
+}
+tool.put("/contract/index/add", {'id':1,'title':'勾股CMS'}, callback);
+
+/*========================华丽的分割线============================*/
+
+//delete删除。必填参数,'url':请求地址,字符串, 'data':需要传的参数,对象, 'callback':成功回调函数
+tool.delete(url, data, callback);
+//例子:
+let callback = function (e) {
+	layer.msg(e.msg);
+	if (e.code == 0) {
+		obj.del();
+	}
+}
+tool.delete("/article/cate/cate_delete", { id: 2}, callback);
+					
+
+
+ +
+

ajax的json 与 jsonp请求

+
+
/*=================以下是常规的ajax(json、jsonp)方法调用====================*/
+
+//ajax。必填参数,'options':请求参数,对象,'callback':成功回调函数
+tool.ajax(options, callback);
+
+//常规json请求例子:
+let options = {
+		url: '/home/ask/ask',
+		type: 'post',
+		data: {
+			title: '正常的Ajax请求',
+			content: '注意:这是一个常规的Ajax请求'
+		}
+	});
+let callback = function(res) {
+	if (res.code == 0) {
+		layer.msg('问题提交成功,我们会尽快回复您。');
+		setTimeout(function() {
+			window.location.href = '/home/user/my_ask.html'
+		}, 2000);
+		return;
+	}
+	layer.msg('发布失败!');
+}
+tool.ajax(options, callback);
+
+/*========================华丽的分割线============================*/
+
+//jsonp请求例子:
+let options = {
+		url: '/home/ask/ask',
+		type: 'post',
+		data: {
+			format:'jsonp',//这个jsonp必须要有
+			title: 'jsonp的Ajax请求',
+			content: '注意:这是一个jsonp的Ajax请求'
+		}
+	});
+let callback = function(res) {
+	if (res.code == 0) {
+		layer.msg('问题提交成功,我们会尽快回复您。');
+		setTimeout(function() {
+			window.location.href = '/home/user/my_ask.html'
+		}, 2000);
+		return;
+	}
+	layer.msg('发布失败!');
+}
+tool.ajax(options, callback);
+					
+
+
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/table/index.html b/jun_pc_web/_view/table/index.html new file mode 100644 index 000000000..3c3588b8c --- /dev/null +++ b/jun_pc_web/_view/table/index.html @@ -0,0 +1,153 @@ + + + + + + 表格页面 + + + + + + + + +
+
+
+
+
    +
  • 全部
  • +
  • 需求
  • +
  • 设计
  • +
  • 研发
  • +
  • 缺陷
  • +
+
+
+
+ + + +
+ +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/table/role.html b/jun_pc_web/_view/table/role.html new file mode 100644 index 000000000..64fd013c6 --- /dev/null +++ b/jun_pc_web/_view/table/role.html @@ -0,0 +1,899 @@ + + + + + + + + + + 勾股OA + + + + + + + + + + + +
+

员工信息

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
登录账号 + admin 登录密码 + 密码已重置 + 重设新密码 + 员工状态 + 正常 头像 +
+ +
+
员工姓名 + 超级员工 手机号码 + 13800138000 电子邮箱 +
所在部门董事会岗位职称超级岗位入职日期 + 1970-01-01
员工类型 + 正式员工 最后登录时间 + 2022-11-16 17:54 最后登录IP + 163.142.228.155 累计登录次数 + 97
员工简介 +
+

用户权限

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ + +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/_view/table/tree_table.html b/jun_pc_web/_view/table/tree_table.html new file mode 100644 index 000000000..fd8308620 --- /dev/null +++ b/jun_pc_web/_view/table/tree_table.html @@ -0,0 +1,77 @@ + + + + + + 树形表格 + + + + + + + + +
+
+ +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/jun_pc_web/adm/car/car_cate.html b/jun_pc_web/adm/car/car_cate.html new file mode 100644 index 000000000..dd2232a39 --- /dev/null +++ b/jun_pc_web/adm/car/car_cate.html @@ -0,0 +1,184 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/adm/car/car_cate.json b/jun_pc_web/adm/car/car_cate.json new file mode 100644 index 000000000..e81782019 --- /dev/null +++ b/jun_pc_web/adm/car/car_cate.json @@ -0,0 +1,32 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "宝马X5", + "name": "粤A55555", + "status": 1, + "create_time": 1639900555, + "update_time": 0 + }, + { + "id": 2, + "title": "哈弗H6", + "name": "粤A66666", + "status": 1, + "create_time": 1639900666, + "update_time": 0 + }, + { + "id": 3, + "title": "奥迪Q8", + "name": "粤A88888", + "status": 1, + "create_time": 1639900888, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/adm/car/car_cate2.html b/jun_pc_web/adm/car/car_cate2.html new file mode 100644 index 000000000..856822580 --- /dev/null +++ b/jun_pc_web/adm/car/car_cate2.html @@ -0,0 +1,146 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/adm/index.html b/jun_pc_web/adm/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/adm/index.json b/jun_pc_web/adm/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/adm/meeting/meeting_cate.html b/jun_pc_web/adm/meeting/meeting_cate.html new file mode 100644 index 000000000..22c6f2c09 --- /dev/null +++ b/jun_pc_web/adm/meeting/meeting_cate.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/adm/meeting/meeting_cate.json b/jun_pc_web/adm/meeting/meeting_cate.json new file mode 100644 index 000000000..3b2a79ed4 --- /dev/null +++ b/jun_pc_web/adm/meeting/meeting_cate.json @@ -0,0 +1,29 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "会议室一", + "status": 1, + "create_time": 1639899124, + "update_time": 0 + }, + { + "id": 2, + "title": "会议室二", + "status": 1, + "create_time": 1639899140, + "update_time": 0 + }, + { + "id": 3, + "title": "会议室三", + "status": 1, + "create_time": 1639899148, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/adm/meeting/meeting_cate2.html b/jun_pc_web/adm/meeting/meeting_cate2.html new file mode 100644 index 000000000..128a9bb36 --- /dev/null +++ b/jun_pc_web/adm/meeting/meeting_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/adm/seal/seal_cate.html b/jun_pc_web/adm/seal/seal_cate.html new file mode 100644 index 000000000..432e3f5a1 --- /dev/null +++ b/jun_pc_web/adm/seal/seal_cate.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/adm/seal/seal_cate.json b/jun_pc_web/adm/seal/seal_cate.json new file mode 100644 index 000000000..e6432dfb8 --- /dev/null +++ b/jun_pc_web/adm/seal/seal_cate.json @@ -0,0 +1,36 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "公章", + "status": 1, + "create_time": 1639899124, + "update_time": 0 + }, + { + "id": 2, + "title": "合同章", + "status": 1, + "create_time": 1639899140, + "update_time": 0 + }, + { + "id": 3, + "title": "法人章", + "status": 1, + "create_time": 1639899148, + "update_time": 0 + }, + { + "id": 4, + "title": "其他", + "status": 1, + "create_time": 1639899158, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/adm/seal/seal_cate2.html b/jun_pc_web/adm/seal/seal_cate2.html new file mode 100644 index 000000000..e870c429f --- /dev/null +++ b/jun_pc_web/adm/seal/seal_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/article/cate/cate.html b/jun_pc_web/article/cate/cate.html new file mode 100644 index 000000000..c82aa0fdd --- /dev/null +++ b/jun_pc_web/article/cate/cate.html @@ -0,0 +1,121 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/article/cate/cate.json b/jun_pc_web/article/cate/cate.json new file mode 100644 index 000000000..fa55bff24 --- /dev/null +++ b/jun_pc_web/article/cate/cate.json @@ -0,0 +1,205 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 2, + "pid": 0, + "sort": 0, + "title": "规章制度", + "desc": "", + "create_time": 1637984739, + "update_time": 1701314043, + "children": [ + { + "id": 17, + "pid": 2, + "sort": 0, + "title": "0000", + "desc": "0000", + "create_time": 1691736601, + "update_time": 0, + "children": [ + { + "id": 28, + "pid": 17, + "sort": 0, + "title": "下级", + "desc": "", + "create_time": 1702559496, + "update_time": 0, + "children": [ + { + "id": 30, + "pid": 28, + "sort": 0, + "title": "44", + "desc": "", + "create_time": 1703747855, + "update_time": 0, + "children": [] + } + ] + } + ] + }, + { + "id": 20, + "pid": 2, + "sort": 0, + "title": "实施经济数据", + "desc": "", + "create_time": 1694055276, + "update_time": 1694055307, + "children": [] + }, + { + "id": 24, + "pid": 2, + "sort": 0, + "title": "水煮", + "desc": "傻姑", + "create_time": 1700121774, + "update_time": 0, + "children": [] + } + ] + }, + { + "id": 4, + "pid": 0, + "sort": 0, + "title": "事情标准", + "desc": "", + "create_time": 1686565882, + "update_time": 1699522298, + "children": [] + }, + { + "id": 5, + "pid": 0, + "sort": 0, + "title": "科技信息", + "desc": "111", + "create_time": 1686622143, + "update_time": 1687221385, + "children": [ + { + "id": 16, + "pid": 5, + "sort": 0, + "title": "医疗", + "desc": "", + "create_time": 1691132530, + "update_time": 1695527537, + "children": [] + }, + { + "id": 21, + "pid": 5, + "sort": 12, + "title": "故障", + "desc": "adf\n12\n12\n312\n3\n1\n\n21\n12\n\n12\n12\n\n213\n12\n1\n23\n12\n\n213\n13\n13", + "create_time": 1694072056, + "update_time": 0, + "children": [] + } + ] + }, + { + "id": 6, + "pid": 0, + "sort": 0, + "title": "工具", + "desc": "测试用的\n", + "create_time": 1686708336, + "update_time": 1699522320, + "children": [] + }, + { + "id": 13, + "pid": 0, + "sort": 0, + "title": "测试分类", + "desc": "", + "create_time": 1689833405, + "update_time": 1694011384, + "children": [ + { + "id": 14, + "pid": 13, + "sort": 0, + "title": "11", + "desc": "", + "create_time": 1689833419, + "update_time": 0, + "children": [ + { + "id": 12, + "pid": 14, + "sort": 0, + "title": "测试的分类", + "desc": "456456456", + "create_time": 1689384181, + "update_time": 1695562915, + "children": [ + { + "id": 26, + "pid": 12, + "sort": 0, + "title": "2222222", + "desc": "33333333", + "create_time": 1701160748, + "update_time": 0, + "children": [] + } + ] + }, + { + "id": 15, + "pid": 14, + "sort": 0, + "title": "123", + "desc": "11", + "create_time": 1690166375, + "update_time": 0, + "children": [] + } + ] + } + ] + }, + { + "id": 22, + "pid": 0, + "sort": 0, + "title": "行业应用", + "desc": "", + "create_time": 1699521774, + "update_time": 0, + "children": [] + }, + { + "id": 27, + "pid": 0, + "sort": 0, + "title": "啦啦啦", + "desc": "啦啦啦啦啦啦啦啦啦啦啦啦", + "create_time": 1701243717, + "update_time": 0, + "children": [] + }, + { + "id": 29, + "pid": 0, + "sort": 0, + "title": "分类的所有东西", + "desc": "爱马仕相机,爱马仕运动表,爱马仕电话,爱马仕小天才电话手表", + "create_time": 1703336712, + "update_time": 0, + "children": [] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/article/cate/cate2.html b/jun_pc_web/article/cate/cate2.html new file mode 100644 index 000000000..9796790e6 --- /dev/null +++ b/jun_pc_web/article/cate/cate2.html @@ -0,0 +1,83 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+ +
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/article/cate/cate_add.html b/jun_pc_web/article/cate/cate_add.html new file mode 100644 index 000000000..4da277d33 --- /dev/null +++ b/jun_pc_web/article/cate/cate_add.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
+

知识分类

+ + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/article/cate/cate_add2.html b/jun_pc_web/article/cate/cate_add2.html new file mode 100644 index 000000000..7f0fd7665 --- /dev/null +++ b/jun_pc_web/article/cate/cate_add2.html @@ -0,0 +1,88 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

知识分类

+ {eq name="$id" value="0"} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {else/} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/article/index.html b/jun_pc_web/article/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/article/index.json b/jun_pc_web/article/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/article/index/add.html b/jun_pc_web/article/index/add.html new file mode 100644 index 000000000..ec9eda63f --- /dev/null +++ b/jun_pc_web/article/index/add.html @@ -0,0 +1,270 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
+

编辑知识文章

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
文章标题*文章分类* + +
关键字* + + + 属性 + +
是否共享* + + + + + 状态 + + + 排序 + +
+
关联附件
+
+ +
+
+
+ +
+
文章摘要 + + 缩略图 +
+ +
+ + +
+
+
文章内容* + +
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/article/index/add2.html b/jun_pc_web/article/index/add2.html new file mode 100644 index 000000000..9673b4cfe --- /dev/null +++ b/jun_pc_web/article/index/add2.html @@ -0,0 +1,212 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增知识文章

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
文章标题*文章分类* + +
关键字* + + + 属性 + +
共享设置 + + + + + 状态 + + + 排序 + +
+
关联附件
+
+ +
+
+
+ +
+
文章摘要 + + 缩略图 +
+ +
+ + +
+
+
文章内容* + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/article/index/edit2.html b/jun_pc_web/article/index/edit2.html new file mode 100644 index 000000000..8560534c7 --- /dev/null +++ b/jun_pc_web/article/index/edit2.html @@ -0,0 +1,221 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑知识文章

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
文章标题*文章分类* + +
关键字* + + + 属性 + +
是否共享* + + + + + 状态 + + + 排序 + +
共享部门* + + +
共享人员* + + +
+
关联附件
+
+ +
+
+
+ + {notempty name="$article.file_ids"} + {volist name="$article.fileArray" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
文章摘要 + + 缩略图 +
+ +
+ + +
+
+
文章内容* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/article/index/index.html b/jun_pc_web/article/index/index.html new file mode 100644 index 000000000..16b747084 --- /dev/null +++ b/jun_pc_web/article/index/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/article/index/index.json b/jun_pc_web/article/index/index.json new file mode 100644 index 000000000..10a89f919 --- /dev/null +++ b/jun_pc_web/article/index/index.json @@ -0,0 +1,423 @@ +{ + "code": 0, + "msg": "", + "count": 16, + "data": [ + { + "id": 30, + "title": "111", + "cate_id": 29, + "keywords": "", + "desc": "11111", + "thumb": 0, + "uid": 6, + "did": 4, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

11111<\/p>", + "read": 4, + "type": 2, + "status": 1, + "sort": 0, + "create_time": "2024-01-12 10:20:27", + "update_time": null, + "delete_time": 0, + "cate_title": "分类的所有东西", + "department": "市场部", + "user": "秦假仙" + }, + { + "id": 29, + "title": "444", + "cate_id": 30, + "keywords": "", + "desc": "44", + "thumb": 0, + "uid": 2, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

444<\/p>", + "read": 32, + "type": 1, + "status": 1, + "sort": 0, + "create_time": "2023-12-28 15:19:07", + "update_time": null, + "delete_time": 0, + "cate_title": "44", + "department": "董事会", + "user": "素还真" + }, + { + "id": 28, + "title": "qwrweqr", + "cate_id": 27, + "keywords": "", + "desc": "wqertwer ", + "thumb": 0, + "uid": 2, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

qwerqwerqwerqwe<\/p>\n

int a = 3;\nint b = 4;\nSystem.out.println(a + b);<\/code><\/pre>",
+            "read": 63,
+            "type": 1,
+            "status": 1,
+            "sort": 0,
+            "create_time": "2023-12-20 09:13:22",
+            "update_time": "2023-12-28 13:52:42",
+            "delete_time": 0,
+            "cate_title": "啦啦啦",
+            "department": "董事会",
+            "user": "素还真"
+        },
+        {
+            "id": 27,
+            "title": "123",
+            "cate_id": 22,
+            "keywords": "",
+            "desc": "法大师傅",
+            "thumb": 0,
+            "uid": 2,
+            "did": 1,
+            "origin_url": "",
+            "file_ids": "",
+            "is_share": 1,
+            "share_dids": "",
+            "share_uids": "",
+            "content": "

测试一个规章制度,这个好像没得版本管理得概念呢<\/p>", + "read": 23, + "type": 3, + "status": 1, + "sort": 0, + "create_time": "2023-12-13 10:39:18", + "update_time": "2023-12-14 10:08:18", + "delete_time": 0, + "cate_title": "行业应用", + "department": "董事会", + "user": "素还真" + }, + { + "id": 24, + "title": "测试知识文档", + "cate_id": 13, + "keywords": "", + "desc": "测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档", + "thumb": 0, + "uid": 3, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档测试知识文档。<\/p>", + "read": 150, + "type": 2, + "status": 1, + "sort": 0, + "create_time": "2023-11-22 16:37:44", + "update_time": "2023-12-08 13:56:54", + "delete_time": 0, + "cate_title": "测试分类", + "department": "董事会", + "user": "一页书" + }, + { + "id": 23, + "title": "感受到防守打法撒的发生", + "cate_id": 6, + "keywords": "", + "desc": "阿萨法的说法说得对歌诗达搜嘎代发手打阿萨德刚地方撒<div>slkjadslkfjsl<\/div>      &nb...", + "thumb": 0, + "uid": 4, + "did": 3, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

阿萨法的说法说得对歌诗达搜嘎代发手打<\/p>\n

阿萨德刚地方撒<\/p>\n

<div>slkjadslkfjsl<\/div><\/code><\/pre>\n\n\n\n\n\n\n\n\n":/^(UL|OL)$/.test(n.nodeName)&&(r="
  • "+i+"
  • "),r=(a=Ss(t))&&t.schema.isValidChild(n.nodeName.toLowerCase(),a.toLowerCase())?(r=i,t.dom.createHTML(a,Es(t),r)):r||'
    ',Ng(t,r,o.no_selection),t.fire("SetContent",o)):("raw"!==o.format&&(r=nm({validate:t.validate},t.schema).serialize(t.parser.parse(r,{isRootContent:!0,insert:!0}))),o.content=vo(Nt.fromDom(n))?r:Et.trim(r),Ng(t,o.content,o.no_selection),o.no_events||t.fire("SetContent",o)),o.content);var t,n,r,o,i,a})}function _g(e){return y(e)?e:R}function Ag(i,e,t){var n=e(i),a=_g(t);return n.orThunk(function(){return a(i)?ve.none():function(e){for(var t=i.dom,n=_g(a);t.parentNode;){var t=t.parentNode,r=Nt.fromDom(t),o=e(r);if(o.isSome())return o;if(n(r))break}return ve.none()}(e)})}function Rg(e,t,n){var r=e.formatter.get(n);if(r)for(var o=0;o=o.nodeValue.length&&(o=new Rr(o,e.getBody()).next()||o),jn(o)&&!n&&0===i&&new Rr(o,e.getBody()).prev()||o}function Dp(e,t){var n=t?"firstChild":"lastChild";if(/^(TR|TH|TD)$/.test(e.nodeName)&&e[n]){var r=e[n];return"TR"===e.nodeName&&r[n]||r}return e}function Tp(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o}function Op(e,t,n,r,o){var i=Nt.fromDom(t),a=Nt.fromDom(e.create(r,o));return Kt(a,(n?It:Lt)(i)),n?(qt(i,a),Wt(a,i)):($t(i,a),Pn(a,i)),a.dom}function Bp(e,t,n,r){var o=el(t,n,r);return K(o)||"BR"===o.nodeName||e.isBlock(o)}function Pp(e,r,o,t,i){var n,a,u=e.dom,s=u,c=t;if(!(dl(a=r)&&kh(c,a.inline)||ll(a)&&kh(c,a.block)||fl(a)&&(zn(c)&&s.is(c,a.selector))||r.links&&"A"===t.nodeName))return Sh.keep();var l,f,d,m,g,p,h,v,b=t;if(dl(r)&&"all"===r.remove&&S(r.preserve_attributes)){var y=U(u.getAttribs(b),function(e){return D(r.preserve_attributes,e.name.toLowerCase())});if(u.removeAllAttribs(b),Y(y,function(e){return u.setAttrib(b,e.name,e.value)}),0e?t.cells.length:e},0)}function Kp(e,t){for(var n=e.rows,r=0;r")?{type:"fragmented",fragments:t,content:"",bookmark:null,beforeBookmark:null}:{type:"complete",fragments:null,content:r,bookmark:null,beforeBookmark:null}}function ih(e,t,n){var r,o,i,g,p,a,h,v,c,l,u,s=n?t.beforeBookmark:t.bookmark;function b(e,t,n,r){for(var o=e;o-tc){for(var l=0;l]*>( | |\\s|\xa0|
    |)<\\/"+u+">[\r\n]*|
    [\r\n]*)$"),a.replace(s,"")),D(["text","tree"],l.format)||vo(Nt.fromDom(r))?l.content=f:l.content=Et.trim(f),(l.no_events?l:t.fire("GetContent",l)).content;var t,n,r,o,i,a,u,s,c,l,f});var d,m,g},setContent:function(e,t){return kg(c,e,t)},insertContent:function(e,t){return Sg(c,e,t)},addVisual:function(e){var i,t=e,a=(i=c).dom,n=V(t)?t:i.getBody();b(i.hasVisual)&&(i.hasVisual=i.getParam("visual",!0,"boolean")),Y(a.select("table,a",n),function(e){switch(e.nodeName){case"TABLE":var t=i.getParam("visual_table_class","mce-item-table","string"),n=a.getAttrib(e,"border");n&&"0"!==n||!i.hasVisual?a.removeClass(e,t):a.addClass(e,t);break;case"A":var r,o;a.getAttrib(e,"href")||(r=a.getAttrib(e,"name")||e.id,o=i.getParam("visual_anchor_class","mce-item-anchor","string"),r&&i.hasVisual?a.addClass(e,o):a.removeClass(e,o))}}),i.fire("VisualAid",{element:t,hasVisual:i.hasVisual})}},selection:{getContent:function(e,t){return function(e,t,n){var r,o=(r=t,_e(_e({},n=void 0===n?{}:n),{format:r,get:!0,selection:!0})),i=e.fire("BeforeGetContent",o);if(i.isDefaultPrevented())return e.fire("GetContent",i),i.content;if("text"===i.format)return m=e,ve.from(m.selection.getRng()).map(function(e){var t=ve.from(m.dom.getParent(e.commonAncestorContainer,m.dom.isBlock)),n=m.getBody(),r=t.map(function(e){return e.nodeName}).getOr("div").toLowerCase(),o=xt.browser.isIE()&&"pre"!==r,i=m.dom.add(n,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},e.cloneContents()),a=th(i,o),u=wo(i.textContent);if(m.dom.remove(i),eh(u,0)||eh(u,u.length-1)){var s=th(t.getOr(n),o),c=s.indexOf(a);return-1===c?a:(eh(s,c-1)?" ":"")+a+(eh(s,c+a.length)?" ":"")}return a}).getOr("");i.getInner=!0;var a,u,s,c,l,f,d,m,g=(u=i,s=(a=e).selection.getRng(),c=a.dom.create("body"),l=a.selection.getSel(),f=wd(a,Nl(l)),(d=u.contextual?Zp(Nt.fromDom(a.getBody()),f).dom:s.cloneContents())&&c.appendChild(d),a.selection.serializer.serialize(c,u));return"tree"===i.format?g:(i.content=e.selection.isCollapsed()?"":g,e.fire("GetContent",i),i.content)}(c,e,t)}},raw:{getModel:function(){return ve.none()}}}}function mh(e){return Ne(e.plugins,"rtc")}function gh(e){var u=e;return ue(e.plugins,"rtc").bind(function(e){return ve.from(e.setup)}).fold(function(){return u.rtcInstance=dh(e),ve.none()},function(e){var t,n;return u.rtcInstance=(t=J(null),n=J(""),{undoManager:{beforeChange:te,add:t,undo:t,redo:t,clear:te,reset:te,hasUndo:R,hasRedo:R,transact:t,ignore:te,extra:te},formatter:{match:R,matchAll:J([]),matchNode:J(void 0),canApply:R,closest:n,apply:te,remove:te,toggle:te,formatChanged:J({unbind:te})},editor:{getContent:n,setContent:n,insertContent:te,addVisual:te},selection:{getContent:n},raw:{getModel:J(ve.none())}}),ve.some(function(){return e().then(function(e){return u.rtcInstance=(i=e.undoManager,a=e.formatter,n=e.editor,r=e.selection,t=e.raw,{undoManager:{beforeChange:i.beforeChange,add:i.add,undo:i.undo,redo:i.redo,clear:i.clear,reset:i.reset,hasUndo:i.hasUndo,hasRedo:i.hasRedo,transact:function(e,t,n){return i.transact(n)},ignore:function(e,t){return i.ignore(t)},extra:function(e,t,n,r){return i.extra(n,r)}},formatter:{match:function(e,t,n,r){return a.match(e,o(t),r)},matchAll:a.matchAll,matchNode:a.matchNode,canApply:function(e){return a.canApply(e)},closest:function(e){return a.closest(e)},apply:function(e,t,n){return a.apply(e,o(t))},remove:function(e,t,n,r){return a.remove(e,o(t))},toggle:function(e,t,n){return a.toggle(e,o(t))},formatChanged:function(e,t,n,r,o){return a.formatChanged(t,n,r,o)}},editor:{getContent:function(e,t){return n.getContent(e)},setContent:function(e,t){return n.setContent(e,t)},insertContent:function(e,t){return n.insertContent(e)},addVisual:n.addVisual},selection:{getContent:function(e,t){return r.getContent(t)}},raw:{getModel:function(){return ve.some(t.getRawModel())}}}),e.rtc.isRemote;function o(e){return h(e)?e:{}}var i,a,n,r,t})})})}function ph(e){return e.rtcInstance||dh(e)}function hh(e){var t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")}function vh(e){return 0===e.dom.length?(Ln(e),ve.none()):ve.some(e)}function bh(e,t,u,s){e.bind(function(a){return(s?Um:Fm)(a.dom,s?a.dom.length:0),t.filter(_n).map(function(e){var t=u,n=s,r=a.dom,o=e.dom,i=(n?r:o).length;n?(zm(r,o,!1,!n),t.setStart(o,i)):(zm(o,r,!1,!n),t.setEnd(o,i))})}).orThunk(function(){var e=s;return t.filter(function(e){return Fl.isBookmarkNode(e.dom)}).bind(e?Pt:Bt).or(t).filter(_n).map(function(e){var n,r=s;Ot(n=e).each(function(e){var t=n.dom;r&&Dm(e,as(t,0))?Fm(t,0):!r&&Tm(e,as(t,t.length))&&Um(t,t.length)})})})}function yh(e,t,n){var r,o=(r=t,_e(_e({format:"html"},n=void 0===n?{}:n),{set:!0,selection:!0,content:r})),i=o;if(!o.no_events){var a=e.fire("BeforeSetContent",o);if(a.isDefaultPrevented())return void e.fire("SetContent",a);i=a}i.content=function(e,t){if("raw"===t.format)return t.content;var n=e.selection.getRng(),r=e.dom.getParent(n.commonAncestorContainer,e.dom.isBlock),o=r?{context:r.nodeName.toLowerCase()}:{},i=e.parser.parse(t.content,_e(_e({isRootContent:!0,forced_root_block:!1},o),t));return nm({validate:e.validate},e.schema).serialize(i)}(e,i);var u=e.selection.getRng();!function(e,t){var n=ve.from(t.firstChild).map(Nt.fromDom),r=ve.from(t.lastChild).map(Nt.fromDom);e.deleteContents(),e.insertNode(t);var o=n.bind(Bt).filter(_n).bind(vh),i=r.bind(Pt).filter(_n).bind(vh);bh(o,n,e,!0),bh(i,r,e,!1),e.collapse(!1)}(u,u.createContextualFragment(i.content)),e.selection.setRng(u),Zf(e,u),i.no_events||e.fire("SetContent",i)}function Ch(e,t,n){var r;e&&Ne(e,t)&&(0===(r=U(e[t],function(e){return e!==n})).length?delete e[t]:e[t]=r)}qg=function(e){var t,n=e.selection.getRng(),r=on(["pre"]);n.collapsed||(t=e.selection.getSelectedBlocks(),xp(Cp(Cp(t,r),function(e){return r(e.previousSibling)&&-1!==de(t,e.previousSibling)}),function(e){var t,n=e.previousSibling;Wa(t=e).remove(),Wa(n).append("

    ").append(t.childNodes)}))},yp["pre"]||(yp.pre=[]),yp.pre.push(qg);var xh=Et.each,wh=function(e,t,n){xh(e.childNodes,function(e){wp(e)&&(t(e)&&n(e),e.hasChildNodes()&&wh(e,t,n))})},Sh=or([{keep:[]},{rename:["name"]},{removed:[]}]),Eh=/^(src|href|style)$/,Nh=Et.each,kh=ol,_h=Et.each,Ah=Et.each,Rh=function(S,E,N,r){function k(n,e){var t;y((e=void 0===e?A:e).onformat)&&e.onformat(n,e,N,r),Ah(e.styles,function(e,t){u.setStyle(n,t,rl(e,N))}),!e.styles||(t=u.getAttrib(n,"style"))&&u.setAttrib(n,"data-mce-style",t),Ah(e.attributes,function(e,t){u.setAttrib(n,t,rl(e,N))}),Ah(e.classes,function(e){e=rl(e,N),u.hasClass(n,e)||u.addClass(n,e)})}function g(e,t){var n=!1;return Ah(e,function(e){return!!fl(e)&&(V(e.collapsed)&&e.collapsed!==a||!u.is(t,e.selector)||zc(t)?void 0:(k(t,e),!(n=!0)))}),n}function o(x,e,l){var w=[],f=!0,d=A.inline||A.block,m=function(e){if(X(e)){var t=u.create(e);return k(t),t}return null}(d);El(x,e,function(e){var s,c=function(e){var t=!1,n=f,r=e.nodeName.toLowerCase(),o=e.parentNode,i=o.nodeName.toLowerCase();if(zn(e)&&x.getContentEditable(e)&&(n=f,f="true"===x.getContentEditable(e),t=!0),Wn(e)&&!function(e,t,n,r){if(e.getParam("format_empty_lines",!1,"boolean")&&dl(t)){var o=_e(_e({},e.schema.getTextBlockElements()),{td:{},th:{},li:{},dt:{},dd:{},figcaption:{},caption:{},details:{},summary:{}}),i=(a=Nt.fromDom(n),s=function(e){return zc(e.dom)},((c=(u=a).dom).parentNode?Nr(Nt.fromDom(c.parentNode),function(e){return!je(u,e)&&s(e)}):ve.none()).isSome());return se(o,r)&&Wr(Nt.fromDom(n.parentNode),!1)&&!i}var a,u,s,c}(S,A,e,i))return s=null,void(ll(A)&&x.remove(e));if(ll(A)&&A.wrapper&&hp(S,e,E,N))s=null;else{if(f&&!t&&ll(A)&&!A.wrapper&&tl(S,r)&&nl(S,i,d)){var a=x.rename(e,d);return k(a),w.push(a),void(s=null)}if(fl(A)){var u=g(_,e);if(!u&&V(o)&&ml(A)&&(u=g(_,o)),!dl(A)||u)return void(s=null)}!f||t||!nl(S,d,r)||!nl(S,i,d)||!l&&jn(e)&&xo(e.data)||zc(e)||dl(A)&&x.isBlock(e)?(s=null,Y(xe(e.childNodes),c),t&&(f=n),s=null):(s||(s=x.clone(m,!1),e.parentNode.insertBefore(s,e),w.push(s)),s.appendChild(e))}};Y(e,c)}),!0===A.links&&Y(w,function(e){var t=function(e){"A"===e.nodeName&&k(e,A),Y(xe(e.childNodes),t)};t(e)}),Y(w,function(e){var n,t,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=(n=0,Y(e.childNodes,function(e){var t;V(t=e)&&jn(t)&&0===t.length||Yc(e)||n++}),n);function C(e){var t;1===e.nodeType&&e.parentNode&&1===e.parentNode.nodeType&&(t=ul(m,e.parentNode),m.getStyle(e,"color")&&t?m.setStyle(e,"text-decoration",t):m.getStyle(e,"text-decoration")===t&&m.setStyle(e,"text-decoration",null))}!(1t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){V(e)?(s.inline?Gf:Qf)(s,e,t):Zf(s,p(),t)},placeCaretAt:function(e,t){return h(wf(e,t,s.getDoc()))},getBoundingClientRect:function(){var e=p();return e.collapsed?as.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){u=l=f=null,y.destroy()}},b=Fl(v),y=Cf(v,s);function C(t,e){return M(e,function(e){return o.is(e,t)})}function x(e){return o.getParents(e,null,o.getRoot())}return v.bookmarkManager=b,v.controlSelection=y,v}function Ih(e,t){var n,r,a,u,o=ro();t.convert_fonts_to_spans&&(r=e,a=o,u=Et.explode(t.font_size_legacy_values),r.addNodeFilter("font",function(e){Y(e,function(e){var t,n=a.parse(e.attr("style")),r=e.attr("color"),o=e.attr("face"),i=e.attr("size");r&&(n.color=r),o&&(n["font-family"]=o),i&&(n["font-size"]=u[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",a.serialize(n)),t=e,Y(["color","face","size"],function(e){t.attr(e,null)})})})),n=o,e.addNodeFilter("strike",function(e){Y(e,function(e){var t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))})})}function Mh(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return{type:t=r?r[1]:t,data:n[1]}}function Fh(e,t){var n;try{n=atob(t)}catch(e){return ve.none()}for(var r=new Uint8Array(n.length),o=0;o)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")},r=e.length;r--;){var o,i=e[r],a=i.firstChild?i.firstChild.value:"";"script"===t?((o=i.attr("type"))&&i.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0")):"xhtml"===s.element_format&&0)\s*/g,"$1"),Et.map(s.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=Et.map(e.split(/(?:~\+|~|\+)/),Yv),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[],f=l.length?(l[0].name||(l[0].name=c),c=e.selector,Xv(l,n)):Xv([c],n),d=dy.select(c,f)[0]||f.firstChild;return fy(e.styles,function(e,t){var n=a(e);n&&dy.setStyle(d,t,n)}),fy(e.attributes,function(e,t){var n=a(e);n&&dy.setAttrib(d,t,n)}),fy(e.classes,function(e){var t=a(e);dy.hasClass(d,t)||dy.addClass(d,t)}),n.fire("PreviewFormats"),dy.setStyles(f,{position:"absolute",left:-65535}),n.getBody().appendChild(f),r=dy.getStyle(n.getBody(),"fontSize",!0),r=/px$/.test(r)?parseInt(r,10):0,fy(i.split(" "),function(e){var t=dy.getStyle(d,e,!0);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=dy.getStyle(n.getBody(),e,!0),"#ffffff"===dy.toHex(t).toLowerCase())||"color"===e&&"#000000"===dy.toHex(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===r)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*r+"px"}"border"===e&&t&&(o+="padding:0 2px;"),o+=e+":"+t+";"}}),n.fire("AfterPreviewFormats"),dy.remove(f),o}function Jv(c){var e,r,t,n,o,i,a=(n={},(o=function(e,t){e&&(X(e)?(Y(t=!S(t)?[t]:t,function(e){b(e.deep)&&(e.deep=!fl(e)),b(e.split)&&(e.split=!fl(e)||dl(e)),b(e.remove)&&fl(e)&&!dl(e)&&(e.remove="none"),fl(e)&&dl(e)&&(e.mixed=!0,e.block_expand=!0),X(e.classes)&&(e.classes=e.classes.split(/\s+/))}),n[e]=t):ne(e,function(e,t){o(t,e)}))})((r=(e=c).dom,t={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},inherit:!1,defaultBlock:"div",preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all",preserve_attributes:["class","style"]}],italic:[{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all",preserve_attributes:["class","style"]}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all",preserve_attributes:["class","style"]}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"s",remove:"all",preserve_attributes:["class","style"]}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",toggle:!1,styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",toggle:!1,styles:{fontSize:"%value"},clear_child_styles:!0},lineheight:{selector:"h1,h2,h3,h4,h5,h6,p,li,td,th,div",defaultBlock:"p",styles:{lineHeight:"%value"}},fontsize_class:{inline:"span",attributes:{class:"%value"}},blockquote:{block:"blockquote",wrapper:!0,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(e,t,n){return zn(e)&&e.hasAttribute("href")},onformat:function(n,e,t){Et.each(t,function(e,t){r.setAttrib(n,t,e)})}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":function(e){var t;return null!==(t=null==e?void 0:e.customValue)&&void 0!==t?t:null}}},removeformat:[{selector:"b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]},Et.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd samp".split(/\s/),function(e){t[e]={block:e,remove:"all"}}),t)),o(e.getParam("formats")),{get:function(e){return V(e)?n[e]:n},has:function(e){return Ne(n,e)},register:o,unregister:function(e){return e&&n[e]&&delete n[e],n}}),l=ru(null);return function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])}(c),(i=c).on("mouseup keydown",function(e){var t=i,n=e.keyCode,r=t.selection,o=t.getBody();Fg(t,null,!1),8!==n&&46!==n||!r.isCollapsed()||r.getStart().innerHTML!==vp||Fg(t,Hc(o,r.getStart())),37!==n&&39!==n||Fg(t,Hc(o,r.getStart()))}),{get:a.get,has:a.has,register:a.register,unregister:a.unregister,apply:function(e,t,n){var r=e,o=t,i=n;hh(c).formatter.apply(r,o,i)},remove:function(e,t,n,r){var o=e,i=t,a=n,u=r;hh(c).formatter.remove(o,i,a,u)},toggle:function(e,t,n){var r=e,o=t,i=n;hh(c).formatter.toggle(r,o,i)},match:function(e,t,n,r){return o=e,i=t,a=n,u=r,hh(c).formatter.match(o,i,a,u);var o,i,a,u},closest:function(e){return t=e,hh(c).formatter.closest(t);var t},matchAll:function(e,t){return n=e,r=t,hh(c).formatter.matchAll(n,r);var n,r},matchNode:function(e,t,n,r){return o=e,i=t,a=n,u=r,hh(c).formatter.matchNode(o,i,a,u);var o,i,a,u},canApply:function(e){return t=e,hh(c).formatter.canApply(t);var t},formatChanged:function(e,t,n,r){return o=l,i=e,a=t,u=n,s=r,hh(c).formatter.formatChanged(o,i,a,u,s);var o,i,a,u,s},getCssText:A(Gv,c)}}function Qv(e){switch(e.toLowerCase()){case"undo":case"redo":case"mcerepaint":case"mcefocus":return 1;default:return}}function Zv(s){var e,n,r,o,i,c=cu(),l=ru(0),f=ru(0),d={data:[],typing:!1,beforeChange:function(){var e=l,t=c;hh(s).undoManager.beforeChange(e,t)},add:function(e,t){return n=d,r=f,o=l,i=c,a=e,u=t,hh(s).undoManager.add(n,r,o,i,a,u);var n,r,o,i,a,u},undo:function(){return e=d,t=l,n=f,hh(s).undoManager.undo(e,t,n);var e,t,n},redo:function(){return e=f,t=d.data,hh(s).undoManager.redo(e,t);var e,t},clear:function(){var e=d,t=f;hh(s).undoManager.clear(e,t)},reset:function(){var e=d;hh(s).undoManager.reset(e)},hasUndo:function(){return e=d,t=f,hh(s).undoManager.hasUndo(e,t);var e,t},hasRedo:function(){return e=d,t=f,hh(s).undoManager.hasRedo(e,t);var e,t},transact:function(e){return t=d,n=l,r=e,hh(s).undoManager.transact(t,n,r);var t,n,r},ignore:function(e){var t=l,n=e;hh(s).undoManager.ignore(t,n)},extra:function(e,t){var n=d,r=f,o=e,i=t;hh(s).undoManager.extra(n,r,o,i)}};return mh(s)||(r=d,o=l,i=ru(!1),(n=s).on("init",function(){r.add()}),n.on("BeforeExecCommand",function(e){Qv(e.command)||(fh(r,o),r.beforeChange())}),n.on("ExecCommand",function(e){Qv(e.command)||a(e)}),n.on("ObjectResizeStart cut",function(){r.beforeChange()}),n.on("SaveContent ObjectResized blur",a),n.on("dragend",a),n.on("keyup",function(e){var t=e.keyCode;e.isDefaultPrevented()||((33<=t&&t<=36||37<=t&&t<=40||45===t||e.ctrlKey)&&(a(),n.nodeChanged()),46!==t&&8!==t||n.nodeChanged(),i.get()&&r.typing&&!1===sh(oh(n),r.data[0])&&(!1===n.isDirty()&&(n.setDirty(!0),n.fire("change",{level:r.data[0],lastLevel:null})),n.fire("TypingUndo"),i.set(!1),n.nodeChanged()))}),n.on("keydown",function(e){var t,n=e.keyCode;e.isDefaultPrevented()||(33<=n&&n<=36||37<=n&&n<=40||45===n?r.typing&&a(e):(t=e.ctrlKey&&!e.altKey||e.metaKey,!(n<16||20t}}function jy(t){return function(e){return e.line===t}}function Vy(e,t){return Math.abs(e.left-t)}function qy(e,t){return Math.abs(e.right-t)}function $y(e,t){return e>=t.left&&e<=t.right}function Wy(e,t){return e>=t.top&&e<=t.bottom}function Ky(e,o,i){return void 0===i&&(i=w),me(e,function(e,t){if($y(o,t))return i(t)?t:e;if($y(o,e))return i(e)?e:t;var n=Math.min(Vy(e,o),qy(e,o)),r=Math.min(Vy(t,o),qy(t,o));return r===n&&se(t,"node")&&MC(t.node)||r'),o=i,1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse()))}function R0(t,e){return n=t,r=e?ic.Forwards:ic.Backwards,o=n.selection.getRng(),Qy(n,r,o,ep,tp,VC).orThunk(function(){return A0(n,r,o),ve.none()}).exists(function(e){return Gy(t,e),!0});var n,r,o}function D0(t,e){return r=e?1:-1,o=(n=t).selection.getRng(),Zy(n,r,o,function(e){return ep(e)||Qg(e)},function(e){return tp(e)||Zg(e)},VC).orThunk(function(){return A0(n,r,o),ve.none()}).exists(function(e){return Gy(t,e),!0});var n,r,o}function T0(e,t){return e0(e,t,t?tp:ep)}function O0(e){return D(["figcaption"],kt(e))}function B0(e){var t=document.createRange();return t.setStartBefore(e.dom),t.setEndBefore(e.dom),t}function P0(e,t,n){(n?Pn:Wt)(e,t)}function L0(h,v){var b=Nt.fromDom(h.getBody()),y=as.fromRangeStart(h.selection.getRng()),C=Ss(h),x=Es(h),e=y,t=A(je,b);return pr(Nt.fromDom(e.container()),lo,t).filter(O0).exists(function(){if(d=b,m=y,v?(p=d.dom,My(p,m).breakAt.isNone()):(g=d.dom,Iy(g,m).breakAt.isNone())){var e=(t=b,r=x,o=v,""===(n=C)?(l=o,P0(t,f=Nt.fromTag("br"),l),B0(f)):(i=t,a=o,u=r,s=Nt.fromTag(n),c=Nt.fromTag("br"),hn(s,u),Pn(s,c),P0(i,s,a),B0(c)));return h.selection.setRng(e),!0}var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p;return!1})}function I0(e,t){return!!e.selection.isCollapsed()&&L0(e,t)}function M0(e){for(var t=[],n=1;nm.childNodes.length-1,m=m.childNodes[Math.min(g,m.childNodes.length-1)]||m,g=s&&jn(m)?m.nodeValue.length:0);var b,y,C,x,w,S,p,E,N,k,_,A,R,D,T,O,B,P,L,I,M,F=aC(c,m);F&&((p&&!h||!p&&h)&&(m=function(e,t,n,r){var o,i,a,u,s,c,l=p||"P",f=e.dom,d=aC(f,n),m=f.getParent(n,f.isBlock);if(!m||!oC(f,m)){if(s=((m=m||d)===e.getBody()||(c=m)&&/^(TD|TH|CAPTION)$/.test(c.nodeName)?m:m.parentNode).nodeName.toLowerCase(),!m.hasChildNodes())return uC(e,o=f.create(l)),m.appendChild(o),t.setStart(o,0),t.setEnd(o,0),o;for(a=n;a.parentNode!==m;)a=a.parentNode;for(;a&&!f.isBlock(a);)a=(i=a).previousSibling;if(i&&e.schema.isValidChild(s,l.toLowerCase())){for(uC(e,o=f.create(l)),i.parentNode.insertBefore(o,i),a=i;a&&!f.isBlock(a);)u=a.nextSibling,o.appendChild(a),a=u;t.setStart(n,r),t.setEnd(n,r)}}return n}(a,d,m,g)),y=(b=c.getParent(m,c.isBlock))?c.getParent(b.parentNode,c.isBlock):null,C=b?b.nodeName.toUpperCase():"","LI"!==(x=y?y.nodeName.toUpperCase():"")||v||(y=(b=y).parentNode,C=x),/^(LI|DT|DD)$/.test(C)&&c.isEmpty(b)?(N=t,k=y,_=b,A=p,I=(E=a).dom,M=E.selection.getRng(),k!==E.getBody()&&(D=(A=Z0(R=k)&&Z0(R.parentNode)?"LI":A)?N(A):I.create("BR"),tC(k,_,!0)&&tC(k,_,!1)?Q0(k,"LI")?(T=eC(k),I.insertAfter(D,T),(null===(L=(P=k).parentNode)||void 0===L?void 0:L.firstChild)===P?I.remove(T):I.remove(k)):I.replace(D,k):(tC(k,_,!0)?Q0(k,"LI")?(I.insertAfter(D,eC(k)),D.appendChild(I.doc.createTextNode(" ")),D.appendChild(k)):k.parentNode.insertBefore(D,k):tC(k,_,!1)?I.insertAfter(D,eC(k)):(k=eC(k),(O=M.cloneRange()).setStartAfter(_),O.setEndAfter(k),B=O.extractContents(),"LI"===A&&(B.firstChild&&"LI"===B.firstChild.nodeName)?(D=B.firstChild,I.insertAfter(B,k)):(I.insertAfter(B,k),I.insertAfter(D,k))),I.remove(_)),G0(E,D))):p&&b===a.getBody()||(p=p||"P",Pr(b)?(u=zr(b),c.isEmpty(b)&&nC(b),uC(a,u),G0(a,u)):n()?r():n(!0)?(u=b.parentNode.insertBefore(t(),b),G0(a,rC(b,"HR")?u:b)):((S=(w=d).cloneRange()).setStart(w.startContainer,iC(!0,w.startContainer,w.startOffset)),S.setEnd(w.endContainer,iC(!1,w.endContainer,w.endOffset)),(o=S.cloneRange()).setEndAfter(b),i=o.extractContents(),Y(Hu(Nt.fromDom(i),_n),function(e){var t=e.dom;t.nodeValue=wo(t.nodeValue)}),function(e){for(;jn(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(i),u=i.firstChild,c.insertAfter(i,b),function(e,t){var n,r,o=u,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;zn(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(n=i.length;n--;)!(o=i[n]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(r=o)&&"A"===r.nodeName&&e.isEmpty(r)&&e.remove(o)}}(c,f),function(e,t){t.normalize();var n=t.lastChild;n&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")}(c,b),c.isEmpty(b)&&nC(b),u.normalize(),c.isEmpty(u)?(c.remove(u),r()):(uC(a,u),G0(a,u))),c.setAttrib(u,"id",""),a.fire("NewBlock",{newBlock:u})))}function cC(e,t,n){var r=e.dom.createRng();n?(r.setStartBefore(t),r.setEndBefore(t)):(r.setStartAfter(t),r.setEndAfter(t)),e.selection.setRng(r),Zf(e,r)}function lC(e,t){var n=Nt.fromTag("br");qt(Nt.fromDom(t),n),e.undoManager.add()}function fC(e,t){XC(e.getBody(),t)||$t(Nt.fromDom(t),Nt.fromTag("br"));var n=Nt.fromTag("br");$t(Nt.fromDom(t),n),cC(e,n.dom,!1),e.undoManager.add()}function dC(e){return e&&"A"===e.nodeName&&"href"in e}function mC(e){return e.fold(R,dC,dC,R)}function gC(e,t){t.fold(te,A(lC,e),A(fC,e),te)}function pC(e,t){var n,r,o,i=(r=A(nb,n=e),o=as.fromRangeStart(n.selection.getRng()),Qb(r,n.getBody(),o).filter(mC));i.isSome()?i.each(A(gC,e)):function(e,t){var n,r,o=e.selection,i=e.dom,a=o.getRng();Rf(i,a).each(function(e){a.setStart(e.startContainer,e.startOffset),a.setEnd(e.endContainer,e.endOffset)});var u,s=a.startOffset,c=a.startContainer;1===c.nodeType&&c.hasChildNodes()&&(u=s>c.childNodes.length-1,c=c.childNodes[Math.min(s,c.childNodes.length-1)]||c,s=u&&3===c.nodeType?c.nodeValue.length:0);var l=i.getParent(c,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",m=!(!t||!t.ctrlKey);"LI"!==d||m||(l=f),c&&3===c.nodeType&&s>=c.nodeValue.length&&!function(e){for(var t,n=new Rr(c,l),r=e.getNonEmptyElements();t=n.next();)if(r[t.nodeName.toLowerCase()]||0t}),WC=A(V0,Iy),KC=A(V0,My),XC=function(e,t){return n=as.after(t),!!Wn(n.getNode())||Ql(e,as.after(t)).map(function(e){return Wn(e.getNode())}).getOr(!1);var n},YC=or([{br:[]},{block:[]},{none:[]}]),GC=dt().browser,JC=dt(),QC=A(TC,yo),ZC=A(TC," "),e1=(t1.prototype.nodeChanged=function(e){var t,n,r,o=this.editor.selection;this.editor.initialized&&o&&!this.editor.getParam("disable_nodechange")&&!this.editor.mode.isReadOnly()&&(r=this.editor.getBody(),(t=o.getStart(!0)||r).ownerDocument===this.editor.getDoc()&&this.editor.dom.isChildOf(t,r)||(t=r),n=[],this.editor.dom.getParent(t,function(e){return e===r||void n.push(e)}),(e=e||{}).element=t,e.parents=n,this.editor.fire("NodeChange",e))},t1.prototype.isSameElementPath=function(e){var t,n=this.editor.$(e).parentsUntil(this.editor.getBody()).add(e);if(n.length===this.lastPath.length){for(t=n.length;0<=t&&n[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=n,!0}return this.lastPath=n,!1},t1);function t1(r){var o;this.lastPath=[],this.editor=r;var t=this;"onselectionchange"in r.getDoc()||r.on("NodeChange click mouseup keyup focus",function(e){var t=r.selection.getRng(),n={startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset};"nodechange"!==e.type&&Sf(n,o)||r.fire("SelectionChange"),o=n}),r.on("contextmenu",function(){r.fire("SelectionChange")}),r.on("SelectionChange",function(){var e=r.selection.getStart(!0);!e||!xt.range&&r.selection.isCollapsed()||Tl(r)&&!t.isSameElementPath(e)&&r.dom.isChildOf(e,r.getBody())&&r.nodeChanged({selectionChange:!0})}),r.on("mouseup",function(e){!e.isDefaultPrevented()&&Tl(r)&&("IMG"===r.selection.getNode().nodeName?_r.setEditorTimeout(r,function(){r.nodeChanged()}):r.nodeChanged())})}function n1(e){return zn(e)&&fo(Nt.fromDom(e))}function r1(e){var t=e.getBoundingClientRect(),n=e.ownerDocument,r=n.documentElement,o=n.defaultView;return{top:t.top+o.pageYOffset-r.clientTop,left:t.left+o.pageXOffset-r.clientLeft}}function o1(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function i1(e,S){var E=_r.throttle(function(e,t){S._selectionOverrides.hideFakeCaret(),S.selection.placeCaretAt(e,t)},0);return S.on("remove",E.stop),function(w){return e.on(function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x=Math.max(Math.abs(w.screenX-e.screenX),Math.abs(w.screenY-e.screenY));if(!e.dragging&&10').attr("id",w)).appendTo(l.getBody());var i=y.createRng();t===n&&xt.ie?(o.empty().append('

    \xa0

    ').append(t),i.setStartAfter(o[0].firstChild.firstChild),i.setEndAfter(t)):(o.empty().append(yo).append(t).append(yo),i.setStart(o[0].firstChild,1),i.setEnd(o[0].lastChild,0)),o.css({top:y.getPos(e,l.getBody()).y}),o[0].focus();var a=b.getSel();return a.removeAllRanges(),a.addRange(i),i}(e,n.targetClone,t),o=Nt.fromDom(e);return Y(hu(Nt.fromDom(l.getBody()),"*[data-mce-selected]"),function(e){je(o,e)||yn(e,S)}),y.getAttrib(e,S)||e.setAttribute(S,"1"),v=e,E(),r}(c)}return null}function h(){v&&v.removeAttribute(S),vr(Nt.fromDom(l.getBody()),"#"+w).each(Ln),v=null}var v,n,e,o,b=l.selection,y=l.dom,C=y.isBlock,x=l.getBody(),i=Vs(l,x,C,function(){return vd(l)}),w="sel-"+y.uniqueId(),S="data-mce-selected",r=b.getRng,E=function(){i.hide()};return xt.ceFalse&&!mh(l)&&(l.on("mouseup",function(e){var t=r();t.collapsed&&av(l,e.clientX,e.clientY)&&Sb(l,t,!1).each(d)}),l.on("click",function(e){var t=s1(l,e.target);t&&(P1(t)&&(e.preventDefault(),l.focus()),B1(t)&&y.isChildOf(t,b.getNode())&&h())}),l.on("blur NewBlock",h),l.on("ResizeWindow FullscreenStateChanged",i.reposition),l.on("tap",function(e){var t=e.target,n=s1(l,t);P1(n)?(e.preventDefault(),wb(l,n).each(p)):f(t)&&wb(l,t).each(p)},!0),l.on("mousedown",function(e){var t,n,r,o,i,a,u,s=e.target;s!==x&&"HTML"!==s.nodeName&&!y.isChildOf(s,x)||!1===av(l,e.clientX,e.clientY)||((t=s1(l,s))?P1(t)?(e.preventDefault(),wb(l,t).each(p)):(h(),B1(t)&&e.shiftKey||hf(e.clientX,e.clientY,b.getRng())||(E(),b.placeCaretAt(e.clientX,e.clientY))):f(s)?wb(l,s).each(p):!1===$s(s)&&(h(),E(),(n=Yy(x,e.clientX,e.clientY))&&(r=s,o=n.node,a=y.getParent(r,C),u=y.getParent(o,C),!K(a)&&(r!==u&&y.isChildOf(a,u)&&!1===P1(s1(l,a))||!y.isChildOf(u,a)&&(i=u,y.getParent(a,C)!==y.getParent(i,C))&&function(e){var t=e.firstChild;if(!K(t)){var n=as.before(t);if(Wn(n.getNode())&&1===e.childNodes.length)return!c(n);var r=Pc(e).next(n);return r&&!c(r)}}(a))||(e.preventDefault(),d(m(1,n.node,n.before,!1)),l.getBody().focus()))))}),l.on("keypress",function(e){Bf.modifierPressed(e)||P1(b.getNode())&&e.preventDefault()}),l.on("GetSelectionRange",function(e){var t=e.range;v&&(v.parentNode?((t=t.cloneRange()).selectNode(v),e.range=t):v=null)}),l.on("SetSelectionRange",function(e){var t,n,r,o,i,a,u;e.range=(t=e.range,n=l.schema.getShortEndedElements(),r=y.createRng(),o=t.startContainer,i=t.startOffset,a=t.endContainer,u=t.endOffset,Ne(n,o.nodeName.toLowerCase())?0===i?r.setStartBefore(o):r.setStartAfter(o):r.setStart(o,i),Ne(n,a.nodeName.toLowerCase())?0===u?r.setEndBefore(a):r.setEndAfter(a):r.setEnd(a,u),r);var s=p(e.range,e.forward);s&&(e.range=s)}),l.on("AfterSetSelectionRange",function(e){var t=e.range,n=t.startContainer.parentNode;g(t)||"mcepastebin"===n.id||E(),y.hasClass(n,"mce-offscreen-selection")||h()}),l.on("copy",function(e){var t,n,r=e.clipboardData;e.isDefaultPrevented()||!e.clipboardData||xt.ie||(t=(n=y.get(w))&&n.getElementsByTagName("*")[0])&&(e.preventDefault(),r.clearData(),r.setData("text/html",t.outerHTML),r.setData("text/plain",t.outerText||t.innerText))}),u1(l),e=lu(function(){var e,t;n.removed||!n.getBody().contains(document.activeElement)||(e=n.selection.getRng()).collapsed&&(t=Eb(n,e,!1),n.selection.setRng(t))},0),(n=l).on("focus",function(){e.throttle()}),n.on("blur",function(){e.cancel()}),(o=l).on("init",function(){o.on("focusin",function(e){var t,n,r=e.target;Jn(r)&&(t=pf(o.getBody(),r),n=Yn(t)?t:r,o.selection.getNode()!==n&&wb(o,n).each(function(e){return o.selection.setRng(e)}))})})),{showCaret:m,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(zr(e),d(r()),b.scrollIntoView(e))},hideFakeCaret:E,destroy:function(){i.destroy(),v=null}}}function l1(a){function e(e,t){try{a.getDoc().execCommand(e,!1,t)}catch(e){}}function u(e){return e.isDefaultPrevented()}function t(){a.shortcuts.add("meta+a",null,"SelectAll")}function n(){a.inline||b.bind(a.getDoc(),"mousedown mouseup",function(e){var t;e.target===a.getDoc().documentElement&&(t=y.getRng(),a.getBody().focus(),"mousedown"===e.type?Ir(t.startContainer)||y.placeCaretAt(e.clientX,e.clientY):y.setRng(t))})}function r(){Range.prototype.getClientRects||a.on("mousedown",function(e){var t;u(e)||"HTML"!==e.target.nodeName||((t=a.getBody()).blur(),_r.setEditorTimeout(a,function(){t.focus()}))})}function o(){a.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==b.getContentEditableParent(t)&&(e.preventDefault(),a.selection.select(t),a.nodeChanged()),"A"===t.nodeName&&b.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),y.select(t))})}function i(){a.on("keydown",function(e){if(!u(e)&&e.keyCode===h&&y.isCollapsed()&&0===y.getRng().startOffset){var t=y.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function s(){a.getParam("readonly")||a.on("BeforeExecCommand mousedown",function(){e("StyleWithCSS",!1),e("enableInlineTableEditing",!1),Ts(a)||e("enableObjectResizing",!1)})}function c(){a.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function l(){a.inline||a.on("keydown",function(){document.activeElement===document.body&&a.getWin().focus()})}function f(){a.inline||(a.contentStyles.push("body {min-height: 150px}"),a.on("click",function(e){var t;"HTML"===e.target.nodeName&&(11")+"";e.getParam("document_base_url","")!==e.documentBaseUrl&&(t+=''),t+='';var n=xs(e,"body_id","tinymce"),r=xs(e,"body_class","");return ws(e)&&(t+=''),t+('
    '}(e),I1.add(t.iframeContainer,u),s}function y1(e){return e.replace(/^\-/,"")}function C1(e){return{editorContainer:e,iframeContainer:e,api:{}}}function x1(e){var t,n,r,o,i,a,u,s=e.getElement();return e.orgDisplay=s.style.display,X(Bs(e))?e.theme.renderUI():y(Bs(e))?(n=(t=e).getElement(),(r=Bs(t)(t,n)).editorContainer.nodeType&&(r.editorContainer.id=r.editorContainer.id||t.id+"_parent"),r.iframeContainer&&r.iframeContainer.nodeType&&(r.iframeContainer.id=r.iframeContainer.id||t.id+"_iframecontainer"),r.height=r.iframeHeight||n.offsetHeight,r):(u=(o=e).getElement(),o.inline?C1(null):(i=u,a=M1.create("div"),M1.insertAfter(a,i),C1(a)))}function w1(e){var n,t,r,o,i,a,u,s;e.fire("ScriptsLoaded"),n=e,t=Et.trim(ks(n)),r=n.ui.registry.getAll().icons,ne(_e(_e({},_v.get("default").icons),_v.get(t).icons),function(e,t){Ne(r,t)||n.ui.registry.addIcon(t,e)}),a=Bs(o=e),X(a)?(o.settings.theme=y1(a),i=Bv.get(a),o.theme=new i(o,Bv.urls[a]),o.theme.init&&o.theme.init(o,Bv.urls[a]||o.documentBaseUrl.replace(/\/$/,""),o.$)):o.theme={},s=[],Et.each(Ls(u=e).split(/[ ,]/),function(e){F1(u,s,y1(e))});var c=x1(e),l=e,f=ve.from(c.api).getOr({}),d={show:ve.from(f.show).getOr(te),hide:ve.from(f.hide).getOr(te),disable:ve.from(f.disable).getOr(te),isDisabled:ve.from(f.isDisabled).getOr(R),enable:function(){l.mode.isReadOnly()||ve.from(f.enable).map(x)}};l.ui=_e(_e({},l.ui),d);var m,g,p,h={editorContainer:c.editorContainer,iframeContainer:c.iframeContainer};return e.editorContainer=h.editorContainer||null,zv(e),e.inline?v1(e):(p=b1(m=e,g=h),g.editorContainer&&(I1.get(g.editorContainer).style.display=m.orgDisplay,m.hidden=I1.isHidden(g.editorContainer)),m.getElement().style.display="none",I1.setAttrib(m.id,"aria-hidden","true"),void(p||v1(m)))}function S1(e){return"-"===e.charAt(0)}function E1(t,e,n){return ve.from(e).filter(function(e){return 0")},mceToggleVisualAid:function(){u.hasVisual=!u.hasVisual,u.addVisual()},mceReplaceContent:function(e,t,n){u.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,u.selection.getContent({format:"text"})))},mceInsertLink:function(e,t,n){"string"==typeof n&&(n={href:n});var r=u.dom.getParent(u.selection.getNode(),"a");n.href=n.href.replace(/ /g,"%20"),r&&n.href||u.formatter.remove("link"),n.href&&u.formatter.apply("link",n,r)},selectAll:function(){var e,t=u.dom.getParent(u.selection.getStart(),Xn);t&&((e=u.dom.createRng()).selectNodeContents(t),u.selection.setRng(e))},mceNewDocument:function(){u.setContent("")},InsertLineBreak:function(e,t,n){return pC(u,n),!0}}),o.addCommands({JustifyLeft:e("alignleft"),JustifyCenter:e("aligncenter"),JustifyRight:e("alignright"),JustifyFull:e("alignjustify"),"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return o.isFormatMatch(e)},mceBlockQuote:function(){return o.isFormatMatch("blockquote")},Outdent:function(){return b0(u)},"InsertUnorderedList,InsertOrderedList":function(e){var t=u.dom.getParent(u.selection.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),o.addCommands({Undo:function(){u.undoManager.undo()},Redo:function(){u.undoManager.redo()}}),o.addQueryValueHandler("FontName",function(){return A1(t=u,function(e){return j1(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("FontSize",function(){return A1(t=u,function(e){return H1(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("LineHeight",function(){return A1(t=u,function(n){var e=Nt.fromDom(t.getBody());return Ag(n,function(e){return wn(e,"line-height")},A(je,e)).getOrThunk(function(){var e=parseFloat(xn(n,"line-height")),t=parseFloat(xn(n,"font-size"));return String(e/t)})}).getOr("");var t},this)},K1);function K1(e){this.commands={state:{},exec:{},value:{}},this.editor=e,this.setupCommands(e)}function X1(e,t,n){var r,o,i,a,u,s;pu(e,t)&&!1===n?(o=t,mu(r=e)?r.dom.classList.remove(o):(u=o,0<(s=U(du(a=r,"class"),function(e){return e!==u})).length?pn(a,"class",s.join(" ")):yn(a,"class")),0===(mu(i=r)?i.dom.classList:du(i,"class")).length&&yn(i,"class")):n&&gu(e,t)}function Y1(e,t,n){try{e.getDoc().execCommand(t,!1,String(n))}catch(e){}}function G1(e,t){e.dom.contentEditable=t?"true":"false"}function J1(e,t){var n,r,o=Nt.fromDom(e.getBody());X1(o,"mce-content-readonly",t),t?(e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),ve.from(e.selection.getNode()).each(function(e){e.removeAttribute("data-mce-selected")}),G1(o,!(e.readonly=!0)),Y(hu(o,'*[contenteditable="true"]'),function(e){pn(e,ex,"true"),G1(e,!1)})):(G1(o,!(e.readonly=!1)),Y(hu(o,"*["+ex+'="true"]'),function(e){yn(e,ex),G1(e,!0)}),Y1(e,"StyleWithCSS",!1),Y1(e,"enableInlineTableEditing",!1),Y1(e,"enableObjectResizing",!1),(vd(n=e)||(r=n,td(Bn(Nt.fromDom(r.getElement()))).filter(function(e){return!(void 0!==(t=e.dom.classList)&&(t.contains("tox-edit-area")||t.contains("tox-edit-area__iframe")||t.contains("mce-content-body")))&&dd(r,e.dom);var t}).isSome()))&&e.focus(),e.selection.setRng(e.selection.getRng()),e.nodeChanged())}function Q1(e){return e.readonly}function Z1(t){t.parser.addAttributeFilter("contenteditable",function(e){Q1(t)&&Y(e,function(e){e.attr(ex,e.attr("contenteditable")),e.attr("contenteditable","false")})}),t.serializer.addAttributeFilter(ex,function(e){Q1(t)&&Y(e,function(e){e.attr("contenteditable",e.attr(ex))})}),t.serializer.addTempAttr(ex)}var ex="data-mce-contenteditable",tx=Et.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," "),nx=(rx.isNative=function(e){return!!tx[e.toLowerCase()]},rx.prototype.fire=function(e,t){var n=e.toLowerCase(),r=io(n,t||{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(r);var o=this.bindings[n];if(o)for(var i=0,a=o.length;i"),cx);return o[o.length-1]=Et.extend(o[o.length-1],{func:n,scope:r||this.editor}),Et.extend(o[0],{desc:this.editor.translate(t),subpatterns:o.slice(1)})},Cx.prototype.hasModifier=function(e){return e.altKey||e.ctrlKey||e.metaKey},Cx.prototype.isFunctionKey=function(e){return"keydown"===e.type&&112<=e.keyCode&&e.keyCode<=123},Cx.prototype.matchShortcut=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},Cx.prototype.executeShortcutAction=function(e){return e.func?e.func.call(e.scope):null},Cx);function Cx(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;var n=this;e.on("keyup keypress keydown",function(t){!n.hasModifier(t)&&!n.isFunctionKey(t)||t.isDefaultPrevented()||(px(n.shortcuts,function(e){if(n.matchShortcut(t,e))return n.pendingPatterns=e.subpatterns.slice(0),"keydown"===t.type&&n.executeShortcutAction(e),!0}),n.matchShortcut(t,n.pendingPatterns[0])&&(1===n.pendingPatterns.length&&"keydown"===t.type&&n.executeShortcutAction(n.pendingPatterns[0]),n.pendingPatterns.shift()))})}var xx=Ja.DOM,wx=Et.extend,Sx=Et.each,Ex=Et.resolve,Nx=xt.ie,kx=(_x.prototype.render=function(){!function(t){var e=t.id;uu.setCode(As(t));var n,r,o,i,a=function(){U1.unbind(window,"ready",a),t.render()};ai.Event.domLoaded?t.getElement()&&xt.contentEditable&&(n=Nt.fromDom(t.getElement()),r=L(n.dom.attributes,function(e,t){return e[t.name]=t.value,e},{}),t.on("remove",function(){O(n.dom.attributes,function(e){return yn(n,e.name),0}),hn(n,r)}),t.ui.styleSheetLoader=Ar.forElement(n,{contentCssCors:(o=t).getParam("content_css_cors"),referrerPolicy:_s(o)}),t.getParam("inline")?t.inline=!0:(t.orgVisibility=t.getElement().style.visibility,t.getElement().style.visibility="hidden"),(i=t.getElement().form||U1.getParent(e,"form"))&&(t.formElement=i,t.getParam("hidden_input")&&!Hn(t.getElement())&&(U1.insertAfter(U1.create("input",{type:"hidden",name:e}),e),t.hasHiddenInput=!0),t.formEventDelegate=function(e){t.fire(e.type,e)},U1.bind(i,"submit reset",t.formEventDelegate),t.on("reset",function(){t.resetContent()}),!t.getParam("submit_patch")||i.submit.nodeType||i.submit.length||i._mceOldSubmit||(i._mceOldSubmit=i.submit,i.submit=function(){return t.editorManager.triggerSave(),t.setDirty(!1),i._mceOldSubmit(i)})),t.windowManager=Pv(t),t.notificationManager=uv(t),"xml"===t.getParam("encoding")&&t.on("GetContent",function(e){e.save&&(e.content=U1.encode(e.content))}),t.getParam("add_form_submit_trigger")&&t.on("submit",function(){t.initialized&&t.save()}),t.getParam("add_unload_trigger")&&(t._beforeUnload=function(){!t.initialized||t.destroyed||t.isHidden()||t.save({format:"raw",no_events:!0,set_dirty:!1})},t.editorManager.on("BeforeUnload",t._beforeUnload)),t.editorManager.add(t),N1(t,t.suffix)):U1.bind(window,"ready",a)}(this)},_x.prototype.focus=function(e){this.execCommand("mceFocus",!1,e)},_x.prototype.hasFocus=function(){return vd(this)},_x.prototype.execCallback=function(e){for(var t=[],n=1;n",visual:!0,font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,inline_styles:!0,convert_fonts_to_spans:!0,indent:!0,indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:v.convertURL,url_converter_scope:v},y=_e(_e({},b),h?kv:{}),!1!==(C=nv(Sv||Ev,Sv,y,m,g)).deprecation_warnings&&Jh(g,C),C),this.settings.suffix&&(n.suffix=this.settings.suffix),this.suffix=n.suffix,this.settings.base_url&&n._setBaseUrl(this.settings.base_url),this.baseUri=n.baseURI,this.settings.referrer_policy&&(tu.ScriptLoader._setReferrerPolicy(this.settings.referrer_policy),Ja.DOM.styleSheetLoader._setReferrerPolicy(this.settings.referrer_policy)),su.languageLoad=this.settings.language_load,su.baseURL=n.baseURL,this.id=e,this.setDirty(!1),this.documentBaseURI=new Kd(this.settings.document_base_url,{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=!!this.settings.inline,this.shortcuts=new yx(this),this.editorCommands=new W1(this),this.settings.cache_suffix&&(xt.cacheSuffix=this.settings.cache_suffix.replace(/^[\?\&]+/,"")),this.ui={registry:{addAutocompleter:(u={},(r={addButton:w(o={},"button"),addGroupToolbarButton:w(o,"grouptoolbarbutton"),addToggleButton:w(o,"togglebutton"),addMenuButton:w(o,"menubutton"),addSplitButton:w(o,"splitbutton"),addMenuItem:w(i={},"menuitem"),addNestedMenuItem:w(i,"nestedmenuitem"),addToggleMenuItem:w(i,"togglemenuitem"),addAutocompleter:w(a={},"autocompleter"),addContextMenu:w(s={},"contextmenu"),addContextToolbar:w(c={},"contexttoolbar"),addContextForm:w(c,"contextform"),addSidebar:w(l={},"sidebar"),addIcon:function(e,t){return u[e.toLowerCase()]=t},getAll:function(){return{buttons:o,menuItems:i,icons:u,popups:a,contextMenus:s,contextToolbars:c,sidebars:l}}}).addAutocompleter),addButton:r.addButton,addContextForm:r.addContextForm,addContextMenu:r.addContextMenu,addContextToolbar:r.addContextToolbar,addIcon:r.addIcon,addMenuButton:r.addMenuButton,addMenuItem:r.addMenuItem,addNestedMenuItem:r.addNestedMenuItem,addSidebar:r.addSidebar,addSplitButton:r.addSplitButton,addToggleButton:r.addToggleButton,addGroupToolbarButton:r.addGroupToolbarButton,addToggleMenuItem:r.addToggleMenuItem,getAll:r.getAll},styleSheetLoader:void 0,show:te,hide:te,enable:te,disable:te,isDisabled:R};var S,E,N,k,_,A=(k=ru("design"),_=ru({design:{activate:te,deactivate:te,editorReadOnly:!1},readonly:{activate:te,deactivate:te,editorReadOnly:!0}}),(E=S=this).serializer?Z1(E):E.on("PreInit",function(){Z1(E)}),(N=S).on("ShowCaret",function(e){Q1(N)&&e.preventDefault()}),N.on("ObjectSelected",function(e){Q1(N)&&e.preventDefault()}),{isReadOnly:function(){return Q1(S)},set:function(e){return function(e,t,n,r){if(r!==n.get()){if(!Ne(t,r))throw new Error("Editor mode '"+r+"' is invalid");e.initialized?sx(e,n,t,r):e.on("init",function(){return sx(e,n,t,r)})}}(S,_.get(),k,e)},get:function(){return k.get()},register:function(e,t){_.set(function(e,t,n){var r;if(D(gx,t))throw new Error("Cannot override default mode "+t);return _e(_e({},e),((r={})[t]=_e(_e({},n),{deactivate:function(){try{n.deactivate()}catch(e){console.error("problem while deactivating editor mode "+t+":",e)}}}),r))}(_.get(),e,t))}});this.mode=A,this.setMode=A.set,n.fire("SetupEditor",{editor:this}),this.execCallback("setup",this),this.$=Wa.overrideDefaults(function(){return{context:x.inline?x.getBody():x.getDoc(),element:x.getBody()}})}function Ax(t){var n=t.type;Px(Hx.get(),function(e){switch(n){case"scroll":e.fire("ScrollWindow",t);break;case"resize":e.fire("ResizeWindow",t)}})}function Rx(e){e!==Mx&&(e?Wa(window).on("resize scroll",Ax):Wa(window).off("resize scroll",Ax),Mx=e)}function Dx(t){var e=Ux;delete Fx[t.id];for(var n=0;n=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n=Gx(e.x,t.x),r=Gx(e.y,t.y),o=Yx(e.x+e.w,t.x+t.w),i=Yx(e.y+e.h,t.y+t.h);return o-n<0||i-r<0?null:qx(n,r,o-n,i-r)},clamp:function(e,t,n){var r=e.x,o=e.y,i=e.x+e.w,a=e.y+e.h,u=t.x+t.w,s=t.y+t.h,c=Gx(0,t.x-r),l=Gx(0,t.y-o),f=Gx(0,i-u),d=Gx(0,a-s);return r+=c,o+=l,n&&(i+=c,a+=l,r-=f,o-=d),qx(r,o,(i-=f)-r,(a-=d)-o)},create:qx,fromClientRect:function(e){return qx(e.left,e.top,e.width,e.height)}},Zx=($x={},Wx={},{load:function(r,o){var i='Script at URL "'+o+'" failed to load',a='Script at URL "'+o+"\" did not call `tinymce.Resource.add('"+r+"', data)` within 1 second";if(void 0!==$x[r])return $x[r];var e=new kr(function(e,t){var n=function(e,t,n){function r(n){return function(){for(var e=[],t=0;t1400 && window.innerWidth<=1600){ + sideWidth = '85%'; + } + if(window.innerWidth>1000 && window.innerWidth<=1440){ + sideWidth = '92%'; + } + if(window.innerWidth<=1000){ + sideWidth = '93.8%'; + } + var layIndex = layer.open({ + type: 2, + title: false, + offset: 'r', + anim: 'slideLeft', + closeBtn: 0, + content: url, + area: [sideWidth, '100%'], + skin:'layui-layer-gougu-admin', + end: function(){ + $('body').removeClass('right-open'); + if (layui.pageTable) { + layui.pageTable.resize('test'); + } + if(ft){ + ft(); + } + }, + success: function (obj, index) { + var btn = '
    关闭
    '; + obj.append(btn); + $('body').addClass('right-open'); + that.loading = false; + obj.on('click','.express-close', function () { + layer.close(index); + }) + } + }); + return layIndex; + }, + side2: function (url, width, ft) { + let that = this; + if (that.loading == true) { + return false; + } + that.loading = true; + sideWidth = '80%'; + if(window.innerWidth>1400 && window.innerWidth<=1600){ + sideWidth = '85%'; + } + if(window.innerWidth>1000 && window.innerWidth<=1440){ + sideWidth = '92%'; + } + if(window.innerWidth<=1000){ + sideWidth = '93.8%'; + } + var layIndex = layer.open({ + type: 1, + title: false, + offset: 'r', + anim: 'slideLeft', + closeBtn: 0, + content: url, + area: [sideWidth, '100%'], + skin:'layui-layer-gougu-admin', + end: function(){ + $('body').removeClass('right-open'); + if (layui.pageTable) { + layui.pageTable.resize('test'); + } + if(ft){ + ft(); + } + }, + success: function (obj, index) { + var btn = '
    关闭
    '; + obj.append(btn); + $('body').addClass('right-open'); + that.loading = false; + obj.on('click','.express-close', function () { + layer.close(index); + }) + } + }); + return layIndex; + }, + box: function (url,title="内容", width=720,height=405) { + let that = this; + if (that.loading == true) { + return false; + } + that.loading = true; + layer.open({ + type: 2, + title: title, + content: url, + area: [width+'px', height+'px'], + maxmin: true, + end: function(){ + if (layui.pageTable) { + layui.pageTable.resize(); + } + }, + success: function (obj, index) { + var btn = ''; + obj.append(btn); + that.loading = false; + obj.on('click','.express-close', function () { + layer.close(index); + }) + } + }) + }, + //右侧ajax请求的方式打开页面参考勾股DEV + open: function (url, width) { + let that = this; + if (that.loading == true) { + return false; + } + that.loading = true; + var countWidth = window.innerWidth-(window.innerWidth*0.5)+456; + if(window.innerWidth<=1000){ + countWidth = 750; + } + if (width && width > 0) { + sideWidth = width + 'px'; + } + else{ + sideWidth = countWidth + 'px'; + } + $.ajax({ + url: url, + type: "GET", + timeout: 10000, + success: function (res) { + if (res['code'] && res['code'] > 0) { + layer.msg(res.msg); + return false; + } + var express = '
    ' + res + '
    关闭
    '; + + $('body').append(express).addClass('right-open'); + $('#expressMask').fadeIn(200); + $('#expressLayer').animate({ 'right': 0 }, 200, 'linear', function () { + if (typeof (openInit) == "function") { + openInit(); + } + }); + that.loading = false; + + //关闭 + $('body').on('click','.express-close', function () { + $('#expressMask').fadeOut(100); + $('body').removeClass('right-open'); + let op_width = $('#expressLayer').outerWidth(); + $('#expressLayer').animate({ left: '+=' + op_width + 'px' }, 200, 'linear', function () { + $('#expressLayer').remove(); + $('#expressMask').remove(); + if (layui.pageTable) { + layui.pageTable.resize(); + } + }) + }) + $(window).resize(function () { + var resizeWidth = window.innerWidth-(window.innerWidth*0.5)+456; + if(window.innerWidth<=1000){ + resizeWidth = 750; + } + $('#expressLayer').width(resizeWidth); + }) + + } + , error: function (xhr, textstatus, thrown) { + console.log('错误'); + }, + complete: function () { + that.loading = false; + } + }); + }, + load: function (url) { + let that = this; + if (that.loading == true) { + return false; + } + that.loading = true; + $.ajax({ + url: url, + type: "GET", + timeout: 10000, + success: function (res) { + if (res['code'] && res['code'] > 0) { + layer.msg(res.msg); + return false; + } + $('#articleLayer').html(res); + openInit(); + } + , error: function (xhr, textstatus, thrown) { + console.log('错误'); + }, + complete: function () { + that.loading = false; + } + }); + }, + page: function (url) { + let that = this; + if (that.loading == true) { + return false; + } + that.loading = true; + $.ajax({ + url: url, + type: "GET", + timeout: 10000, + success: function (res) { + if (res['code'] && res['code'] > 0) { + layer.msg(res.msg); + return false; + } + $('#pageBox').html(res); + pageInit(); + } + , error: function (xhr, textstatus, thrown) { + console.log('错误'); + }, + complete: function () { + that.loading = false; + } + }); + }, + close: function (delay) { + //延迟关闭,一般是在编辑完页面数据后需要自动关闭页面用到 + if(delay && delay>0){ + setTimeout(function () { + $('.express-close').last().click(); + }, delay); + }else{ + $('.express-close').last().click(); + } + if (layui.pageTable) { + layui.pageTable.reload(); + } + }, + ajax: function (options, callback) { + var format = 'json'; + if (options.hasOwnProperty('data')) { + format = options.data.hasOwnProperty('format') ? options.data.format : 'json'; + } + callback = callback || options.success; + callback && delete options.success; + var optsetting = { timeout: 10000 }; + if (format == 'jsonp') { + optsetting = { timeout: 10000, dataType: 'jsonp', jsonp: 'callback' } + } + var opts = $.extend({}, optsetting, { + success: function (res) { + if (callback && typeof callback === 'function') { + callback(res); + } + } + }, options); + $.ajax(opts); + }, + get: function (url, data, callback) { + this.ajax({ + url: url, + type: "GET", + data: data + }, callback); + }, + post: function (url, data, callback) { + this.ajax({ + url: url, + type: "POST", + data: data + }, callback); + }, + put: function (url, data, callback) { + this.ajax({ + url: url, + type: "PUT", + data: data + }, callback); + }, + delete: function (url, data, callback) { + this.ajax({ + url: url, + type: "DELETE", + data: data + }, callback); + }, + sideClose(delay){ + if(parent.layui.tool){ + parent.layui.tool.close(delay); + } + else{ + console.log('父页面没引用tool模块'); + } + }, + tabAdd:function(url,title,id){ + if(parent.layui.admin){ + parent.layui.admin.sonAdd(url,title,id); + } + else{ + console.log('父页面没引用admin模块'); + } + }, + tabClose:function(){ + if(parent.layui.admin){ + parent.layui.admin.sonClose(); + } + else{ + console.log('父页面没引用admin模块'); + } + }, + tabDelete:function(id){ + if(parent.layui.admin){ + parent.layui.admin.tabDelete(id); + } + else{ + console.log('父页面没引用admin模块'); + } + }, + tabChange:function(id){ + if(parent.layui.admin){ + parent.layui.admin.tabChange(id); + } + else{ + console.log('父页面没引用admin模块'); + } + }, + tabRefresh:function(id){ + if(parent.layui.admin){ + parent.layui.admin.refresh(id); + } + else{ + console.log('父页面没引用admin模块'); + } + } + }; + //时间选择快捷操作 + $('body').on('click', '.tool-time', function () { + let that = $(this); + let type = that.data('type'); + if (typeof(type) == "undefined" || type == '') { + type = 'date'; + } + layui.laydate.render({ + elem: that, + show: true, + type: type, + fullPanel: true + }); + return false; + }); + + $('body').on('click', '.tab-a', function () { + let id = $(this).data('id'); + let url = $(this).data('href'); + let title = $(this).data('title'); + if (url && url !== '') { + if (typeof(id) == "undefined" || id == '') { + id = Date.now(); + } + tool.tabAdd(url,title,id); + } + return false; + }); + + $('body').on('click', '.side-a', function () { + let url = $(this).data('href'); + if (url && url !== '') { + tool.side(url); + } + return false; + }); + $('body').on('click', '.open-a', function () { + let url = $(this).data('href'); + if (url && url !== '') { + tool.open(url); + } + return false; + }); + $('body').on('click', '.link-a', function () { + let url = $(this).data('href'); + if (url && url !== '') { + window.location.href=url; + } + return false; + }); + exports(MOD_NAME, tool); +}); \ No newline at end of file diff --git a/jun_pc_web/assets/module/treetable-lay/treetable.css b/jun_pc_web/assets/module/treetable-lay/treetable.css new file mode 100644 index 000000000..584b2f8c5 --- /dev/null +++ b/jun_pc_web/assets/module/treetable-lay/treetable.css @@ -0,0 +1,18 @@ +.treeTable-empty { + width: 20px; + display: inline-block; +} + +.treeTable-icon { + cursor: pointer; +} + +.treeTable-icon .layui-icon-triangle-d:before { + content: "\e623"; +} + +.treeTable-icon.open .layui-icon-triangle-d:before { + content: "\e625"; + background-color: transparent; +} + diff --git a/jun_pc_web/assets/module/treetable-lay/treetable.js b/jun_pc_web/assets/module/treetable-lay/treetable.js new file mode 100644 index 000000000..e38a5e1cd --- /dev/null +++ b/jun_pc_web/assets/module/treetable-lay/treetable.js @@ -0,0 +1,206 @@ +layui.define(['layer', 'table'], function (exports) { + var $ = layui.jquery; + var layer = layui.layer; + var table = layui.table; + + var treetable = { + // 渲染树形表格 + render: function (param) { + // 检查参数 + if (!treetable.checkParam(param)) { + return; + } + // 获取数据 + if (param.data) { + treetable.init(param, param.data); + } else { + $.getJSON(param.url, param.where, function (res) { + treetable.init(param, res.data); + }); + } + }, + // 渲染表格 + init: function (param, data) { + var mData = []; + var doneCallback = param.done; + var tNodes = data; + // 补上id和pid字段 + for (var i = 0; i < tNodes.length; i++) { + var tt = tNodes[i]; + if (!tt.id) { + if (!param.treeIdName) { + layer.msg('参数treeIdName不能为空', {icon: 5}); + return; + } + tt.id = tt[param.treeIdName]; + } + if (!tt.pid) { + if (!param.treePidName) { + layer.msg('参数treePidName不能为空', {icon: 5}); + return; + } + tt.pid = tt[param.treePidName]; + } + } + + // 对数据进行排序 + var sort = function (s_pid, data) { + for (var i = 0; i < data.length; i++) { + if (data[i].pid == s_pid) { + var len = mData.length; + if (len > 0 && mData[len - 1].id == s_pid) { + mData[len - 1].isParent = true; + } + mData.push(data[i]); + sort(data[i].id, data); + } + } + }; + sort(param.treeSpid, tNodes); + + // 重写参数 + param.url = undefined; + param.data = mData; + param.page = { + count: param.data.length, + limit: param.data.length + }; + param.cols[0][param.treeColIndex].templet = function (d) { + var mId = d.id; + var mPid = d.pid; + var isDir = d.isParent; + var emptyNum = treetable.getEmptyNum(mPid, mData); + var iconHtml = ''; + for (var i = 0; i < emptyNum; i++) { + iconHtml += ''; + } + if (isDir) { + iconHtml += ' '; + } else { + iconHtml += ''; + } + iconHtml += '  '; + var ttype = isDir ? 'dir' : 'file'; + var vg = ''; + return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '' + }; + + param.done = function (res, curr, count) { + $(param.elem).next().addClass('treeTable'); + $('.treeTable .layui-table-page').css('display', 'none'); + $(param.elem).next().attr('treeLinkage', param.treeLinkage); + // 绑定事件换成对body绑定 + /*$('.treeTable .treeTable-icon').click(function () { + treetable.toggleRows($(this), param.treeLinkage); + });*/ + if (param.treeDefaultClose) { + treetable.foldAll(param.elem); + } + if (doneCallback) { + doneCallback(res, curr, count); + } + }; + + // 渲染表格 + table.render(param); + }, + // 计算缩进的数量 + getEmptyNum: function (pid, data) { + var num = 0; + if (!pid) { + return num; + } + var tPid; + for (var i = 0; i < data.length; i++) { + if (pid == data[i].id) { + num += 1; + tPid = data[i].pid; + break; + } + } + return num + treetable.getEmptyNum(tPid, data); + }, + // 展开/折叠行 + toggleRows: function ($dom, linkage) { + var type = $dom.attr('lay-ttype'); + if ('file' == type) { + return; + } + var mId = $dom.attr('lay-tid'); + var isOpen = $dom.hasClass('open'); + if (isOpen) { + $dom.removeClass('open'); + } else { + $dom.addClass('open'); + } + $dom.closest('tbody').find('tr').each(function () { + var $ti = $(this).find('.treeTable-icon'); + var pid = $ti.attr('lay-tpid'); + var ttype = $ti.attr('lay-ttype'); + var tOpen = $ti.hasClass('open'); + if (mId == pid) { + if (isOpen) { + $(this).hide(); + if ('dir' == ttype && tOpen == isOpen) { + $ti.trigger('click'); + } + } else { + $(this).show(); + if (linkage && 'dir' == ttype && tOpen == isOpen) { + $ti.trigger('click'); + } + } + } + }); + }, + // 检查参数 + checkParam: function (param) { + if (!param.treeSpid && param.treeSpid != 0) { + layer.msg('参数treeSpid不能为空', {icon: 5}); + return false; + } + + if (!param.treeColIndex && param.treeColIndex != 0) { + layer.msg('参数treeColIndex不能为空', {icon: 5}); + return false; + } + return true; + }, + // 展开所有 + expandAll: function (dom) { + $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () { + var $ti = $(this).find('.treeTable-icon'); + var ttype = $ti.attr('lay-ttype'); + var tOpen = $ti.hasClass('open'); + if ('dir' == ttype && !tOpen) { + $ti.trigger('click'); + } + }); + }, + // 折叠所有 + foldAll: function (dom) { + $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () { + var $ti = $(this).find('.treeTable-icon'); + var ttype = $ti.attr('lay-ttype'); + var tOpen = $ti.hasClass('open'); + if ('dir' == ttype && tOpen) { + $ti.trigger('click'); + } + }); + } + }; + + layui.link(layui.cache.base + 'treetable-lay/treetable.css'); + + // 给图标列绑定事件 + $('body').on('click', '.treeTable .treeTable-icon', function () { + var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage'); + if ('true' == treeLinkage) { + treetable.toggleRows($(this), true); + } else { + treetable.toggleRows($(this), false); + } + }); + + exports('treetable', treetable); +}); diff --git a/jun_pc_web/assets/module/xmSelect.js b/jun_pc_web/assets/module/xmSelect.js new file mode 100644 index 000000000..2f104685e --- /dev/null +++ b/jun_pc_web/assets/module/xmSelect.js @@ -0,0 +1,8 @@ +/*! + * @Title: xm-select + * @Version: 1.1.8 + * @Description:基于layui的多选解决方案 + * @Site: https://gitee.com/maplemei/xm-select + * @Author: maplemei + * @License:Apache License 2.0 + */!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="./",n(n.s=213)}({104:function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,o=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,(function(e,t){var r,i=t.trim().replace(/^"(.*)"$/,(function(e,t){return t})).replace(/^'(.*)'$/,(function(e,t){return t}));return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(r=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:o+i.replace(/^\.\//,""),"url("+JSON.stringify(r)+")")}))}},213:function(e,t,n){"use strict";n.r(t),function(e){n(215),n(216),n(218);var t=n(65);window.addEventListener("click",(function(){Object.keys(t.b).forEach((function(e){var n=t.b[e];n&&n.closed&&n.closed()}))})),"object"===("undefined"==typeof exports?"undefined":_typeof(exports))?e.exports=t.c:"function"==typeof define&&n(220)?define(xmSelect):window.layui&&layui.define&&layui.define((function(e){e("xmSelect",t.c)})),window.xmSelect=t.c}.call(this,n(214)(e))},214:function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},215:function(e,t){Array.prototype.map||(Array.prototype.map=function(e,t){var n,o,r,i=Object(this),l=i.length>>>0;for(t&&(n=t),o=new Array(l),r=0;r>>0;if("function"!=typeof e)throw new TypeError(e+" is not a function");for(arguments.length>1&&(n=t),o=0;o>>0;if("function"!=typeof e)throw new TypeError;for(var o=[],r=arguments[1],i=0;i>>0,r=arguments[1],i=0;i .xm-tips {\n color: #999999;\n padding: 0 10px;\n position: absolute;\n display: flex;\n height: 100%;\n align-items: center;\n}\nxm-select > .xm-icon {\n display: inline-block;\n overflow: hidden;\n position: absolute;\n width: 0;\n height: 0;\n right: 10px;\n top: 50%;\n margin-top: -3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-top-color: #C2C2C2;\n border-top-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n}\nxm-select > .xm-icon-expand {\n margin-top: -9px;\n transform: rotate(180deg);\n}\nxm-select > .xm-label.single-row {\n position: absolute;\n top: 0;\n bottom: 0px;\n left: 0px;\n right: 30px;\n overflow: auto hidden;\n}\nxm-select > .xm-label.single-row .scroll {\n overflow-y: hidden;\n}\nxm-select > .xm-label.single-row .label-content {\n flex-wrap: nowrap;\n}\nxm-select > .xm-label.auto-row .label-content {\n flex-wrap: wrap;\n}\nxm-select > .xm-label.auto-row .xm-label-block > span {\n white-space: unset;\n height: 100%;\n}\nxm-select > .xm-label .scroll .label-content {\n display: flex;\n padding: 3px 30px 3px 10px;\n}\nxm-select > .xm-label .xm-label-block {\n display: flex;\n position: relative;\n padding: 0px 5px;\n margin: 2px 5px 2px 0;\n border-radius: 3px;\n align-items: baseline;\n color: #FFF;\n}\nxm-select > .xm-label .xm-label-block > span {\n display: flex;\n color: #FFF;\n white-space: nowrap;\n}\nxm-select > .xm-label .xm-label-block > i {\n color: #FFF;\n margin-left: 8px;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n}\nxm-select > .xm-label .xm-label-block.disabled {\n background-color: #C2C2C2 !important;\n cursor: no-drop !important;\n}\nxm-select > .xm-label .xm-label-block.disabled > i {\n cursor: no-drop !important;\n}\nxm-select > .xm-body {\n position: absolute;\n left: 0;\n top: 42px;\n padding: 5px 0;\n z-index: 999;\n width: 100%;\n min-width: fit-content;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n animation-name: xm-upbit;\n animation-duration: 0.3s;\n animation-fill-mode: both;\n}\nxm-select > .xm-body .scroll-body {\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar {\n width: 8px;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-track {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #FFF;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-thumb {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #C2C2C2;\n}\nxm-select > .xm-body.up {\n top: auto;\n bottom: 42px;\n}\nxm-select > .xm-body.relative {\n position: relative;\n display: block !important;\n top: 0;\n box-shadow: none;\n border: none;\n animation-name: none;\n animation-duration: 0;\n min-width: 100%;\n}\nxm-select > .xm-body .xm-group {\n cursor: default;\n}\nxm-select > .xm-body .xm-group-item {\n display: inline-block;\n cursor: pointer;\n padding: 0 10px;\n color: #999;\n font-size: 12px;\n}\nxm-select > .xm-body .xm-option {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 10px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-option-icon {\n color: transparent;\n display: flex;\n border: 1px solid #E6E6E6;\n border-radius: 3px;\n justify-content: center;\n align-items: center;\n}\nxm-select > .xm-body .xm-option-icon.xm-icon-danx {\n border-radius: 100%;\n}\nxm-select > .xm-body .xm-option-content {\n display: flex;\n position: relative;\n padding-left: 15px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #666;\n width: calc(100% - 20px);\n}\nxm-select > .xm-body .xm-option.hide-icon .xm-option-content {\n padding-left: 0;\n}\nxm-select > .xm-body .xm-option.selected.hide-icon .xm-option-content {\n color: #FFF !important;\n}\nxm-select > .xm-body .xm-option .loader {\n width: 0.8em;\n height: 0.8em;\n margin-right: 6px;\n color: #C2C2C2;\n}\nxm-select > .xm-body .xm-select-empty {\n text-align: center;\n color: #999;\n}\nxm-select > .xm-body .disabled {\n cursor: no-drop;\n}\nxm-select > .xm-body .disabled:hover {\n background-color: #FFF;\n}\nxm-select > .xm-body .disabled .xm-option-icon {\n border-color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled .xm-option-content {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled.selected > .xm-option-icon {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .xm-search {\n background-color: #FFF !important;\n position: relative;\n padding: 0 10px;\n margin-bottom: 5px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-search > i {\n position: absolute;\n color: #666;\n}\nxm-select > .xm-body .xm-search-input {\n border: none;\n border-bottom: 1px solid #E6E6E6;\n padding-left: 27px;\n cursor: text;\n}\nxm-select > .xm-body .xm-paging {\n padding: 0 10px;\n display: flex;\n margin-top: 5px;\n}\nxm-select > .xm-body .xm-paging > span:first-child {\n border-radius: 2px 0 0 2px;\n}\nxm-select > .xm-body .xm-paging > span:last-child {\n border-radius: 0 2px 2px 0;\n}\nxm-select > .xm-body .xm-paging > span {\n display: flex;\n flex: auto;\n justify-content: center;\n vertical-align: middle;\n margin: 0 -1px 0 0;\n background-color: #fff;\n color: #333;\n font-size: 12px;\n border: 1px solid #e2e2e2;\n flex-wrap: nowrap;\n width: 100%;\n overflow: hidden;\n min-width: 50px;\n}\nxm-select > .xm-body .xm-toolbar {\n padding: 0 10px;\n display: flex;\n margin: -3px 0;\n cursor: default;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag {\n cursor: pointer;\n display: flex;\n margin-right: 20px;\n color: #666;\n align-items: baseline;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:hover {\n opacity: 0.8;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:active {\n opacity: 1;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag > i {\n margin-right: 2px;\n font-size: 14px;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:last-child {\n margin-right: 0;\n}\nxm-select > .xm-body .xm-body-custom {\n line-height: initial;\n cursor: default;\n}\nxm-select > .xm-body .xm-body-custom * {\n box-sizing: initial;\n}\nxm-select > .xm-body .xm-tree {\n position: relative;\n}\nxm-select > .xm-body .xm-tree-icon {\n display: inline-block;\n margin-right: 3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-left-color: #C2C2C2;\n border-left-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n z-index: 2;\n visibility: hidden;\n}\nxm-select > .xm-body .xm-tree-icon.expand {\n margin-top: 3px;\n margin-right: 5px;\n margin-left: -2px;\n transform: rotate(90deg);\n}\nxm-select > .xm-body .xm-tree-icon.xm-visible {\n visibility: visible;\n}\nxm-select > .xm-body .xm-tree .left-line {\n position: absolute;\n left: 13px;\n width: 0;\n z-index: 1;\n border-left: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .top-line {\n position: absolute;\n left: 13px;\n height: 0;\n z-index: 1;\n border-top: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .xm-tree-icon + .top-line {\n margin-left: 1px;\n}\nxm-select > .xm-body .scroll-body > .xm-tree > .xm-option > .top-line,\nxm-select > .xm-body .scroll-body > .xm-option > .top-line {\n width: 0 !important;\n}\nxm-select > .xm-body .xm-cascader-box {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n padding: 5px 0;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n margin: -1px;\n}\nxm-select > .xm-body .xm-cascader-box::before {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #E6E6E6;\n top: 10px;\n left: -12px;\n}\nxm-select > .xm-body .xm-cascader-box::after {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #fff;\n top: 10px;\n left: -11px;\n}\nxm-select > .xm-body .xm-cascader-scroll {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body.cascader {\n width: unset;\n min-width: unset;\n}\nxm-select > .xm-body.cascader .xm-option-content {\n padding-left: 8px;\n}\nxm-select > .xm-body.cascader .disabled .xm-right-arrow {\n color: #C2C2C2 !important;\n}\nxm-select .xm-input {\n cursor: pointer;\n border-radius: 2px;\n border-width: 1px;\n border-style: solid;\n border-color: #E6E6E6;\n display: block;\n width: 100%;\n box-sizing: border-box;\n background-color: #FFF;\n line-height: 1.3;\n padding-left: 10px;\n outline: 0;\n user-select: text;\n -ms-user-select: text;\n -moz-user-select: text;\n -webkit-user-select: text;\n}\nxm-select .dis {\n display: none;\n}\nxm-select .loading {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n}\nxm-select .loader {\n border: 0.2em dotted currentcolor;\n border-radius: 50%;\n -webkit-animation: 1s loader linear infinite;\n animation: 1s loader linear infinite;\n display: inline-block;\n width: 1em;\n height: 1em;\n color: inherit;\n vertical-align: middle;\n pointer-events: none;\n}\nxm-select .xm-select-default {\n position: absolute;\n width: 100%;\n height: 100%;\n border: none;\n visibility: hidden;\n}\nxm-select .xm-select-disabled {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n cursor: no-drop;\n z-index: 2;\n opacity: 0.3;\n background-color: #FFF;\n}\nxm-select .item--divided {\n border-top: 1px solid #ebeef5;\n width: calc(100% - 20px);\n cursor: initial;\n}\nxm-select .xm-right-arrow {\n position: absolute;\n color: #666;\n right: 5px;\n top: -1px;\n font-weight: 700;\n transform: scale(0.6, 1);\n}\nxm-select .xm-right-arrow::after {\n content: '>';\n}\nxm-select[size='large'] {\n min-height: 40px;\n line-height: 40px;\n}\nxm-select[size='large'] .xm-input {\n height: 40px;\n}\nxm-select[size='large'] .xm-label .scroll .label-content {\n line-height: 34px;\n}\nxm-select[size='large'] .xm-label .xm-label-block {\n height: 30px;\n line-height: 30px;\n}\nxm-select[size='large'] .xm-body .xm-option .xm-option-icon {\n height: 20px;\n width: 20px;\n font-size: 20px;\n}\nxm-select[size='large'] .xm-paging > span {\n height: 34px;\n line-height: 34px;\n}\nxm-select[size='large'] .xm-tree .left-line {\n height: 100%;\n bottom: 20px;\n}\nxm-select[size='large'] .xm-tree .left-line-group {\n height: calc(100% - 40px);\n}\nxm-select[size='large'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 19px;\n}\nxm-select[size='large'] .item--divided {\n margin: 10px;\n}\nxm-select {\n min-height: 36px;\n line-height: 36px;\n}\nxm-select .xm-input {\n height: 36px;\n}\nxm-select .xm-label .scroll .label-content {\n line-height: 30px;\n}\nxm-select .xm-label .xm-label-block {\n height: 26px;\n line-height: 26px;\n}\nxm-select .xm-body .xm-option .xm-option-icon {\n height: 18px;\n width: 18px;\n font-size: 18px;\n}\nxm-select .xm-paging > span {\n height: 30px;\n line-height: 30px;\n}\nxm-select .xm-tree .left-line {\n height: 100%;\n bottom: 18px;\n}\nxm-select .xm-tree .left-line-group {\n height: calc(100% - 36px);\n}\nxm-select .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 17px;\n}\nxm-select .item--divided {\n margin: 9px;\n}\nxm-select[size='small'] {\n min-height: 32px;\n line-height: 32px;\n}\nxm-select[size='small'] .xm-input {\n height: 32px;\n}\nxm-select[size='small'] .xm-label .scroll .label-content {\n line-height: 26px;\n}\nxm-select[size='small'] .xm-label .xm-label-block {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='small'] .xm-body .xm-option .xm-option-icon {\n height: 16px;\n width: 16px;\n font-size: 16px;\n}\nxm-select[size='small'] .xm-paging > span {\n height: 26px;\n line-height: 26px;\n}\nxm-select[size='small'] .xm-tree .left-line {\n height: 100%;\n bottom: 16px;\n}\nxm-select[size='small'] .xm-tree .left-line-group {\n height: calc(100% - 32px);\n}\nxm-select[size='small'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 15px;\n}\nxm-select[size='small'] .item--divided {\n margin: 8px;\n}\nxm-select[size='mini'] {\n min-height: 28px;\n line-height: 28px;\n}\nxm-select[size='mini'] .xm-input {\n height: 28px;\n}\nxm-select[size='mini'] .xm-label .scroll .label-content {\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-label .xm-label-block {\n height: 18px;\n line-height: 18px;\n}\nxm-select[size='mini'] .xm-body .xm-option .xm-option-icon {\n height: 14px;\n width: 14px;\n font-size: 14px;\n}\nxm-select[size='mini'] .xm-paging > span {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-tree .left-line {\n height: 100%;\n bottom: 14px;\n}\nxm-select[size='mini'] .xm-tree .left-line-group {\n height: calc(100% - 28px);\n}\nxm-select[size='mini'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 13px;\n}\nxm-select[size='mini'] .item--divided {\n margin: 7px;\n}\n.layui-form-pane xm-select {\n margin: -1px -1px -1px 0;\n}\n",""])},218:function(e,t,n){var o=n(219);"string"==typeof o&&(o=[[e.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(27)(o,r);o.locals&&(e.exports=o.locals)},219:function(e,t,n){(e.exports=n(26)(!1)).push([e.i,'@font-face {\n font-family: "xm-iconfont";\n src: url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056\');\n /* IE9 */\n src: url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056#iefix\') format(\'embedded-opentype\'), /* IE6-IE8 */ url(\'data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAksAAsAAAAAEYAAAAjeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCEUgqTXI8lATYCJAM0CxwABCAFhG0HgTwbZQ4jEbaCkVIj+4sD3sS6BFAp9ka91ulVG4leTC/+h+3V+zyRYCTyREKkcZ+D5/u137lPdveLGJBMunoiNPOQPBMq0/FQtEKIkMRDZng69d+hOiQumAr7bJdBOEzMTU77s78mhbI58aCg7ebCs4LBTgCk+cD/4ZqWUHebipp7al3tyKOjwCV/hVyw9PdzaktxI7IMQs26/1N8gV4DI0bVut3UhCaflGGgwM3oTXg1IfRMbCsmrEnriJVeYM2eXHII4KdMMzL4OoACHgZBCTasITcReDUBE8kWPLMTCGoQaDV+eKpUPQI49r8vP6BTPIDCaiBSml3oOQX0voNPebv/u2P0AUfP1w0s5EADzYBZsNdByylo2eVq/NtRdgFpovQR5x2CIwmIZeik6/u0T/m/A7RJP00sCmmyksj/kwc+LC5BFBqDEMDDjwPiANDB9MpJTXwHmsO3YyBwWDA4OFwwJLRcRgAOBUYMDg0mHRwGTAYozsV0AgWYruDwwExDHfzwKWf4OurQ9jzQDtoF+wpistfBfluQ5bQiiJa4ZQoKhShLiMayBbyg05AIkYBoIBJEEApQy/FwYv4HchADIUBXl61dW6mpwIgyp7p8PrHddieSjhY9oqTxyPB/FGNYDklpfYh8VtaoqSgb0bKoGB17CuVUp9Ll2nS2UpNGMSw9hyirA7C6+QLyByIQS0sSSmxvArC5odZmYZMxZSiBR5OkQl0uiufxMH5eL8t3u0d4XKyuq6EMdcpNe2+oXA8p9yPa+4T1PM7+A54tc7tpl2vcAHAftnhZj2chy1CyaCRFsyMqQ5nkNnskEt2yxxZinPsOZjFm4+XWvKqLkfCGS1k4MNP82isxSMf7ZsGYvQVCNAeSSVtzWCxRdXGxyZlA2CvCEevuO7y9M2z2NWH8icydzq/qAJSp1lGvDWFp6Nw3xChJowPD+76nU+upQk6Kw9jI0Rgym9Ct8VlxMI3CSIaDCZja5tDYt0/EYra4tn0Kp3v8Rdezk8svcy1mKhoSvNcZz3LKlUe777Gmval0s7bzAc0k13LGk896V9DuvNn34N0ebKgItkQgOomuJtgQPChNI4cwa7CEWCvfk5QjJFlem6i3SfVShWi5LTFRG+JwdCNpSqbpRFwrtb1TbcRkJi/AbJJQOmfCdnswLNGVM7qqSRO1zO0Q0j5Vr3cYQ07HB0MX6KoIZhx+D9Djs2C5bXtVwvbgJHtSCIL7hjFJme4sZDdS5IlJdKUO1Qt8opn0trBafz3AX933kmCRgyMEWGZjMAkRKhwmIHJGR4ruwFCdWKYzrap2R/mvd2UKajzRAZu88pGAD90Y+02kTFCKrBSXwGGJ3wRcPCdIppTxSmHOfESRwIli0S5J/8AYDCxTGh4XZua4xvfvGx320rDK2qA8g5FlS7pWNLx71+BwgA/KZ5I0aeKmNeCNoNPl8qNHu8uHHzqaKc86fHi4vPuRI4ny+I/vjxw+clh4HXVCFvVnVFx07EHZwVhSRliTTMWSEi0h6YuS6DxCRmiin0B3L4ry6cvR0ijYexFdBL3wGQM0YOrUAZCBkLOBBtQ+xdk7omfgUv+u++admyUeXduyxLM+r/+49rPfhgEZor6GymToNYksNsZyC7ntwAH0928UpgMpxpF0ydNlsMMBw7QsxTCmu0Hf3F+/+vb99Yumhb+e9R0LBNm+4O+hu7lQ5bGjI9j5G88qQ5SLFyuEC7cwd25xoYo2j4eA4bhpM7TZhPtmc+uhVEVSMYXLWh0bfjI8dvUpvDUocPZmU4kwwOfc83wB5wPehrpD3waApbwW+fgRrZXcxw+mB/3woZT+8JFMYwRMIy2k/18qhqcKpjYeYSnIACaUoRDu0e3kQFh98R5fiI8oJqwwGZSJDSbehLzZs7zIeWTQ4UGOIs2c4j2/Q/tn7n7j9juO33On6WhURCT/wO6Y3QdmWFY0Ef6JUeGRggO7ZbtaZlh5RYKWXbLPBLc3l/5h4A0mu3ZXTZ+u6t6VHMAzZhxak50T+24NnRuaOmehRkXlqVR5lIpuwezUUDUdCuJysv8Z/0/8uNE1s7jIJIubFWnI/x7g4nAZx79yYpFoAOU3a9iwT1O/GxUxPY0ljVPv9EukI3qNrl/So2YfzasqHCroNjS0+w0tlPlsYfC6v/01ixquizJH1Kd/VK+OS3iS3rTJWmqsMPdU3B3oFyC9RSumWE/0gG36IjTysfH51IJ/5oOgNYu6p4yb5Fdufhr/Kjtu0oSyYP/WJQrz35aNFnMhtFcwb55NlNnH8Wdu1b+XZA9zqlZrhdPo/V3uBhiUlQ66h0LhbAmFYIncdFOpVMh6Fl7peqy5Z2ZdQBITO2x1Asj1dRFjIBMC3hbuUh8Ooc4W03EjAdo8UL/t0oUfyU8630bmMcw/vqDNAsC9BQD4OqCgH+ljy0UhJB8AAJA+8EmArxk5gnRLik90AElf8rBm+IMvBTWnucb3+0o0ARk+r0ZBv8sU01nnSmP45/H8Dp8C8X+iE9e+ZvXymK/sQJ5/DuqhYKebPnKmPqLYuDcIMWS2/Rjxp2s8Do821LVn6A/xMK1RKvBLK5gyDsZ5uQ6bYusmx2yqLFe4lECHDPcFhojmckuAbnCI6Cn308RI6AAJdtCICQLQyBHKhSgX5YowN6BBPIEB8VxuSfNncpAuutzPnCSiDHDEo+DsKQBPoJi4MpRktepIs2zjO5h84IEMM3ffECKSZU1ZHxfewEI4h494MuuUNNOBjuw18QKHAzEXaAcylS3m3baq9MpnKenYmfEUgCdbXTHEtTVKsvruNGv9/DuYfOAhcuKu9TeEiA9nNJTUDOUbbVkn3sv2eDJrEnVrpvcHOjJeqRsOcpYYLuxoBzKVtCOm3ZaKbtJcurw+e/zN6c7Pd6r4gqUo0WLEiiOueOITvwQkKCEJM9nO3F60y5HkqLhdqUyXZtK3lqwReQ+G40O92UhOt0x/KmKM+u7LTPMzoEBOCYtiUPfSjODiuFXjSDm2idzAoc4Tj9bs2eJYDOU7HQA=\') format(\'woff2\'), url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.woff?t=1574048839056\') format(\'woff\'), url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.ttf?t=1574048839056\') format(\'truetype\'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url(\'//at.alicdn.com/t/font_792691_ptvyboo0bno.svg?t=1574048839056#iconfont\') format(\'svg\');\n /* iOS 4.1- */\n}\n.xm-iconfont {\n font-family: "xm-iconfont" !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.xm-icon-quanxuan:before {\n content: "\\e62c";\n}\n.xm-icon-caidan:before {\n content: "\\e610";\n}\n.xm-icon-fanxuan:before {\n content: "\\e837";\n}\n.xm-icon-pifu:before {\n content: "\\e668";\n}\n.xm-icon-qingkong:before {\n content: "\\e63e";\n}\n.xm-icon-sousuo:before {\n content: "\\e600";\n}\n.xm-icon-danx:before {\n content: "\\e62b";\n}\n.xm-icon-duox:before {\n content: "\\e613";\n}\n.xm-icon-close:before {\n content: "\\e601";\n}\n.xm-icon-expand:before {\n content: "\\e641";\n}\n.xm-icon-banxuan:before {\n content: "\\e60d";\n}\n',""])},220:function(e,t){(function(t){e.exports=t}).call(this,{})},26:function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",o=e[3];if(!o)return n;if(t&&"function"==typeof btoa){var r=function(e){var t=btoa(unescape(encodeURIComponent(JSON.stringify(e)))),n="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(t);return"/*# ".concat(n," */")}(o),i=o.sources.map((function(e){return"/*# sourceURL=".concat(o.sourceRoot).concat(e," */")}));return[n].concat(i).concat([r]).join("\n")}return[n].join("\n")}(t,e);return t[2]?"@media ".concat(t[2],"{").concat(n,"}"):n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var o={},r=0;r=0&&p.splice(t,1)}function x(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var o=function(){0;return n.nc}();o&&(e.attrs.nonce=o)}return y(t,e.attrs),m(e,t),t}function y(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function v(e,t){var n,o,r,i;if(t.transform&&e.css){if(!(i="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var l=u++;n=c||(c=x(t)),o=w.bind(null,n,l,!1),r=w.bind(null,n,l,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",y(t,e.attrs),m(e,t),t}(t),o=C.bind(null,n,t),r=function(){b(n),n.href&&URL.revokeObjectURL(n.href)}):(n=x(t),o=k.bind(null,n),r=function(){b(n)});return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=l()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=h(e,t);return f(n,t),function(e){for(var o=[],r=0;r3)for(n=[n],o=3;or?n-r:r,l=this.labelRef.scrollLeft+e.deltaY;l<0&&(l=0),l>i&&(l=i),this.labelRef.scrollLeft=l}}},{key:"componentDidMount",value:function(){this.labelRef.addEventListener&&this.labelRef.addEventListener("DOMMouseScroll",this.scrollFunc.bind(this),!1),this.labelRef.attachEvent&&this.labelRef.attachEvent("onmousewheel",this.scrollFunc.bind(this)),this.labelRef.onmousewheel=this.scrollFunc.bind(this)}},{key:"render",value:function(e){var t=this,n=e.data,o=e.prop,r=e.theme,i=e.model,l=e.sels,a=e.autoRow,c=o.name,u=o.disabled,p=i.label,d=p.type,f=p[d],h="",m=!0,b=l.map((function(e){return e[c]})).join(",");if("text"===d)h=l.map((function(e){return"".concat(f.left).concat(e[c]).concat(f.right)})).join(f.separator);else if("block"===d){m=!1;var x=N(l),y={backgroundColor:r.color},v=f.showCount<=0?x.length:f.showCount;h=x.splice(0,v).map((function(e){var n={width:f.showIcon?"calc(100% - 20px)":"100%"};return _("div",{class:["xm-label-block",e[u]?"disabled":""].join(" "),style:y},f.template&&s(f.template)?_("span",{style:n,dangerouslySetInnerHTML:{__html:f.template(e,x)}}):_("span",{style:n},e[c]),f.showIcon&&_("i",{class:"xm-iconfont xm-icon-close",onClick:t.iconClick.bind(t,e,!0,e[u])}))})),x.length&&h.push(_("div",{class:"xm-label-block",style:y},"+ ",x.length))}else h=l.length&&f&&f.template?f.template(n,l):l.map((function(e){return e[c]})).join(",");return _("div",{class:["xm-label",a?"auto-row":"single-row"].join(" ")},_("div",{class:"scroll",ref:function(e){return t.labelRef=e}},m?_("div",{class:"label-content",dangerouslySetInnerHTML:{__html:h}}):_("div",{class:"label-content",title:b},h)))}}])&&H(n.prototype,o),r&&H(n,r),t}(C);function Q(e){return(Q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function J(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function W(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function G(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:this.size;var e=this.state.pageIndex;e<=1||(this.changePageIndex(e-1),this.props.pageRemote&&this.postData(e-1,!0))}},{key:"pageNextClick",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.size,t=this.state.pageIndex;t>=e||(this.changePageIndex(t+1),this.props.pageRemote&&this.postData(t+1,!0))}},{key:"changePageIndex",value:function(e){this.setState({pageIndex:e})}},{key:"searchInput",value:function(e){var t=this,n=e.target.value;n!==this.__value&&(clearTimeout(this.searchCid),this.inputOver&&(this.__value=n,this.searchCid=setTimeout((function(){t.callback=!0,t.setState({filterValue:t.__value,remote:!0,pageIndex:1})}),this.props.delay)))}},{key:"focus",value:function(){this.searchInputRef&&this.searchInputRef.focus()}},{key:"blur",value:function(){this.searchInputRef&&this.searchInputRef.blur()}},{key:"handleComposition",value:function(e){var t=e.type;"compositionstart"===t?(this.inputOver=!1,clearTimeout(this.searchCid)):"compositionend"===t&&(this.inputOver=!0,this.searchInput(e))}},{key:"postData",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.pageIndex,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(this.state.remote||n)&&(this.callback=!1,this.setState({loading:!0,remote:!1}),this.blur(),this.props.remoteMethod(this.state.filterValue,(function(t,n){e.focus(),e.callback=!0,e.setState({loading:!1,totalSize:n}),e.props.onReset(t,"data")}),this.props.show,t))}},{key:"keydown",value:function(e,t){var n=this,o=t.keyCode;"div"===e&&(27===o||9===o?this.props.onReset(!1,"close"):37===o?this.pagePrevClick():39===o&&this.pageNextClick());var r=this.props.prop,i=r.value,l=r.optgroup,a=r.disabled,s=this.tempData.filter((function(e){return!e[l]&&!e[a]})),c=s.length-1;if(-1!==c){var u=s.findIndex((function(e){return e[i]===n.state.val}));if(38===o){u<=0?u=c:u>0&&(u-=1);var p=s[u][i];this.setState({val:p})}else if(40===o){-1===u||u===c?u=0:uD&&(M=D),D>0&&M<=0&&(M=1),!v){var T=(M-1)*e.pageSize,z=T+e.pageSize;S=S.slice(T,z)}var L={cursor:"no-drop",color:"#d2d2d2"},V={},F={};M<=1&&(V=L),M==D&&(F=L),this.state.pageIndex!==M&&this.changePageIndex(M),this.size=D,I=_("div",{class:"xm-paging"},_("span",{style:V,onClick:this.pagePrevClick.bind(this,D)},"上一页"),_("span",null,this.state.pageIndex," / ",D),_("span",{style:F,onClick:this.pageNextClick.bind(this,D)},"下一页"))}else e.showCount>0&&(S=S.slice(0,e.showCount));var U,B=[],N={__tmp:!0};N[O]=!0,S.forEach((function(e){var t=P[e[w]];U&&!t&&(t=N),t!=U&&(U=t,t&&B.push(U)),B.push(e)})),S=B,t&&(t=y(this.state.filterValue,c([],S)))&&S.splice(0,0,function(e){for(var t=1;t0||f.lazy&&!1!==e.__node.loading)?"xm-visible":"xm-hidden"].join(" "),C=[];f.showFolderIcon&&(C.push(_("i",{class:w})),f.showLine&&(o&&C.push(_("i",{class:"left-line",style:{left:t-f.indent+3+"px"}})),C.push(_("i",{class:"top-line",style:{left:t-f.indent+3+"px",width:f.indent+(0===o?10:-2)+"px"}}))));var O=function(t){"mouseenter"===t.type&&(e[v]||n.setState({val:e[y]}))};return _("div",{class:m,style:h,value:e[y],onClick:n.optionClick.bind(n,e,r,e[v],"line"),onMouseEnter:O,onMouseLeave:O},C,e.__node.loading&&_("span",{class:"loader"}),k&&_("i",{class:b,style:u,onClick:n.optionClick.bind(n,e,r,e[v],"checkbox")}),_("div",{class:"xm-option-content",dangerouslySetInnerHTML:{__html:p({data:d,item:e,arr:i,name:e[x],value:e[y]})}}))};h&&(m?this.postData():this.filterData(d,this.state.filterValue));var O=c([],d),S=c([],i);this.tempData=O;var j=d.map((function(e){return function e(t,o){if(!t.__node.hidn){var r=t[g];if(o+=f.indent,r){var i=-1!==n.state.expandedKeys.findIndex((function(e){return t[y]===e}));return 0===r.length&&(i=!1),_("div",{class:"xm-tree"},f.showFolderIcon&&f.showLine&&i&&r.length>0&&_("i",{class:"left-line left-line-group",style:{left:o+3+"px"}}),C(t,o,0===r.length&&(!f.lazy||f.lazy&&!1===t.__node.loading)?0:i),i&&_("div",{class:"xm-tree-box"},r.map((function(t){return e(t,o)}))))}return C(t,o,0)}}(e,10-f.indent)})).filter((function(e){return e}));function E(e,t){t.forEach((function(t){return t[w]?(!f.strict&&e.push(t),E(e,t[g])):e.push(t)}))}var A=_("div",{class:"xm-toolbar"},e.toolbar.list.map((function(t){var r,c=e.languageProp.toolbar[t];r="ALL"===t?{icon:"xm-iconfont xm-icon-quanxuan",name:c,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[v]})),n.props.onReset(a?t.slice(0,1):u(t,i,o),"treeData")}}:"CLEAR"===t?{icon:"xm-iconfont xm-icon-qingkong",name:c,method:function(e){n.props.onReset(i.filter((function(e){return e[o.disabled]})),"treeData")}}:"REVERSE"===t?{icon:"xm-iconfont xm-icon-fanxuan",name:c,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[v]}));var r=[];i.forEach((function(e){var n=t.findIndex((function(t){return t[y]===e[y]}));-1==n?r.push(e):t.splice(n,1)})),n.props.onReset(a?r.slice(0,1):u(t,r,o),"treeData")}}:t;var p=function(e){"mouseenter"===e.type&&(e.target.style.color=l.color),"mouseleave"===e.type&&(e.target.style.color="")};return _("div",{class:"toolbar-tag",onClick:function(){s(r.method)&&r.method(O,S)},onMouseEnter:p,onMouseLeave:p},e.toolbar.showIcon&&_("i",{class:r.icon}),_("span",null,r.name))})).filter((function(e){return e}))),R=_("div",{class:h?"xm-search":"xm-search dis"},_("i",{class:"xm-iconfont xm-icon-sousuo"}),_("input",{class:"xm-input xm-search-input",placeholder:b}));return j.length||j.push(_("div",{class:"xm-select-empty"},r)),_("div",{onClick:this.blockClick,class:"xm-body-tree"},e.toolbar.show&&A,R,_("div",{class:"scroll-body",style:{maxHeight:e.height}},j),this.state.loading&&_("div",{class:"loading"},_("span",{class:"loader"})))}},{key:"componentDidMount",value:function(){var e=this.base.querySelector(".xm-search-input");e&&(e.addEventListener("compositionstart",this.handleComposition.bind(this)),e.addEventListener("compositionupdate",this.handleComposition.bind(this)),e.addEventListener("compositionend",this.handleComposition.bind(this)),e.addEventListener("input",this.searchInput.bind(this)),this.searchInputRef=e)}},{key:"componentDidUpdate",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;s(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&ue(n.prototype,o),r&&ue(n,r),t}(C);function be(e){return(be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function xe(e,t){for(var n=0;n1&&(n=n.slice(0,1)),this.setState({sels:n,dataObj:a,flatData:s})}return this.setState({data:o}),n}},{key:"exchangeValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.state.dataObj,o=e.map((function(e){return"object"===Se(e)?Ce({},e,{__node:{}}):n[e]})).filter((function(e){return e})),r=!0,i=this.props.tree;return i.show&&!1===i.strict&&(r=!1),r&&(o=o.filter((function(e){return!0!==e[t.props.prop.optgroup]}))),o}},{key:"value",value:function(e,t,n){!1!==t&&!0!==t&&(t=this.state.show);var o=this.props,r=o.prop,i=o.tree,l=this.exchangeValue(e);if(i.show&&i.strict){var a=this.state.data;this.clearAndReset(a,l),l=this.init({data:a,prop:r},!0)}this.resetSelectValue(l,l,!0,n),this.setState({show:t})}},{key:"clearAndReset",value:function(e,t){var n=this,o=this.props.prop,r=o.selected,i=o.children,l=o.value;e.forEach((function(e){e[r]=-1!=t.findIndex((function(t){return t[l]===e[l]}));var o=e[i];o&&a(o)&&n.clearAndReset(o,t)}))}},{key:"load",value:function(e,t,n,o){var r=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,l=this.props,s=l.prop,c=l.tree,u=s.children,p=s.optgroup,d=s.value,f=s.selected,h=s.disabled;e.forEach((function(e){e.__node={parent:o,level:i,loading:e.__node&&e.__node.loading},t[e[d]]=e,n.push(e);var l=e[u];if(l&&a(l)){var s=l.length;if(s>0){r.load(l,t,n,e,i+1),e[p]=!0,c.strict&&(!0===e[f]&&(delete e[f],l.forEach((function(e){return e[f]=!0}))),!0===e[h]&&(delete e[h],l.forEach((function(e){return e[h]=!0}))));var m=l.filter((function(e){return!0===e[f]||!0===e.__node.selected})).length;e.__node.selected=m===s,e.__node.half=m>0&&m0,e.__node.disabled=l.filter((function(e){return!0===e[h]||!0===e.__node.disabled})).length===s}}}))}},{key:"resetSelectValue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=this.props.on;if(s(r)&&this.prepare&&o){var i=r({arr:e,change:t,isAdd:n});if(a(i))return this.value(i,null,!1)}this.setState({sels:e})}},{key:"updateBorderColor",value:function(e){this.setState({tmpColor:e})}},{key:"treeHandler",value:function(e,t,n,o){var r=this,i=this.props.prop,l=i.value,a=(i.selected,i.disabled),s=i.children,c=i.optgroup,u=t[s];u.filter((function(e){return!(e[a]||e.__node.disabled)})).forEach((function(t){if(t[c])r.treeHandler(e,t,n,o);else{var i=e.findIndex((function(e){return e[l]==t[l]}));"del"===o?-1!=i&&(e.splice(i,1),n.push(t)):"half"!==o&&"add"!==o||-1==i&&(e.push(t),n.push(t))}}));var p=u.length,d=u.filter((function(t){return-1!==e.findIndex((function(e){return e[l]===t[l]}))||!0===t.__node.selected})).length;t.__node.selected=d===p,t.__node.half=d>0&&d0&&h.length>=g)return this.updateBorderColor(i.maxColor),void(d&&s(d)&&d(h,e));h=a?[e]:[].concat(we(h),[e]),this.resetSelectValue(h,[e],!t)}else{var _=h.findIndex((function(t){return t[m]==e[m]}));-1!=_&&(h.splice(_,1),this.resetSelectValue(h,[e],!t))}var w,k=e.__node.parent;if(k){for(;k;){var C=k[b],O=C.length,S=C.filter((function(e){return-1!==h.findIndex((function(t){return t[m]===e[m]}))||!0===e.__node.selected})).length;k.__node.selected=S===O,k.__node.half=S>0&&S0,k=k.__node.parent}this.setState({data:this.state.data})}u&&!o&&this.onClick()}}},{key:"onClick",value:function(e){var t=this;if("relative"!==this.props.model.type)if(this.props.disabled)!1!==this.state.show&&this.setState({show:!1});else{var n=!this.state.show;if(n){if(this.props.show&&0==this.props.show())return;Object.keys(Be).filter((function(e){return e!=t.props.el})).forEach((function(e){return Be[e].closed()}))}else{if(this.props.hide&&0==this.props.hide())return;this.bodyView.scroll&&this.bodyView.scroll(0,0)}this.setState({show:n}),e&&e.stopPropagation()}}},{key:"onReset",value:function(e,t){var n=this;if("data"===t){var o=e.filter((function(e){return!0===e[n.props.prop.selected]}));this.resetSelectValue(u(o,this.state.sels,this.props.prop),o,!0);var r=[];this.load(e,{},r),this.setState({data:e,flatData:r})}else"sels"===t?this.resetSelectValue(e,e,!0):"append"===t?this.append(e):"delete"===t?this.del(e):"auto"===t?this.auto(e):"treeData"===t?this.value(e,null,!0):"close"===t?this.onClick():"class"===t&&this.setState({bodyClass:e})}},{key:"append",value:function(e){var t=this.exchangeValue(e);this.resetSelectValue(u(t,this.state.sels,this.props.prop),t,!0)}},{key:"del",value:function(e){var t=this.props.prop.value,n=this.state.sels;(e=this.exchangeValue(e)).forEach((function(e){var o=n.findIndex((function(n){return n[t]===e[t]}));-1!=o&&n.splice(o,1)})),this.resetSelectValue(n,e,!1)}},{key:"auto",value:function(e){var t=this,n=this.props.prop.value;e.filter((function(e){return-1!=t.state.sels.findIndex((function(t){return t[n]===e[n]}))})).length==e.length?this.del(e):this.append(e)}},{key:"componentWillReceiveProps",value:function(e){this.init(e,e.updateData)}},{key:"componentWillMount",value:function(){this.init(this.props,!0)}},{key:"render",value:function(e,t){var n=this,o=e.theme,r=e.prop,i=(e.radio,e.repeat,e.clickClose,e.on,e.max,e.maxMethod,e.content),l=e.disabled,a=e.tree,s={borderColor:o.color},c=t.data,u=t.dataObj,p=t.flatData,d=t.sels,f=t.show,h=t.tmpColor,m=t.bodyClass;l&&(f=!1);var b={style:Ce({},e.style,{},f?s:{}),onClick:this.onClick.bind(this),ua:-1!=navigator.userAgent.indexOf("Mac OS")?"mac":"win",size:e.size,tabindex:1};h&&(b.style.borderColor=h,setTimeout((function(){b.style.borderColor="",n.updateBorderColor("")}),300)),r.value;var x=Ce({},e,{data:c,sels:d,ck:this.itemClick.bind(this),title:d.map((function(e){return e[r.name]})).join(",")}),y=Ce({},e,{data:c,dataObj:u,flatData:p,sels:d,ck:this.itemClick.bind(this),show:f,onReset:this.onReset.bind(this)}),v=i?_(se,y):a.show?_(me,y):e.cascader.show?_(_e,y):_(ne,y);return _("xm-select",b,_("input",{class:"xm-select-default","lay-verify":e.layVerify,"lay-verType":e.layVerType,name:e.name,value:d.map((function(e){return e[r.value]})).join(",")}),_("i",{class:f?"xm-icon xm-icon-expand":"xm-icon"}),0===d.length&&_("div",{class:"xm-tips"},e.tips),_(Z,x),_("div",{class:["xm-body",m,e.model.type,f?"":"dis"].join(" "),ref:function(e){return n.bodyView=e}},v),l&&_("div",{class:"xm-select-disabled"}))}},{key:"componentDidMount",value:function(){var e=this;this.prepare=!0,this.base.addEventListener("keydown",(function(t){13===t.keyCode&&e.onClick()})),this.input=this.base.querySelector(".xm-select-default");var t=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;t&&new t((function(t){t.forEach((function(t){"attributes"==t.type&&"class"===t.attributeName&&-1!==e.input.className.indexOf("layui-form-danger")&&(e.input.className="xm-select-default",e.base.style.borderColor=e.props.theme.maxColor)}))})).observe(this.input,{attributes:!0});for(var n=this.base;n;){if("FORM"===n.tagName){var o=n.querySelector('button[type="reset"]');o&&o.addEventListener("click",(function(t){e.init(e.props,!0)}));break}n=n.parentElement}}},{key:"componentDidUpdate",value:function(){var e=this.props,t=e.direction;if("relative"!==e.model.type){var n=this.base.getBoundingClientRect();if("auto"===t){this.bodyView.style.display="block",this.bodyView.style.visibility="hidden";var o=this.bodyView.getBoundingClientRect().height;this.bodyView.style.display="",this.bodyView.style.visibility="";var r=n.y||n.top||0,i=document.documentElement.clientHeight-r-n.height-20;t=i>o||r0&&void 0!==arguments[0]?arguments[0]:"zn",t=De[e]||Ie;return{language:e,languageProp:t,data:[],content:"",name:"select",layVerify:"",layVerType:"",size:"medium",disabled:!1,initValue:null,create:null,tips:t.tips,empty:t.empty,delay:500,searchTips:t.searchTips,filterable:!1,filterMethod:function(e,t,n,o){return!e||-1!=t[o.name].indexOf(e)},remoteSearch:!1,remoteMethod:function(e,t){t([])},direction:"auto",style:{},height:"200px",autoRow:!1,paging:!1,pageSize:10,pageEmptyShow:!0,pageRemote:!1,radio:!1,repeat:!1,clickClose:!1,max:0,maxMethod:function(e,t){},showCount:0,toolbar:{show:!1,showIcon:!0,list:["ALL","CLEAR"]},tree:{show:!1,showFolderIcon:!0,showLine:!0,indent:20,expandedKeys:[],strict:!0,lazy:!1,load:null},cascader:{show:!1,indent:100,strict:!0},prop:{name:"name",value:"value",selected:"selected",disabled:"disabled",children:"children",optgroup:"optgroup",click:"click"},theme:{color:"#009688",maxColor:"#e54d42",hover:"#f2f2f2"},model:{label:{type:"block",text:{left:"",right:"",separator:", "},block:{showCount:0,showIcon:!0,template:null},count:{template:function(e,t){return"已选中 ".concat(t.length," 项, 共 ").concat(e.length," 项")}}},icon:"show",type:"absolute"},show:function(){},hide:function(){},template:function(e){e.item,e.sels;var t=e.name;return e.value,t},on:function(e){e.arr,e.item,e.selected}}}(e.language),this.update(e)}},{key:"update",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=!!e.data;this.options=c(this.options,e);var n=this.options.dom;if(n){var o=this.options.data||[];if("function"==typeof o&&(o=o(),this.options.data=o),a(o))return U(_(Pe,ze({},this.options,{updateData:t})),n),this;l("data数据必须为数组类型, 不能是".concat("undefined"==typeof data?"undefined":Le(data),"类型"))}else l("没有找到渲染对象: ".concat(e.el,", 请检查"))}},{key:"reset",value:function(){var e=this.options.el;return this.init(Ne[e]),He[e].init(this.options,!0),this}},{key:"opened",value:function(){var e=He[this.options.el];return!e.state.show&&e.onClick(),this}},{key:"closed",value:function(){var e=He[this.options.el];return e.state.show&&e.onClick(),this}},{key:"getValue",value:function(e){var t=this,n=He[this.options.el].state.sels.map((function(e){return delete(e=function(e){for(var t=1;t2&&void 0!==arguments[2]&&arguments[2];if(a(e))return He[this.options.el].value(this.options.radio?e.slice(0,1):e,t,n),this;l("请传入数组结构...")}},{key:"append",value:function(e){if(a(e))return He[this.options.el].append(e),this;l("请传入数组结构...")}},{key:"delete",value:function(e){if(a(e))return He[this.options.el].del(e),this;l("请传入数组结构...")}},{key:"warning",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e||this.options.theme.maxColor;return!0===t?He[this.options.el].base.style.borderColor=n:He[this.options.el].updateBorderColor(n),this}}])&&Ve(t.prototype,n),o&&Ve(t,o),e}();function Ue(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/assets/third_party/TCPlayer/font/VideoJS.ttf b/jun_pc_web/assets/third_party/TCPlayer/font/VideoJS.ttf new file mode 100644 index 000000000..bbe4780fc Binary files /dev/null and b/jun_pc_web/assets/third_party/TCPlayer/font/VideoJS.ttf differ diff --git a/jun_pc_web/assets/third_party/TCPlayer/font/VideoJS.woff b/jun_pc_web/assets/third_party/TCPlayer/font/VideoJS.woff new file mode 100644 index 000000000..e0a7cd8ff Binary files /dev/null and b/jun_pc_web/assets/third_party/TCPlayer/font/VideoJS.woff differ diff --git a/jun_pc_web/assets/third_party/TCPlayer/ie8/videojs-ie8.js b/jun_pc_web/assets/third_party/TCPlayer/ie8/videojs-ie8.js new file mode 100644 index 000000000..8a660b911 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/ie8/videojs-ie8.js @@ -0,0 +1,2600 @@ +/** + * HTML5 Element Shim for IE8 + * + * **THIS CODE MUST BE LOADED IN THE OF THE DOCUMENT** + * + * Video.js uses the video tag as an embed code, even in IE8 which + * doesn't have support for HTML5 video. The following code is needed + * to make it possible to use the video tag. Otherwise IE8 ignores everything + * inside the video tag. + */ +if (typeof window.HTMLVideoElement === 'undefined') { + document.createElement('video'); + document.createElement('audio'); + document.createElement('track'); +} + +/*! + * https://github.com/es-shims/es5-shim + * @license es5-shim Copyright 2009-2015 by contributors, MIT License + * see https://github.com/es-shims/es5-shim/blob/master/LICENSE + */ + +// vim: ts=4 sts=4 sw=4 expandtab + +// Add semicolon to prevent IIFE from being passed as argument to concatenated code. +; + +// UMD (Universal Module Definition) +// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js +(function (root, factory) { + 'use strict'; + + /* global define, exports, module */ + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like enviroments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + root.returnExports = factory(); + } +}(this, function () { + +/** + * Brings an environment as close to ECMAScript 5 compliance + * as is possible with the facilities of erstwhile engines. + * + * Annotated ES5: http://es5.github.com/ (specific links below) + * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf + * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/ + */ + +// Shortcut to an often accessed properties, in order to avoid multiple +// dereference that costs universally. This also holds a reference to known-good +// functions. +var $Array = Array; +var ArrayPrototype = $Array.prototype; +var $Object = Object; +var ObjectPrototype = $Object.prototype; +var FunctionPrototype = Function.prototype; +var $String = String; +var StringPrototype = $String.prototype; +var $Number = Number; +var NumberPrototype = $Number.prototype; +var array_slice = ArrayPrototype.slice; +var array_splice = ArrayPrototype.splice; +var array_push = ArrayPrototype.push; +var array_unshift = ArrayPrototype.unshift; +var array_concat = ArrayPrototype.concat; +var call = FunctionPrototype.call; +var apply = FunctionPrototype.apply; +var max = Math.max; +var min = Math.min; + +// Having a toString local variable name breaks in Opera so use to_string. +var to_string = ObjectPrototype.toString; + +var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; +var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; }; +var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; }; +var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; }; + +/* inlined from http://npmjs.com/define-properties */ +var supportsDescriptors = $Object.defineProperty && (function () { + try { + var obj = {}; + $Object.defineProperty(obj, 'x', { enumerable: false, value: obj }); + for (var _ in obj) { return false; } + return obj.x === obj; + } catch (e) { /* this is ES3 */ + return false; + } +}()); +var defineProperties = (function (has) { + // Define configurable, writable, and non-enumerable props + // if they don't exist. + var defineProperty; + if (supportsDescriptors) { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + $Object.defineProperty(object, name, { + configurable: true, + enumerable: false, + writable: true, + value: method + }); + }; + } else { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + object[name] = method; + }; + } + return function defineProperties(object, map, forceAssign) { + for (var name in map) { + if (has.call(map, name)) { + defineProperty(object, name, map[name], forceAssign); + } + } + }; +}(ObjectPrototype.hasOwnProperty)); + +// +// Util +// ====== +// + +/* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */ +var isPrimitive = function isPrimitive(input) { + var type = typeof input; + return input === null || (type !== 'object' && type !== 'function'); +}; + +var isActualNaN = $Number.isNaN || function (x) { return x !== x; }; + +var ES = { + // ES5 9.4 + // http://es5.github.com/#x9.4 + // http://jsperf.com/to-integer + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */ + ToInteger: function ToInteger(num) { + var n = +num; + if (isActualNaN(n)) { + n = 0; + } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; + }, + + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */ + ToPrimitive: function ToPrimitive(input) { + var val, valueOf, toStr; + if (isPrimitive(input)) { + return input; + } + valueOf = input.valueOf; + if (isCallable(valueOf)) { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toStr = input.toString; + if (isCallable(toStr)) { + val = toStr.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); + }, + + // ES5 9.9 + // http://es5.github.com/#x9.9 + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */ + ToObject: function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert " + o + ' to object'); + } + return $Object(o); + }, + + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */ + ToUint32: function ToUint32(x) { + return x >>> 0; + } +}; + +// +// Function +// ======== +// + +// ES-5 15.3.4.5 +// http://es5.github.com/#x15.3.4.5 + +var Empty = function Empty() {}; + +defineProperties(FunctionPrototype, { + bind: function bind(that) { // .length is 1 + // 1. Let Target be the this value. + var target = this; + // 2. If IsCallable(Target) is false, throw a TypeError exception. + if (!isCallable(target)) { + throw new TypeError('Function.prototype.bind called on incompatible ' + target); + } + // 3. Let A be a new (possibly empty) internal list of all of the + // argument values provided after thisArg (arg1, arg2 etc), in order. + // XXX slicedArgs will stand in for "A" if used + var args = array_slice.call(arguments, 1); // for normal call + // 4. Let F be a new native ECMAScript object. + // 11. Set the [[Prototype]] internal property of F to the standard + // built-in Function prototype object as specified in 15.3.3.1. + // 12. Set the [[Call]] internal property of F as described in + // 15.3.4.5.1. + // 13. Set the [[Construct]] internal property of F as described in + // 15.3.4.5.2. + // 14. Set the [[HasInstance]] internal property of F as described in + // 15.3.4.5.3. + var bound; + var binder = function () { + + if (this instanceof bound) { + // 15.3.4.5.2 [[Construct]] + // When the [[Construct]] internal method of a function object, + // F that was created using the bind function is called with a + // list of arguments ExtraArgs, the following steps are taken: + // 1. Let target be the value of F's [[TargetFunction]] + // internal property. + // 2. If target has no [[Construct]] internal method, a + // TypeError exception is thrown. + // 3. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Construct]] internal + // method of target providing args as the arguments. + + var result = target.apply( + this, + array_concat.call(args, array_slice.call(arguments)) + ); + if ($Object(result) === result) { + return result; + } + return this; + + } else { + // 15.3.4.5.1 [[Call]] + // When the [[Call]] internal method of a function object, F, + // which was created using the bind function is called with a + // this value and a list of arguments ExtraArgs, the following + // steps are taken: + // 1. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 2. Let boundThis be the value of F's [[BoundThis]] internal + // property. + // 3. Let target be the value of F's [[TargetFunction]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Call]] internal method + // of target providing boundThis as the this value and + // providing args as the arguments. + + // equiv: target.call(this, ...boundArgs, ...args) + return target.apply( + that, + array_concat.call(args, array_slice.call(arguments)) + ); + + } + + }; + + // 15. If the [[Class]] internal property of Target is "Function", then + // a. Let L be the length property of Target minus the length of A. + // b. Set the length own property of F to either 0 or L, whichever is + // larger. + // 16. Else set the length own property of F to 0. + + var boundLength = max(0, target.length - args.length); + + // 17. Set the attributes of the length own property of F to the values + // specified in 15.3.5.1. + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + array_push.call(boundArgs, '$' + i); + } + + // XXX Build a dynamic function with desired amount of arguments is the only + // way to set the length property of a function. + // In environments where Content Security Policies enabled (Chrome extensions, + // for ex.) all use of eval or Function costructor throws an exception. + // However in all of these environments Function.prototype.bind exists + // and so this code will never be executed. + bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder); + + if (target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + // Clean up dangling references. + Empty.prototype = null; + } + + // TODO + // 18. Set the [[Extensible]] internal property of F to true. + + // TODO + // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). + // 20. Call the [[DefineOwnProperty]] internal method of F with + // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: + // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and + // false. + // 21. Call the [[DefineOwnProperty]] internal method of F with + // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, + // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, + // and false. + + // TODO + // NOTE Function objects created using Function.prototype.bind do not + // have a prototype property or the [[Code]], [[FormalParameters]], and + // [[Scope]] internal properties. + // XXX can't delete prototype in pure-js. + + // 22. Return F. + return bound; + } +}); + +// _Please note: Shortcuts are defined after `Function.prototype.bind` as we +// use it in defining shortcuts. +var owns = call.bind(ObjectPrototype.hasOwnProperty); +var toStr = call.bind(ObjectPrototype.toString); +var arraySlice = call.bind(array_slice); +var arraySliceApply = apply.bind(array_slice); +var strSlice = call.bind(StringPrototype.slice); +var strSplit = call.bind(StringPrototype.split); +var strIndexOf = call.bind(StringPrototype.indexOf); +var pushCall = call.bind(array_push); +var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable); +var arraySort = call.bind(ArrayPrototype.sort); + +// +// Array +// ===== +// + +var isArray = $Array.isArray || function isArray(obj) { + return toStr(obj) === '[object Array]'; +}; + +// ES5 15.4.4.12 +// http://es5.github.com/#x15.4.4.13 +// Return len+argCount. +// [bugfix, ielt8] +// IE < 8 bug: [].unshift(0) === undefined but should be "1" +var hasUnshiftReturnValueBug = [].unshift(0) !== 1; +defineProperties(ArrayPrototype, { + unshift: function () { + array_unshift.apply(this, arguments); + return this.length; + } +}, hasUnshiftReturnValueBug); + +// ES5 15.4.3.2 +// http://es5.github.com/#x15.4.3.2 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray +defineProperties($Array, { isArray: isArray }); + +// The IsCallable() check in the Array functions +// has been replaced with a strict check on the +// internal class of the object to trap cases where +// the provided function was actually a regular +// expression literal, which in V8 and +// JavaScriptCore is a typeof "function". Only in +// V8 are regular expression literals permitted as +// reduce parameters, so it is desirable in the +// general case for the shim to match the more +// strict and common behavior of rejecting regular +// expressions. + +// ES5 15.4.4.18 +// http://es5.github.com/#x15.4.4.18 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach + +// Check failure of by-index access of string characters (IE < 9) +// and failure of `0 in boxedString` (Rhino) +var boxedString = $Object('a'); +var splitString = boxedString[0] !== 'a' || !(0 in boxedString); + +var properlyBoxesContext = function properlyBoxed(method) { + // Check node 0.6.21 bug where third parameter is not boxed + var properlyBoxesNonStrict = true; + var properlyBoxesStrict = true; + var threwException = false; + if (method) { + try { + method.call('foo', function (_, __, context) { + if (typeof context !== 'object') { properlyBoxesNonStrict = false; } + }); + + method.call([1], function () { + 'use strict'; + + properlyBoxesStrict = typeof this === 'string'; + }, 'x'); + } catch (e) { + threwException = true; + } + } + return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict; +}; + +defineProperties(ArrayPrototype, { + forEach: function forEach(callbackfn/*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? strSplit(this, '') : object; + var i = -1; + var length = ES.ToUint32(self.length); + var T; + if (arguments.length > 1) { + T = arguments[1]; + } + + // If no callback function or if callback is not a callable function + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.forEach callback must be a function'); + } + + while (++i < length) { + if (i in self) { + // Invoke the callback function with call, passing arguments: + // context, property value, property key, thisArg object + if (typeof T === 'undefined') { + callbackfn(self[i], i, object); + } else { + callbackfn.call(T, self[i], i, object); + } + } + } + } +}, !properlyBoxesContext(ArrayPrototype.forEach)); + +// ES5 15.4.4.19 +// http://es5.github.com/#x15.4.4.19 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map +defineProperties(ArrayPrototype, { + map: function map(callbackfn/*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? strSplit(this, '') : object; + var length = ES.ToUint32(self.length); + var result = $Array(length); + var T; + if (arguments.length > 1) { + T = arguments[1]; + } + + // If no callback function or if callback is not a callable function + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.map callback must be a function'); + } + + for (var i = 0; i < length; i++) { + if (i in self) { + if (typeof T === 'undefined') { + result[i] = callbackfn(self[i], i, object); + } else { + result[i] = callbackfn.call(T, self[i], i, object); + } + } + } + return result; + } +}, !properlyBoxesContext(ArrayPrototype.map)); + +// ES5 15.4.4.20 +// http://es5.github.com/#x15.4.4.20 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter +defineProperties(ArrayPrototype, { + filter: function filter(callbackfn/*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? strSplit(this, '') : object; + var length = ES.ToUint32(self.length); + var result = []; + var value; + var T; + if (arguments.length > 1) { + T = arguments[1]; + } + + // If no callback function or if callback is not a callable function + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.filter callback must be a function'); + } + + for (var i = 0; i < length; i++) { + if (i in self) { + value = self[i]; + if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) { + pushCall(result, value); + } + } + } + return result; + } +}, !properlyBoxesContext(ArrayPrototype.filter)); + +// ES5 15.4.4.16 +// http://es5.github.com/#x15.4.4.16 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every +defineProperties(ArrayPrototype, { + every: function every(callbackfn/*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? strSplit(this, '') : object; + var length = ES.ToUint32(self.length); + var T; + if (arguments.length > 1) { + T = arguments[1]; + } + + // If no callback function or if callback is not a callable function + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.every callback must be a function'); + } + + for (var i = 0; i < length; i++) { + if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { + return false; + } + } + return true; + } +}, !properlyBoxesContext(ArrayPrototype.every)); + +// ES5 15.4.4.17 +// http://es5.github.com/#x15.4.4.17 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some +defineProperties(ArrayPrototype, { + some: function some(callbackfn/*, thisArg */) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? strSplit(this, '') : object; + var length = ES.ToUint32(self.length); + var T; + if (arguments.length > 1) { + T = arguments[1]; + } + + // If no callback function or if callback is not a callable function + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.some callback must be a function'); + } + + for (var i = 0; i < length; i++) { + if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { + return true; + } + } + return false; + } +}, !properlyBoxesContext(ArrayPrototype.some)); + +// ES5 15.4.4.21 +// http://es5.github.com/#x15.4.4.21 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce +var reduceCoercesToObject = false; +if (ArrayPrototype.reduce) { + reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object'; +} +defineProperties(ArrayPrototype, { + reduce: function reduce(callbackfn/*, initialValue*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? strSplit(this, '') : object; + var length = ES.ToUint32(self.length); + + // If no callback function or if callback is not a callable function + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.reduce callback must be a function'); + } + + // no value to return if no initial value and an empty array + if (length === 0 && arguments.length === 1) { + throw new TypeError('reduce of empty array with no initial value'); + } + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + + // if array contains no values, no initial value to return + if (++i >= length) { + throw new TypeError('reduce of empty array with no initial value'); + } + } while (true); + } + + for (; i < length; i++) { + if (i in self) { + result = callbackfn(result, self[i], i, object); + } + } + + return result; + } +}, !reduceCoercesToObject); + +// ES5 15.4.4.22 +// http://es5.github.com/#x15.4.4.22 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight +var reduceRightCoercesToObject = false; +if (ArrayPrototype.reduceRight) { + reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object'; +} +defineProperties(ArrayPrototype, { + reduceRight: function reduceRight(callbackfn/*, initial*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? strSplit(this, '') : object; + var length = ES.ToUint32(self.length); + + // If no callback function or if callback is not a callable function + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.reduceRight callback must be a function'); + } + + // no value to return if no initial value, empty array + if (length === 0 && arguments.length === 1) { + throw new TypeError('reduceRight of empty array with no initial value'); + } + + var result; + var i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + + // if array contains no values, no initial value to return + if (--i < 0) { + throw new TypeError('reduceRight of empty array with no initial value'); + } + } while (true); + } + + if (i < 0) { + return result; + } + + do { + if (i in self) { + result = callbackfn(result, self[i], i, object); + } + } while (i--); + + return result; + } +}, !reduceRightCoercesToObject); + +// ES5 15.4.4.14 +// http://es5.github.com/#x15.4.4.14 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf +var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1; +defineProperties(ArrayPrototype, { + indexOf: function indexOf(searchElement/*, fromIndex */) { + var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); + var length = ES.ToUint32(self.length); + + if (length === 0) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = ES.ToInteger(arguments[1]); + } + + // handle negative indices + i = i >= 0 ? i : max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === searchElement) { + return i; + } + } + return -1; + } +}, hasFirefox2IndexOfBug); + +// ES5 15.4.4.15 +// http://es5.github.com/#x15.4.4.15 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf +var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1; +defineProperties(ArrayPrototype, { + lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) { + var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); + var length = ES.ToUint32(self.length); + + if (length === 0) { + return -1; + } + var i = length - 1; + if (arguments.length > 1) { + i = min(i, ES.ToInteger(arguments[1])); + } + // handle negative indices + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && searchElement === self[i]) { + return i; + } + } + return -1; + } +}, hasFirefox2LastIndexOfBug); + +// ES5 15.4.4.12 +// http://es5.github.com/#x15.4.4.12 +var spliceNoopReturnsEmptyArray = (function () { + var a = [1, 2]; + var result = a.splice(); + return a.length === 2 && isArray(result) && result.length === 0; +}()); +defineProperties(ArrayPrototype, { + // Safari 5.0 bug where .splice() returns undefined + splice: function splice(start, deleteCount) { + if (arguments.length === 0) { + return []; + } else { + return array_splice.apply(this, arguments); + } + } +}, !spliceNoopReturnsEmptyArray); + +var spliceWorksWithEmptyObject = (function () { + var obj = {}; + ArrayPrototype.splice.call(obj, 0, 0, 1); + return obj.length === 1; +}()); +defineProperties(ArrayPrototype, { + splice: function splice(start, deleteCount) { + if (arguments.length === 0) { return []; } + var args = arguments; + this.length = max(ES.ToInteger(this.length), 0); + if (arguments.length > 0 && typeof deleteCount !== 'number') { + args = arraySlice(arguments); + if (args.length < 2) { + pushCall(args, this.length - start); + } else { + args[1] = ES.ToInteger(deleteCount); + } + } + return array_splice.apply(this, args); + } +}, !spliceWorksWithEmptyObject); +var spliceWorksWithLargeSparseArrays = (function () { + // Per https://github.com/es-shims/es5-shim/issues/295 + // Safari 7/8 breaks with sparse arrays of size 1e5 or greater + var arr = new $Array(1e5); + // note: the index MUST be 8 or larger or the test will false pass + arr[8] = 'x'; + arr.splice(1, 1); + // note: this test must be defined *after* the indexOf shim + // per https://github.com/es-shims/es5-shim/issues/313 + return arr.indexOf('x') === 7; +}()); +var spliceWorksWithSmallSparseArrays = (function () { + // Per https://github.com/es-shims/es5-shim/issues/295 + // Opera 12.15 breaks on this, no idea why. + var n = 256; + var arr = []; + arr[n] = 'a'; + arr.splice(n + 1, 0, 'b'); + return arr[n] === 'a'; +}()); +defineProperties(ArrayPrototype, { + splice: function splice(start, deleteCount) { + var O = ES.ToObject(this); + var A = []; + var len = ES.ToUint32(O.length); + var relativeStart = ES.ToInteger(start); + var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len); + var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart); + + var k = 0; + var from; + while (k < actualDeleteCount) { + from = $String(actualStart + k); + if (owns(O, from)) { + A[k] = O[from]; + } + k += 1; + } + + var items = arraySlice(arguments, 2); + var itemCount = items.length; + var to; + if (itemCount < actualDeleteCount) { + k = actualStart; + while (k < (len - actualDeleteCount)) { + from = $String(k + actualDeleteCount); + to = $String(k + itemCount); + if (owns(O, from)) { + O[to] = O[from]; + } else { + delete O[to]; + } + k += 1; + } + k = len; + while (k > (len - actualDeleteCount + itemCount)) { + delete O[k - 1]; + k -= 1; + } + } else if (itemCount > actualDeleteCount) { + k = len - actualDeleteCount; + while (k > actualStart) { + from = $String(k + actualDeleteCount - 1); + to = $String(k + itemCount - 1); + if (owns(O, from)) { + O[to] = O[from]; + } else { + delete O[to]; + } + k -= 1; + } + } + k = actualStart; + for (var i = 0; i < items.length; ++i) { + O[k] = items[i]; + k += 1; + } + O.length = len - actualDeleteCount + itemCount; + + return A; + } +}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays); + +var originalJoin = ArrayPrototype.join; +var hasStringJoinBug; +try { + hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3'; +} catch (e) { + hasStringJoinBug = true; +} +if (hasStringJoinBug) { + defineProperties(ArrayPrototype, { + join: function join(separator) { + var sep = typeof separator === 'undefined' ? ',' : separator; + return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep); + } + }, hasStringJoinBug); +} + +var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2'; +if (hasJoinUndefinedBug) { + defineProperties(ArrayPrototype, { + join: function join(separator) { + var sep = typeof separator === 'undefined' ? ',' : separator; + return originalJoin.call(this, sep); + } + }, hasJoinUndefinedBug); +} + +var pushShim = function push(item) { + var O = ES.ToObject(this); + var n = ES.ToUint32(O.length); + var i = 0; + while (i < arguments.length) { + O[n + i] = arguments[i]; + i += 1; + } + O.length = n + i; + return n + i; +}; + +var pushIsNotGeneric = (function () { + var obj = {}; + var result = Array.prototype.push.call(obj, undefined); + return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0); +}()); +defineProperties(ArrayPrototype, { + push: function push(item) { + if (isArray(this)) { + return array_push.apply(this, arguments); + } + return pushShim.apply(this, arguments); + } +}, pushIsNotGeneric); + +// This fixes a very weird bug in Opera 10.6 when pushing `undefined +var pushUndefinedIsWeird = (function () { + var arr = []; + var result = arr.push(undefined); + return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0); +}()); +defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird); + +// ES5 15.2.3.14 +// http://es5.github.io/#x15.4.4.10 +// Fix boxed string bug +defineProperties(ArrayPrototype, { + slice: function (start, end) { + var arr = isString(this) ? strSplit(this, '') : this; + return arraySliceApply(arr, arguments); + } +}, splitString); + +var sortIgnoresNonFunctions = (function () { + try { + [1, 2].sort(null); + [1, 2].sort({}); + return true; + } catch (e) { /**/ } + return false; +}()); +var sortThrowsOnRegex = (function () { + // this is a problem in Firefox 4, in which `typeof /a/ === 'function'` + try { + [1, 2].sort(/a/); + return false; + } catch (e) { /**/ } + return true; +}()); +var sortIgnoresUndefined = (function () { + // applies in IE 8, for one. + try { + [1, 2].sort(undefined); + return true; + } catch (e) { /**/ } + return false; +}()); +defineProperties(ArrayPrototype, { + sort: function sort(compareFn) { + if (typeof compareFn === 'undefined') { + return arraySort(this); + } + if (!isCallable(compareFn)) { + throw new TypeError('Array.prototype.sort callback must be a function'); + } + return arraySort(this, compareFn); + } +}, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex); + +// +// Object +// ====== +// + +// ES5 15.2.3.14 +// http://es5.github.com/#x15.2.3.14 + +// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation +var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString'); +var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'); +var hasStringEnumBug = !owns('x', '0'); +var equalsConstructorPrototype = function (o) { + var ctor = o.constructor; + return ctor && ctor.prototype === o; +}; +var blacklistedKeys = { + $window: true, + $console: true, + $parent: true, + $self: true, + $frame: true, + $frames: true, + $frameElement: true, + $webkitIndexedDB: true, + $webkitStorageInfo: true, + $external: true +}; +var hasAutomationEqualityBug = (function () { + /* globals window */ + if (typeof window === 'undefined') { return false; } + for (var k in window) { + try { + if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') { + equalsConstructorPrototype(window[k]); + } + } catch (e) { + return true; + } + } + return false; +}()); +var equalsConstructorPrototypeIfNotBuggy = function (object) { + if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(object); } + try { + return equalsConstructorPrototype(object); + } catch (e) { + return false; + } +}; +var dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' +]; +var dontEnumsLength = dontEnums.length; + +// taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js +// can be replaced with require('is-arguments') if we ever use a build process instead +var isStandardArguments = function isArguments(value) { + return toStr(value) === '[object Arguments]'; +}; +var isLegacyArguments = function isArguments(value) { + return value !== null && + typeof value === 'object' && + typeof value.length === 'number' && + value.length >= 0 && + !isArray(value) && + isCallable(value.callee); +}; +var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments; + +defineProperties($Object, { + keys: function keys(object) { + var isFn = isCallable(object); + var isArgs = isArguments(object); + var isObject = object !== null && typeof object === 'object'; + var isStr = isObject && isString(object); + + if (!isObject && !isFn && !isArgs) { + throw new TypeError('Object.keys called on a non-object'); + } + + var theKeys = []; + var skipProto = hasProtoEnumBug && isFn; + if ((isStr && hasStringEnumBug) || isArgs) { + for (var i = 0; i < object.length; ++i) { + pushCall(theKeys, $String(i)); + } + } + + if (!isArgs) { + for (var name in object) { + if (!(skipProto && name === 'prototype') && owns(object, name)) { + pushCall(theKeys, $String(name)); + } + } + } + + if (hasDontEnumBug) { + var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); + for (var j = 0; j < dontEnumsLength; j++) { + var dontEnum = dontEnums[j]; + if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) { + pushCall(theKeys, dontEnum); + } + } + } + return theKeys; + } +}); + +var keysWorksWithArguments = $Object.keys && (function () { + // Safari 5.0 bug + return $Object.keys(arguments).length === 2; +}(1, 2)); +var keysHasArgumentsLengthBug = $Object.keys && (function () { + var argKeys = $Object.keys(arguments); + return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1; +}(1)); +var originalKeys = $Object.keys; +defineProperties($Object, { + keys: function keys(object) { + if (isArguments(object)) { + return originalKeys(arraySlice(object)); + } else { + return originalKeys(object); + } + } +}, !keysWorksWithArguments || keysHasArgumentsLengthBug); + +// +// Date +// ==== +// + +var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0; +var aNegativeTestDate = new Date(-1509842289600292); +var aPositiveTestDate = new Date(1449662400000); +var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT'; +var hasToDateStringFormatBug; +var hasToStringFormatBug; +var timeZoneOffset = aNegativeTestDate.getTimezoneOffset(); +if (timeZoneOffset < -720) { + hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875'; + hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); +} else { + hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875'; + hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); +} + +var originalGetFullYear = call.bind(Date.prototype.getFullYear); +var originalGetMonth = call.bind(Date.prototype.getMonth); +var originalGetDate = call.bind(Date.prototype.getDate); +var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear); +var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth); +var originalGetUTCDate = call.bind(Date.prototype.getUTCDate); +var originalGetUTCDay = call.bind(Date.prototype.getUTCDay); +var originalGetUTCHours = call.bind(Date.prototype.getUTCHours); +var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes); +var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds); +var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds); +var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri']; +var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; +var daysInMonth = function daysInMonth(month, year) { + return originalGetDate(new Date(year, month, 0)); +}; + +defineProperties(Date.prototype, { + getFullYear: function getFullYear() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var year = originalGetFullYear(this); + if (year < 0 && originalGetMonth(this) > 11) { + return year + 1; + } + return year; + }, + getMonth: function getMonth() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var year = originalGetFullYear(this); + var month = originalGetMonth(this); + if (year < 0 && month > 11) { + return 0; + } + return month; + }, + getDate: function getDate() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var year = originalGetFullYear(this); + var month = originalGetMonth(this); + var date = originalGetDate(this); + if (year < 0 && month > 11) { + if (month === 12) { + return date; + } + var days = daysInMonth(0, year + 1); + return (days - date) + 1; + } + return date; + }, + getUTCFullYear: function getUTCFullYear() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var year = originalGetUTCFullYear(this); + if (year < 0 && originalGetUTCMonth(this) > 11) { + return year + 1; + } + return year; + }, + getUTCMonth: function getUTCMonth() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var year = originalGetUTCFullYear(this); + var month = originalGetUTCMonth(this); + if (year < 0 && month > 11) { + return 0; + } + return month; + }, + getUTCDate: function getUTCDate() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var year = originalGetUTCFullYear(this); + var month = originalGetUTCMonth(this); + var date = originalGetUTCDate(this); + if (year < 0 && month > 11) { + if (month === 12) { + return date; + } + var days = daysInMonth(0, year + 1); + return (days - date) + 1; + } + return date; + } +}, hasNegativeMonthYearBug); + +defineProperties(Date.prototype, { + toUTCString: function toUTCString() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var day = originalGetUTCDay(this); + var date = originalGetUTCDate(this); + var month = originalGetUTCMonth(this); + var year = originalGetUTCFullYear(this); + var hour = originalGetUTCHours(this); + var minute = originalGetUTCMinutes(this); + var second = originalGetUTCSeconds(this); + return dayName[day] + ', ' + + (date < 10 ? '0' + date : date) + ' ' + + monthName[month] + ' ' + + year + ' ' + + (hour < 10 ? '0' + hour : hour) + ':' + + (minute < 10 ? '0' + minute : minute) + ':' + + (second < 10 ? '0' + second : second) + ' GMT'; + } +}, hasNegativeMonthYearBug || hasToUTCStringFormatBug); + +// Opera 12 has `,` +defineProperties(Date.prototype, { + toDateString: function toDateString() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var day = this.getDay(); + var date = this.getDate(); + var month = this.getMonth(); + var year = this.getFullYear(); + return dayName[day] + ' ' + + monthName[month] + ' ' + + (date < 10 ? '0' + date : date) + ' ' + + year; + } +}, hasNegativeMonthYearBug || hasToDateStringFormatBug); + +// can't use defineProperties here because of toString enumeration issue in IE <= 8 +if (hasNegativeMonthYearBug || hasToStringFormatBug) { + Date.prototype.toString = function toString() { + if (!this || !(this instanceof Date)) { + throw new TypeError('this is not a Date object.'); + } + var day = this.getDay(); + var date = this.getDate(); + var month = this.getMonth(); + var year = this.getFullYear(); + var hour = this.getHours(); + var minute = this.getMinutes(); + var second = this.getSeconds(); + var timezoneOffset = this.getTimezoneOffset(); + var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60); + var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60); + return dayName[day] + ' ' + + monthName[month] + ' ' + + (date < 10 ? '0' + date : date) + ' ' + + year + ' ' + + (hour < 10 ? '0' + hour : hour) + ':' + + (minute < 10 ? '0' + minute : minute) + ':' + + (second < 10 ? '0' + second : second) + ' GMT' + + (timezoneOffset > 0 ? '-' : '+') + + (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) + + (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset); + }; + if (supportsDescriptors) { + $Object.defineProperty(Date.prototype, 'toString', { + configurable: true, + enumerable: false, + writable: true + }); + } +} + +// ES5 15.9.5.43 +// http://es5.github.com/#x15.9.5.43 +// This function returns a String value represent the instance in time +// represented by this Date object. The format of the String is the Date Time +// string format defined in 15.9.1.15. All fields are present in the String. +// The time zone is always UTC, denoted by the suffix Z. If the time value of +// this object is not a finite Number a RangeError exception is thrown. +var negativeDate = -62198755200000; +var negativeYearString = '-000001'; +var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1; +var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z'; + +defineProperties(Date.prototype, { + toISOString: function toISOString() { + if (!isFinite(this)) { + throw new RangeError('Date.prototype.toISOString called on non-finite value.'); + } + + var year = originalGetUTCFullYear(this); + + var month = originalGetUTCMonth(this); + // see https://github.com/es-shims/es5-shim/issues/111 + year += Math.floor(month / 12); + month = (month % 12 + 12) % 12; + + // the date time string format is specified in 15.9.1.15. + var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)]; + year = ( + (year < 0 ? '-' : (year > 9999 ? '+' : '')) + + strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6) + ); + + for (var i = 0; i < result.length; ++i) { + // pad months, days, hours, minutes, and seconds to have two digits. + result[i] = strSlice('00' + result[i], -2); + } + // pad milliseconds to have three digits. + return ( + year + '-' + arraySlice(result, 0, 2).join('-') + + 'T' + arraySlice(result, 2).join(':') + '.' + + strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z' + ); + } +}, hasNegativeDateBug || hasSafari51DateBug); + +// ES5 15.9.5.44 +// http://es5.github.com/#x15.9.5.44 +// This function provides a String representation of a Date object for use by +// JSON.stringify (15.12.3). +var dateToJSONIsSupported = (function () { + try { + return Date.prototype.toJSON && + new Date(NaN).toJSON() === null && + new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && + Date.prototype.toJSON.call({ // generic + toISOString: function () { return true; } + }); + } catch (e) { + return false; + } +}()); +if (!dateToJSONIsSupported) { + Date.prototype.toJSON = function toJSON(key) { + // When the toJSON method is called with argument key, the following + // steps are taken: + + // 1. Let O be the result of calling ToObject, giving it the this + // value as its argument. + // 2. Let tv be ES.ToPrimitive(O, hint Number). + var O = $Object(this); + var tv = ES.ToPrimitive(O); + // 3. If tv is a Number and is not finite, return null. + if (typeof tv === 'number' && !isFinite(tv)) { + return null; + } + // 4. Let toISO be the result of calling the [[Get]] internal method of + // O with argument "toISOString". + var toISO = O.toISOString; + // 5. If IsCallable(toISO) is false, throw a TypeError exception. + if (!isCallable(toISO)) { + throw new TypeError('toISOString property is not callable'); + } + // 6. Return the result of calling the [[Call]] internal method of + // toISO with O as the this value and an empty argument list. + return toISO.call(O); + + // NOTE 1 The argument is ignored. + + // NOTE 2 The toJSON function is intentionally generic; it does not + // require that its this value be a Date object. Therefore, it can be + // transferred to other kinds of objects for use as a method. However, + // it does require that any such object have a toISOString method. An + // object is free to use the argument key to filter its + // stringification. + }; +} + +// ES5 15.9.4.2 +// http://es5.github.com/#x15.9.4.2 +// based on work shared by Daniel Friesen (dantman) +// http://gist.github.com/303249 +var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15; +var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z')); +var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z')); +if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) { + // XXX global assignment won't work in embeddings that use + // an alternate object for the context. + /* global Date: true */ + /* eslint-disable no-undef */ + var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1; + var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime()); + Date = (function (NativeDate) { + /* eslint-enable no-undef */ + // Date.length === 7 + var DateShim = function Date(Y, M, D, h, m, s, ms) { + var length = arguments.length; + var date; + if (this instanceof NativeDate) { + var seconds = s; + var millis = ms; + if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) { + // work around a Safari 8/9 bug where it treats the seconds as signed + var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; + var sToShift = Math.floor(msToShift / 1e3); + seconds += sToShift; + millis -= sToShift * 1e3; + } + date = length === 1 && $String(Y) === Y ? // isString(Y) + // We explicitly pass it through parse: + new NativeDate(DateShim.parse(Y)) : + // We have to manually make calls depending on argument + // length here + length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) : + length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) : + length >= 5 ? new NativeDate(Y, M, D, h, m) : + length >= 4 ? new NativeDate(Y, M, D, h) : + length >= 3 ? new NativeDate(Y, M, D) : + length >= 2 ? new NativeDate(Y, M) : + length >= 1 ? new NativeDate(Y) : + new NativeDate(); + } else { + date = NativeDate.apply(this, arguments); + } + if (!isPrimitive(date)) { + // Prevent mixups with unfixed Date object + defineProperties(date, { constructor: DateShim }, true); + } + return date; + }; + + // 15.9.1.15 Date Time String Format. + var isoDateExpression = new RegExp('^' + + '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign + + // 6-digit extended year + '(?:-(\\d{2})' + // optional month capture + '(?:-(\\d{2})' + // optional day capture + '(?:' + // capture hours:minutes:seconds.milliseconds + 'T(\\d{2})' + // hours capture + ':(\\d{2})' + // minutes capture + '(?:' + // optional :seconds.milliseconds + ':(\\d{2})' + // seconds capture + '(?:(\\.\\d{1,}))?' + // milliseconds capture + ')?' + + '(' + // capture UTC offset component + 'Z|' + // UTC capture + '(?:' + // offset specifier +/-hours:minutes + '([-+])' + // sign capture + '(\\d{2})' + // hours offset capture + ':(\\d{2})' + // minutes offset capture + ')' + + ')?)?)?)?' + + '$'); + + var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; + + var dayFromMonth = function dayFromMonth(year, month) { + var t = month > 1 ? 1 : 0; + return ( + months[month] + + Math.floor((year - 1969 + t) / 4) - + Math.floor((year - 1901 + t) / 100) + + Math.floor((year - 1601 + t) / 400) + + 365 * (year - 1970) + ); + }; + + var toUTC = function toUTC(t) { + var s = 0; + var ms = t; + if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) { + // work around a Safari 8/9 bug where it treats the seconds as signed + var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; + var sToShift = Math.floor(msToShift / 1e3); + s += sToShift; + ms -= sToShift * 1e3; + } + return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms)); + }; + + // Copy any custom methods a 3rd party library may have added + for (var key in NativeDate) { + if (owns(NativeDate, key)) { + DateShim[key] = NativeDate[key]; + } + } + + // Copy "native" methods explicitly; they may be non-enumerable + defineProperties(DateShim, { + now: NativeDate.now, + UTC: NativeDate.UTC + }, true); + DateShim.prototype = NativeDate.prototype; + defineProperties(DateShim.prototype, { + constructor: DateShim + }, true); + + // Upgrade Date.parse to handle simplified ISO 8601 strings + var parseShim = function parse(string) { + var match = isoDateExpression.exec(string); + if (match) { + // parse months, days, hours, minutes, seconds, and milliseconds + // provide default values if necessary + // parse the UTC offset component + var year = $Number(match[1]), + month = $Number(match[2] || 1) - 1, + day = $Number(match[3] || 1) - 1, + hour = $Number(match[4] || 0), + minute = $Number(match[5] || 0), + second = $Number(match[6] || 0), + millisecond = Math.floor($Number(match[7] || 0) * 1000), + // When time zone is missed, local offset should be used + // (ES 5.1 bug) + // see https://bugs.ecmascript.org/show_bug.cgi?id=112 + isLocalTime = Boolean(match[4] && !match[8]), + signOffset = match[9] === '-' ? 1 : -1, + hourOffset = $Number(match[10] || 0), + minuteOffset = $Number(match[11] || 0), + result; + var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0; + if ( + hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) && + minute < 60 && second < 60 && millisecond < 1000 && + month > -1 && month < 12 && hourOffset < 24 && + minuteOffset < 60 && // detect invalid offsets + day > -1 && + day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month)) + ) { + result = ( + (dayFromMonth(year, month) + day) * 24 + + hour + + hourOffset * signOffset + ) * 60; + result = ( + (result + minute + minuteOffset * signOffset) * 60 + + second + ) * 1000 + millisecond; + if (isLocalTime) { + result = toUTC(result); + } + if (-8.64e15 <= result && result <= 8.64e15) { + return result; + } + } + return NaN; + } + return NativeDate.parse.apply(this, arguments); + }; + defineProperties(DateShim, { parse: parseShim }); + + return DateShim; + }(Date)); + /* global Date: false */ +} + +// ES5 15.9.4.4 +// http://es5.github.com/#x15.9.4.4 +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} + +// +// Number +// ====== +// + +// ES5.1 15.7.4.5 +// http://es5.github.com/#x15.7.4.5 +var hasToFixedBugs = NumberPrototype.toFixed && ( + (0.00008).toFixed(3) !== '0.000' || + (0.9).toFixed(0) !== '1' || + (1.255).toFixed(2) !== '1.25' || + (1000000000000000128).toFixed(0) !== '1000000000000000128' +); + +var toFixedHelpers = { + base: 1e7, + size: 6, + data: [0, 0, 0, 0, 0, 0], + multiply: function multiply(n, c) { + var i = -1; + var c2 = c; + while (++i < toFixedHelpers.size) { + c2 += n * toFixedHelpers.data[i]; + toFixedHelpers.data[i] = c2 % toFixedHelpers.base; + c2 = Math.floor(c2 / toFixedHelpers.base); + } + }, + divide: function divide(n) { + var i = toFixedHelpers.size, c = 0; + while (--i >= 0) { + c += toFixedHelpers.data[i]; + toFixedHelpers.data[i] = Math.floor(c / n); + c = (c % n) * toFixedHelpers.base; + } + }, + numToString: function numToString() { + var i = toFixedHelpers.size; + var s = ''; + while (--i >= 0) { + if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) { + var t = $String(toFixedHelpers.data[i]); + if (s === '') { + s = t; + } else { + s += strSlice('0000000', 0, 7 - t.length) + t; + } + } + } + return s; + }, + pow: function pow(x, n, acc) { + return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc))); + }, + log: function log(x) { + var n = 0; + var x2 = x; + while (x2 >= 4096) { + n += 12; + x2 /= 4096; + } + while (x2 >= 2) { + n += 1; + x2 /= 2; + } + return n; + } +}; + +var toFixedShim = function toFixed(fractionDigits) { + var f, x, s, m, e, z, j, k; + + // Test for NaN and round fractionDigits down + f = $Number(fractionDigits); + f = isActualNaN(f) ? 0 : Math.floor(f); + + if (f < 0 || f > 20) { + throw new RangeError('Number.toFixed called with invalid number of decimals'); + } + + x = $Number(this); + + if (isActualNaN(x)) { + return 'NaN'; + } + + // If it is too big or small, return the string value of the number + if (x <= -1e21 || x >= 1e21) { + return $String(x); + } + + s = ''; + + if (x < 0) { + s = '-'; + x = -x; + } + + m = '0'; + + if (x > 1e-21) { + // 1e-21 < x < 1e21 + // -70 < log2(x) < 70 + e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69; + z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1)); + z *= 0x10000000000000; // Math.pow(2, 52); + e = 52 - e; + + // -18 < e < 122 + // x = z / 2 ^ e + if (e > 0) { + toFixedHelpers.multiply(0, z); + j = f; + + while (j >= 7) { + toFixedHelpers.multiply(1e7, 0); + j -= 7; + } + + toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0); + j = e - 1; + + while (j >= 23) { + toFixedHelpers.divide(1 << 23); + j -= 23; + } + + toFixedHelpers.divide(1 << j); + toFixedHelpers.multiply(1, 1); + toFixedHelpers.divide(2); + m = toFixedHelpers.numToString(); + } else { + toFixedHelpers.multiply(0, z); + toFixedHelpers.multiply(1 << (-e), 0); + m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f); + } + } + + if (f > 0) { + k = m.length; + + if (k <= f) { + m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m; + } else { + m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f); + } + } else { + m = s + m; + } + + return m; +}; +defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs); + +var hasToPrecisionUndefinedBug = (function () { + try { + return 1.0.toPrecision(undefined) === '1'; + } catch (e) { + return true; + } +}()); +var originalToPrecision = NumberPrototype.toPrecision; +defineProperties(NumberPrototype, { + toPrecision: function toPrecision(precision) { + return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision); + } +}, hasToPrecisionUndefinedBug); + +// +// String +// ====== +// + +// ES5 15.5.4.14 +// http://es5.github.com/#x15.5.4.14 + +// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] +// Many browsers do not split properly with regular expressions or they +// do not perform the split correctly under obscure conditions. +// See http://blog.stevenlevithan.com/archives/cross-browser-split +// I've tested in many browsers and this seems to cover the deviant ones: +// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] +// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] +// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not +// [undefined, "t", undefined, "e", ...] +// ''.split(/.?/) should be [], not [""] +// '.'.split(/()()/) should be ["."], not ["", "", "."] + +if ( + 'ab'.split(/(?:ab)*/).length !== 2 || + '.'.split(/(.?)(.?)/).length !== 4 || + 'tesst'.split(/(s)*/)[1] === 't' || + 'test'.split(/(?:)/, -1).length !== 4 || + ''.split(/.?/).length || + '.'.split(/()()/).length > 1 +) { + (function () { + var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group + var maxSafe32BitInt = Math.pow(2, 32) - 1; + + StringPrototype.split = function (separator, limit) { + var string = String(this); + if (typeof separator === 'undefined' && limit === 0) { + return []; + } + + // If `separator` is not a regex, use native split + if (!isRegex(separator)) { + return strSplit(this, separator, limit); + } + + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + // in ES6 + (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6 + lastLastIndex = 0, + // Make `global` and avoid `lastIndex` issues by working with a copy + separator2, match, lastIndex, lastLength; + var separatorCopy = new RegExp(separator.source, flags + 'g'); + if (!compliantExecNpcg) { + // Doesn't need flags gy, but they don't hurt + separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags); + } + /* Values for `limit`, per the spec: + * If undefined: 4294967295 // maxSafe32BitInt + * If 0, Infinity, or NaN: 0 + * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; + * If negative number: 4294967296 - Math.floor(Math.abs(limit)) + * If other: Type-convert, then use the above rules + */ + var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit); + match = separatorCopy.exec(string); + while (match) { + // `separatorCopy.lastIndex` is not reliable cross-browser + lastIndex = match.index + match[0].length; + if (lastIndex > lastLastIndex) { + pushCall(output, strSlice(string, lastLastIndex, match.index)); + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1) { + /* eslint-disable no-loop-func */ + match[0].replace(separator2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (typeof arguments[i] === 'undefined') { + match[i] = void 0; + } + } + }); + /* eslint-enable no-loop-func */ + } + if (match.length > 1 && match.index < string.length) { + array_push.apply(output, arraySlice(match, 1)); + } + lastLength = match[0].length; + lastLastIndex = lastIndex; + if (output.length >= splitLimit) { + break; + } + } + if (separatorCopy.lastIndex === match.index) { + separatorCopy.lastIndex++; // Avoid an infinite loop + } + match = separatorCopy.exec(string); + } + if (lastLastIndex === string.length) { + if (lastLength || !separatorCopy.test('')) { + pushCall(output, ''); + } + } else { + pushCall(output, strSlice(string, lastLastIndex)); + } + return output.length > splitLimit ? strSlice(output, 0, splitLimit) : output; + }; + }()); + +// [bugfix, chrome] +// If separator is undefined, then the result array contains just one String, +// which is the this value (converted to a String). If limit is not undefined, +// then the output array is truncated so that it contains no more than limit +// elements. +// "0".split(undefined, 0) -> [] +} else if ('0'.split(void 0, 0).length) { + StringPrototype.split = function split(separator, limit) { + if (typeof separator === 'undefined' && limit === 0) { return []; } + return strSplit(this, separator, limit); + }; +} + +var str_replace = StringPrototype.replace; +var replaceReportsGroupsCorrectly = (function () { + var groups = []; + 'x'.replace(/x(.)?/g, function (match, group) { + pushCall(groups, group); + }); + return groups.length === 1 && typeof groups[0] === 'undefined'; +}()); + +if (!replaceReportsGroupsCorrectly) { + StringPrototype.replace = function replace(searchValue, replaceValue) { + var isFn = isCallable(replaceValue); + var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source); + if (!isFn || !hasCapturingGroups) { + return str_replace.call(this, searchValue, replaceValue); + } else { + var wrappedReplaceValue = function (match) { + var length = arguments.length; + var originalLastIndex = searchValue.lastIndex; + searchValue.lastIndex = 0; + var args = searchValue.exec(match) || []; + searchValue.lastIndex = originalLastIndex; + pushCall(args, arguments[length - 2], arguments[length - 1]); + return replaceValue.apply(this, args); + }; + return str_replace.call(this, searchValue, wrappedReplaceValue); + } + }; +} + +// ECMA-262, 3rd B.2.3 +// Not an ECMAScript standard, although ECMAScript 3rd Edition has a +// non-normative section suggesting uniform semantics and it should be +// normalized across all browsers +// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE +var string_substr = StringPrototype.substr; +var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; +defineProperties(StringPrototype, { + substr: function substr(start, length) { + var normalizedStart = start; + if (start < 0) { + normalizedStart = max(this.length + start, 0); + } + return string_substr.call(this, normalizedStart, length); + } +}, hasNegativeSubstrBug); + +// ES5 15.5.4.20 +// whitespace from: http://es5.github.io/#x15.5.4.20 +var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + + '\u2029\uFEFF'; +var zeroWidth = '\u200b'; +var wsRegexChars = '[' + ws + ']'; +var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*'); +var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$'); +var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim()); +defineProperties(StringPrototype, { + // http://blog.stevenlevithan.com/archives/faster-trim-javascript + // http://perfectionkills.com/whitespace-deviations/ + trim: function trim() { + if (typeof this === 'undefined' || this === null) { + throw new TypeError("can't convert " + this + ' to object'); + } + return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, ''); + } +}, hasTrimWhitespaceBug); +var trim = call.bind(String.prototype.trim); + +var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1; +defineProperties(StringPrototype, { + lastIndexOf: function lastIndexOf(searchString) { + if (typeof this === 'undefined' || this === null) { + throw new TypeError("can't convert " + this + ' to object'); + } + var S = $String(this); + var searchStr = $String(searchString); + var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN; + var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos); + var start = min(max(pos, 0), S.length); + var searchLen = searchStr.length; + var k = start + searchLen; + while (k > 0) { + k = max(0, k - searchLen); + var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr); + if (index !== -1) { + return k + index; + } + } + return -1; + } +}, hasLastIndexBug); + +var originalLastIndexOf = StringPrototype.lastIndexOf; +defineProperties(StringPrototype, { + lastIndexOf: function lastIndexOf(searchString) { + return originalLastIndexOf.apply(this, arguments); + } +}, StringPrototype.lastIndexOf.length !== 1); + +// ES-5 15.1.2.2 +/* eslint-disable radix */ +if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) { +/* eslint-enable radix */ + /* global parseInt: true */ + parseInt = (function (origParseInt) { + var hexRegex = /^[\-+]?0[xX]/; + return function parseInt(str, radix) { + var string = trim(str); + var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10); + return origParseInt(string, defaultedRadix); + }; + }(parseInt)); +} + +// https://es5.github.io/#x15.1.2.3 +if (1 / parseFloat('-0') !== -Infinity) { + /* global parseFloat: true */ + parseFloat = (function (origParseFloat) { + return function parseFloat(string) { + var inputString = trim(string); + var result = origParseFloat(inputString); + return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result; + }; + }(parseFloat)); +} + +if (String(new RangeError('test')) !== 'RangeError: test') { + var errorToStringShim = function toString() { + if (typeof this === 'undefined' || this === null) { + throw new TypeError("can't convert " + this + ' to object'); + } + var name = this.name; + if (typeof name === 'undefined') { + name = 'Error'; + } else if (typeof name !== 'string') { + name = $String(name); + } + var msg = this.message; + if (typeof msg === 'undefined') { + msg = ''; + } else if (typeof msg !== 'string') { + msg = $String(msg); + } + if (!name) { + return msg; + } + if (!msg) { + return name; + } + return name + ': ' + msg; + }; + // can't use defineProperties here because of toString enumeration issue in IE <= 8 + Error.prototype.toString = errorToStringShim; +} + +if (supportsDescriptors) { + var ensureNonEnumerable = function (obj, prop) { + if (isEnum(obj, prop)) { + var desc = Object.getOwnPropertyDescriptor(obj, prop); + desc.enumerable = false; + Object.defineProperty(obj, prop, desc); + } + }; + ensureNonEnumerable(Error.prototype, 'message'); + if (Error.prototype.message !== '') { + Error.prototype.message = ''; + } + ensureNonEnumerable(Error.prototype, 'name'); +} + +if (String(/a/mig) !== '/a/gim') { + var regexToString = function toString() { + var str = '/' + this.source + '/'; + if (this.global) { + str += 'g'; + } + if (this.ignoreCase) { + str += 'i'; + } + if (this.multiline) { + str += 'm'; + } + return str; + }; + // can't use defineProperties here because of toString enumeration issue in IE <= 8 + RegExp.prototype.toString = regexToString; +} + +})); + +/*! + * https://github.com/es-shims/es5-shim + * @license es5-shim Copyright 2009-2015 by contributors, MIT License + * see https://github.com/es-shims/es5-shim/blob/master/LICENSE + */ + +// vim: ts=4 sts=4 sw=4 expandtab + +// Add semicolon to prevent IIFE from being passed as argument to concatenated code. +; + +// UMD (Universal Module Definition) +// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js +(function (root, factory) { + 'use strict'; + + /* global define, exports, module */ + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like enviroments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + root.returnExports = factory(); + } +}(this, function () { + +var call = Function.call; +var prototypeOfObject = Object.prototype; +var owns = call.bind(prototypeOfObject.hasOwnProperty); +var isEnumerable = call.bind(prototypeOfObject.propertyIsEnumerable); +var toStr = call.bind(prototypeOfObject.toString); + +// If JS engine supports accessors creating shortcuts. +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors = owns(prototypeOfObject, '__defineGetter__'); +if (supportsAccessors) { + /* eslint-disable no-underscore-dangle */ + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); + /* eslint-enable no-underscore-dangle */ +} + +// ES5 15.2.3.2 +// http://es5.github.com/#x15.2.3.2 +if (!Object.getPrototypeOf) { + // https://github.com/es-shims/es5-shim/issues#issue/2 + // http://ejohn.org/blog/objectgetprototypeof/ + // recommended by fschaefer on github + // + // sure, and webreflection says ^_^ + // ... this will nerever possibly return null + // ... Opera Mini breaks here with infinite loops + Object.getPrototypeOf = function getPrototypeOf(object) { + /* eslint-disable no-proto */ + var proto = object.__proto__; + /* eslint-enable no-proto */ + if (proto || proto === null) { + return proto; + } else if (toStr(object.constructor) === '[object Function]') { + return object.constructor.prototype; + } else if (object instanceof Object) { + return prototypeOfObject; + } else { + // Correctly return null for Objects created with `Object.create(null)` + // (shammed or native) or `{ __proto__: null}`. Also returns null for + // cross-realm objects on browsers that lack `__proto__` support (like + // IE <11), but that's the best we can do. + return null; + } + }; +} + +// ES5 15.2.3.3 +// http://es5.github.com/#x15.2.3.3 + +var doesGetOwnPropertyDescriptorWork = function doesGetOwnPropertyDescriptorWork(object) { + try { + object.sentinel = 0; + return Object.getOwnPropertyDescriptor(object, 'sentinel').value === 0; + } catch (exception) { + return false; + } +}; + +// check whether getOwnPropertyDescriptor works if it's given. Otherwise, shim partially. +if (Object.defineProperty) { + var getOwnPropertyDescriptorWorksOnObject = doesGetOwnPropertyDescriptorWork({}); + var getOwnPropertyDescriptorWorksOnDom = typeof document === 'undefined' || + doesGetOwnPropertyDescriptorWork(document.createElement('div')); + if (!getOwnPropertyDescriptorWorksOnDom || !getOwnPropertyDescriptorWorksOnObject) { + var getOwnPropertyDescriptorFallback = Object.getOwnPropertyDescriptor; + } +} + +if (!Object.getOwnPropertyDescriptor || getOwnPropertyDescriptorFallback) { + var ERR_NON_OBJECT = 'Object.getOwnPropertyDescriptor called on a non-object: '; + + /* eslint-disable no-proto */ + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object !== 'object' && typeof object !== 'function') || object === null) { + throw new TypeError(ERR_NON_OBJECT + object); + } + + // make a valiant attempt to use the real getOwnPropertyDescriptor + // for I8's DOM elements. + if (getOwnPropertyDescriptorFallback) { + try { + return getOwnPropertyDescriptorFallback.call(Object, object, property); + } catch (exception) { + // try the shim if the real one doesn't work + } + } + + var descriptor; + + // If object does not owns property return undefined immediately. + if (!owns(object, property)) { + return descriptor; + } + + // If object has a property then it's for sure `configurable`, and + // probably `enumerable`. Detect enumerability though. + descriptor = { + enumerable: isEnumerable(object, property), + configurable: true + }; + + // If JS engine supports accessor properties then property may be a + // getter or setter. + if (supportsAccessors) { + // Unfortunately `__lookupGetter__` will return a getter even + // if object has own non getter property along with a same named + // inherited getter. To avoid misbehavior we temporary remove + // `__proto__` so that `__lookupGetter__` will return getter only + // if it's owned by an object. + var prototype = object.__proto__; + var notPrototypeOfObject = object !== prototypeOfObject; + // avoid recursion problem, breaking in Opera Mini when + // Object.getOwnPropertyDescriptor(Object.prototype, 'toString') + // or any other Object.prototype accessor + if (notPrototypeOfObject) { + object.__proto__ = prototypeOfObject; + } + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + + if (notPrototypeOfObject) { + // Once we have getter and setter we can put values back. + object.__proto__ = prototype; + } + + if (getter || setter) { + if (getter) { + descriptor.get = getter; + } + if (setter) { + descriptor.set = setter; + } + // If it was accessor property we're done and return here + // in order to avoid adding `value` to the descriptor. + return descriptor; + } + } + + // If we got this far we know that object has an own property that is + // not an accessor so we set it as a value and return descriptor. + descriptor.value = object[property]; + descriptor.writable = true; + return descriptor; + }; + /* eslint-enable no-proto */ +} + +// ES5 15.2.3.4 +// http://es5.github.com/#x15.2.3.4 +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} + +// ES5 15.2.3.5 +// http://es5.github.com/#x15.2.3.5 +if (!Object.create) { + + // Contributed by Brandon Benvie, October, 2012 + var createEmpty; + var supportsProto = !({ __proto__: null } instanceof Object); + // the following produces false positives + // in Opera Mini => not a reliable check + // Object.prototype.__proto__ === null + + // Check for document.domain and active x support + // No need to use active x approach when document.domain is not set + // see https://github.com/es-shims/es5-shim/issues/150 + // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 + /* global ActiveXObject */ + var shouldUseActiveX = function shouldUseActiveX() { + // return early if document.domain not set + if (!document.domain) { + return false; + } + + try { + return !!new ActiveXObject('htmlfile'); + } catch (exception) { + return false; + } + }; + + // This supports IE8 when document.domain is used + // see https://github.com/es-shims/es5-shim/issues/150 + // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 + var getEmptyViaActiveX = function getEmptyViaActiveX() { + var empty; + var xDoc; + + xDoc = new ActiveXObject('htmlfile'); + + xDoc.write('"),b.close(),a=b.parentWindow.Object.prototype,b=null,a},u=function(){var a,c=b.createElement("iframe"),d=b.body||b.documentElement;return c.style.display="none",d.appendChild(c),c.src="javascript:",a=c.contentWindow.Object.prototype,d.removeChild(c),c=null,a};q=r||"undefined"==typeof b?function(){return{__proto__:null}}:function(){var a=s()?t():u();delete a.constructor,delete a.hasOwnProperty,delete a.propertyIsEnumerable,delete a.isPrototypeOf,delete a.toLocaleString,delete a.toString,delete a.valueOf;var b=function(){};return b.prototype=a,q=function(){return new b},new b},Object.create=function(a,b){var c,d=function(){};if(null===a)c=q();else{if("object"!=typeof a&&"function"!=typeof a)throw new TypeError("Object prototype may only be an Object or null");d.prototype=a,c=new d,c.__proto__=a}return void 0!==b&&Object.defineProperties(c,b),c}}var v=function(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){return!1}};if(Object.defineProperty){var w=v({}),x="undefined"==typeof b||v(b.createElement("div"));if(!w||!x)var y=Object.defineProperty,z=Object.defineProperties}if(!Object.defineProperty||y){var A="Property description must be an object: ",B="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(b,f,h){if("object"!=typeof b&&"function"!=typeof b||null===b)throw new TypeError(B+b);if("object"!=typeof h&&"function"!=typeof h||null===h)throw new TypeError(A+h);if(y)try{return y.call(Object,b,f,h)}catch(i){}if("value"in h)if(k&&(d(b,f)||e(b,f))){var j=b.__proto__;b.__proto__=g,delete b[f],b[f]=h.value,b.__proto__=j}else b[f]=h.value;else{if(!k&&("get"in h||"set"in h))throw new TypeError(C);"get"in h&&a(b,f,h.get),"set"in h&&c(b,f,h.set)}return b}}(!Object.defineProperties||z)&&(Object.defineProperties=function(a,b){if(z)try{return z.call(Object,a,b)}catch(c){}return Object.keys(b).forEach(function(c){"__proto__"!==c&&Object.defineProperty(a,c,b[c])}),a}),Object.seal||(Object.seal=function(a){if(Object(a)!==a)throw new TypeError("Object.seal can only be called on Objects.");return a}),Object.freeze||(Object.freeze=function(a){if(Object(a)!==a)throw new TypeError("Object.freeze can only be called on Objects.");return a});try{Object.freeze(function(){})}catch(D){Object.freeze=function(a){return function(b){return"function"==typeof b?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){if(Object(a)!==a)throw new TypeError("Object.preventExtensions can only be called on Objects.");return a}),Object.isSealed||(Object.isSealed=function(a){if(Object(a)!==a)throw new TypeError("Object.isSealed can only be called on Objects.");return!1}),Object.isFrozen||(Object.isFrozen=function(a){if(Object(a)!==a)throw new TypeError("Object.isFrozen can only be called on Objects.");return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)!==a)throw new TypeError("Object.isExtensible can only be called on Objects.");for(var b="";h(a,b);)b+="?";a[b]=!0;var c=h(a,b);return delete a[b],c})})}(window,document); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/ar.js b/jun_pc_web/assets/third_party/TCPlayer/lang/ar.js new file mode 100644 index 000000000..cf4dda6d3 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/ar.js @@ -0,0 +1,34 @@ +TCPlayer.addLanguage("ar",{ + "Play": "تشغيل", + "Pause": "إيقاف", + "Current Time": "الوقت الحالي", + "Duration Time": "مدة", + "Remaining Time": "الوقت المتبقي", + "Stream Type": "نوع التيار", + "LIVE": "مباشر", + "Loaded": "تم التحميل", + "Progress": "التقدم", + "Fullscreen": "ملء الشاشة", + "Non-Fullscreen": "تعطيل ملء الشاشة", + "Mute": "صامت", + "Unmute": "غير الصامت", + "Playback Rate": "معدل التشغيل", + "Subtitles": "الترجمة", + "subtitles off": "إيقاف الترجمة", + "Captions": "التعليقات", + "captions off": "إيقاف التعليقات", + "Chapters": "فصول", + "You aborted the media playback": "لقد ألغيت تشغيل الفيديو", + "A network error caused the media download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادوم أو الشبكة ، أو فشل بسبب عدم إمكانية قراءة تنسيق الفيديو.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "تم إيقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.", + "No compatible source was found for this media.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو.", + "Play Video": "تشغيل الفيديو", + "Close": "أغلق", + "Modal Window": "نافذة مشروطة", + "This is a modal window": "هذه نافذة مشروطة", + "This modal can be closed by pressing the Escape key or activating the close button.": "يمكن غلق هذه النافذة المشروطة عن طريق الضغط على زر الخروج أو تفعيل زر الإغلاق", + ", opens captions settings dialog": ", تفتح نافذة خيارات التعليقات", + ", opens subtitles settings dialog": ", تفتح نافذة خيارات الترجمة", + ", selected": ", مختار" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/ba.js b/jun_pc_web/assets/third_party/TCPlayer/lang/ba.js new file mode 100644 index 000000000..dc1ddd61a --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/ba.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("ba",{ + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vrijeme", + "Duration Time": "Vrijeme trajanja", + "Remaining Time": "Preostalo vrijeme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Puni ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/bg.js b/jun_pc_web/assets/third_party/TCPlayer/lang/bg.js new file mode 100644 index 000000000..954a7734b --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/bg.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("bg",{ + "Play": "Възпроизвеждане", + "Pause": "Пауза", + "Current Time": "Текущо време", + "Duration Time": "Продължителност", + "Remaining Time": "Оставащо време", + "Stream Type": "Тип на потока", + "LIVE": "НА ЖИВО", + "Loaded": "Заредено", + "Progress": "Прогрес", + "Fullscreen": "Цял екран", + "Non-Fullscreen": "Спиране на цял екран", + "Mute": "Без звук", + "Unmute": "Със звук", + "Playback Rate": "Скорост на възпроизвеждане", + "Subtitles": "Субтитри", + "subtitles off": "Спряни субтитри", + "Captions": "Аудио надписи", + "captions off": "Спряни аудио надписи", + "Chapters": "Глави", + "You aborted the media playback": "Спряхте възпроизвеждането на видеото", + "A network error caused the media download to fail part-way.": "Грешка в мрежата провали изтеглянето на видеото.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Видеото не може да бъде заредено заради проблем със сървъра или мрежата или защото този формат не е поддържан.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Възпроизвеждането на видеото беше прекъснато заради проблем с файла или защото видеото използва опции които браузърът Ви не поддържа.", + "No compatible source was found for this media.": "Не беше намерен съвместим източник за това видео." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/ca.js b/jun_pc_web/assets/third_party/TCPlayer/lang/ca.js new file mode 100644 index 000000000..aa554ae78 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/ca.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("ca",{ + "Play": "Reproducció", + "Pause": "Pausa", + "Current Time": "Temps reproduït", + "Duration Time": "Durada total", + "Remaining Time": "Temps restant", + "Stream Type": "Tipus de seqüència", + "LIVE": "EN DIRECTE", + "Loaded": "Carregat", + "Progress": "Progrés", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Pantalla no completa", + "Mute": "Silencia", + "Unmute": "Amb so", + "Playback Rate": "Velocitat de reproducció", + "Subtitles": "Subtítols", + "subtitles off": "Subtítols desactivats", + "Captions": "Llegendes", + "captions off": "Llegendes desactivades", + "Chapters": "Capítols", + "You aborted the media playback": "Heu interromput la reproducció del vídeo.", + "A network error caused the media download to fail part-way.": "Un error de la xarxa ha interromput la baixada del vídeo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No s'ha pogut carregar el vídeo perquè el servidor o la xarxa han fallat, o bé perquè el seu format no és compatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducció de vídeo s'ha interrumput per un problema de corrupció de dades o bé perquè el vídeo demanava funcions que el vostre navegador no ofereix.", + "No compatible source was found for this media.": "No s'ha trobat cap font compatible amb el vídeo." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/cs.js b/jun_pc_web/assets/third_party/TCPlayer/lang/cs.js new file mode 100644 index 000000000..b22221cff --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/cs.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("cs",{ + "Play": "Přehrát", + "Pause": "Pauza", + "Current Time": "Aktuální čas", + "Duration Time": "Doba trvání", + "Remaining Time": "Zbývající čas", + "Stream Type": "Stream Type", + "LIVE": "ŽIVĚ", + "Loaded": "Načteno", + "Progress": "Stav", + "Fullscreen": "Celá obrazovka", + "Non-Fullscreen": "Zmenšená obrazovka", + "Mute": "Ztlumit zvuk", + "Unmute": "Přehrát zvuk", + "Playback Rate": "Rychlost přehrávání", + "Subtitles": "Titulky", + "subtitles off": "Titulky vypnuty", + "Captions": "Popisky", + "captions off": "Popisky vypnuty", + "Chapters": "Kapitoly", + "You aborted the media playback": "Přehrávání videa je přerušeno.", + "A network error caused the media download to fail part-way.": "Video nemohlo být načteno, kvůli chybě v síti.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video nemohlo být načteno, buď kvůli chybě serveru nebo sítě nebo proto, že daný formát není podporován.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Váš prohlížeč nepodporuje formát videa.", + "No compatible source was found for this media.": "Špatně zadaný zdroj videa." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/da.js b/jun_pc_web/assets/third_party/TCPlayer/lang/da.js new file mode 100644 index 000000000..21d00377b --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/da.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("da",{ + "Play": "Afspil", + "Pause": "Pause", + "Current Time": "Aktuel tid", + "Duration Time": "Varighed", + "Remaining Time": "Resterende tid", + "Stream Type": "Stream-type", + "LIVE": "LIVE", + "Loaded": "Indlæst", + "Progress": "Status", + "Fullscreen": "Fuldskærm", + "Non-Fullscreen": "Luk fuldskærm", + "Mute": "Uden lyd", + "Unmute": "Med lyd", + "Playback Rate": "Afspilningsrate", + "Subtitles": "Undertekster", + "subtitles off": "Uden undertekster", + "Captions": "Undertekster for hørehæmmede", + "captions off": "Uden undertekster for hørehæmmede", + "Chapters": "Kapitler", + "You aborted the media playback": "Du afbrød videoafspilningen.", + "A network error caused the media download to fail part-way.": "En netværksfejl fik download af videoen til at fejle.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke indlæses, enten fordi serveren eller netværket fejlede, eller fordi formatet ikke er understøttet.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoafspilningen blev afbrudt på grund af ødelagte data eller fordi videoen benyttede faciliteter som din browser ikke understøtter.", + "No compatible source was found for this media.": "Fandt ikke en kompatibel kilde for denne media." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/de.js b/jun_pc_web/assets/third_party/TCPlayer/lang/de.js new file mode 100644 index 000000000..915d3d17a --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/de.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("de",{ + "Play": "Wiedergabe", + "Pause": "Pause", + "Replay": "Erneut abspielen", + "Current Time": "Aktueller Zeitpunkt", + "Duration Time": "Dauer", + "Remaining Time": "Verbleibende Zeit", + "Stream Type": "Streamtyp", + "LIVE": "LIVE", + "Loaded": "Geladen", + "Progress": "Status", + "Fullscreen": "Vollbild", + "Non-Fullscreen": "Kein Vollbild", + "Mute": "Ton aus", + "Unmute": "Ton ein", + "Playback Rate": "Wiedergabegeschwindigkeit", + "Subtitles": "Untertitel", + "subtitles off": "Untertitel aus", + "Captions": "Untertitel", + "captions off": "Untertitel aus", + "Chapters": "Kapitel", + "You aborted the media playback": "Sie haben die Videowiedergabe abgebrochen.", + "A network error caused the media download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.", + "No compatible source was found for this media.": "Für dieses Video wurde keine kompatible Quelle gefunden.", + "Play Video": "Video abspielen", + "Close": "Schließen", + "Modal Window": "Modales Fenster", + "This is a modal window": "Dies ist ein modales Fenster", + "This modal can be closed by pressing the Escape key or activating the close button.": "Durch Drücken der Esc-Taste bzw. Betätigung der Schaltfläche \"Schließen\" wird dieses modale Fenster geschlossen.", + ", opens captions settings dialog": ", öffnet Einstellungen für Untertitel", + ", opens subtitles settings dialog": ", öffnet Einstellungen für Untertitel", + ", selected": ", ausgewählt", + "captions settings": "Untertiteleinstellungen", + "subtitles settings": "Untertiteleinstellungen", + "descriptions settings": "Einstellungen für Beschreibungen", + "Close Modal Dialog": "Modales Fenster schließen", + "Descriptions": "Beschreibungen", + "descriptions off": "Beschreibungen aus", + "The media is encrypted and we do not have the keys to decrypt it.": "Die Entschlüsselungsschlüssel für den verschlüsselten Medieninhalt sind nicht verfügbar.", + ", opens descriptions settings dialog": ", öffnet Einstellungen für Beschreibungen", + "Audio Track": "Tonspur", + "Text": "Schrift", + "White": "Weiß", + "Black": "Schwarz", + "Red": "Rot", + "Green": "Grün", + "Blue": "Blau", + "Yellow": "Gelb", + "Magenta": "Magenta", + "Cyan": "Türkis", + "Background": "Hintergrund", + "Window": "Fenster", + "Transparent": "Durchsichtig", + "Semi-Transparent": "Halbdurchsichtig", + "Opaque": "Undurchsictig", + "Font Size": "Schriftgröße", + "Text Edge Style": "Textkantenstil", + "None": "Kein", + "Raised": "Erhoben", + "Depressed": "Gedrückt", + "Uniform": "Uniform", + "Dropshadow": "Schlagschatten", + "Font Family": "Schristfamilie", + "Proportional Sans-Serif": "Proportionale Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportionale Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Zwanglos", + "Script": "Schreibeschrift", + "Small Caps": "Small-Caps", + "Reset": "Zurücksetzen", + "restore all settings to the default values": "Alle Einstellungen auf die Standardwerte zurücksetzen", + "Done": "Fertig", + "Caption Settings Dialog": "Einstellungsdialog für Untertitel", + "Beginning of dialog window. Escape will cancel and close the window.": "Anfang des Dialogfensters. Esc bricht ab und schließt das Fenster.", + "End of dialog window.": "Ende des Dialogfensters.", + "Audio Player": "Audio-Player", + "Video Player": "Video-Player", + "Progress Bar": "Forschrittsbalken", + "progress bar timing: currentTime={1} duration={2}": "{1} von {2}", + "Volume Level": "Lautstärkestufe" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/el.js b/jun_pc_web/assets/third_party/TCPlayer/lang/el.js new file mode 100644 index 000000000..b1394cbe5 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/el.js @@ -0,0 +1,40 @@ +TCPlayer.addLanguage("el",{ + "Play": "Aναπαραγωγή", + "Pause": "Παύση", + "Current Time": "Τρέχων χρόνος", + "Duration Time": "Συνολικός χρόνος", + "Remaining Time": "Υπολοιπόμενος χρόνος", + "Stream Type": "Τύπος ροής", + "LIVE": "ΖΩΝΤΑΝΑ", + "Loaded": "Φόρτωση επιτυχής", + "Progress": "Πρόοδος", + "Fullscreen": "Πλήρης οθόνη", + "Non-Fullscreen": "Έξοδος από πλήρη οθόνη", + "Mute": "Σίγαση", + "Unmute": "Kατάργηση σίγασης", + "Playback Rate": "Ρυθμός αναπαραγωγής", + "Subtitles": "Υπότιτλοι", + "subtitles off": "απόκρυψη υπότιτλων", + "Captions": "Λεζάντες", + "captions off": "απόκρυψη λεζάντων", + "Chapters": "Κεφάλαια", + "Close Modal Dialog": "Κλείσιμο παραθύρου", + "Descriptions": "Περιγραφές", + "descriptions off": "απόκρυψη περιγραφών", + "Audio Track": "Ροή ήχου", + "You aborted the media playback": "Ακυρώσατε την αναπαραγωγή", + "A network error caused the media download to fail part-way.": "Ένα σφάλμα δικτύου προκάλεσε την αποτυχία μεταφόρτωσης του αρχείου προς αναπαραγωγή.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Το αρχείο προς αναπαραγωγή δεν ήταν δυνατό να φορτωθεί είτε γιατί υπήρξε σφάλμα στον διακομιστή ή το δίκτυο, είτε γιατί ο τύπος του αρχείου δεν υποστηρίζεται.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Η αναπαραγωγή ακυρώθηκε είτε λόγω κατεστραμμένου αρχείου, είτε γιατί το αρχείο απαιτεί λειτουργίες που δεν υποστηρίζονται από το πρόγραμμα περιήγησης που χρησιμοποιείτε.", + "No compatible source was found for this media.": "Δεν βρέθηκε συμβατή πηγή αναπαραγωγής για το συγκεκριμένο αρχείο.", + "The media is encrypted and we do not have the keys to decrypt it.": "Το αρχείο προς αναπαραγωγή είναι κρυπτογραφημένo και δεν υπάρχουν τα απαραίτητα κλειδιά αποκρυπτογράφησης.", + "Play Video": "Αναπαραγωγή βίντεο", + "Close": "Κλείσιμο", + "Modal Window": "Aναδυόμενο παράθυρο", + "This is a modal window": "Το παρών είναι ένα αναδυόμενο παράθυρο", + "This modal can be closed by pressing the Escape key or activating the close button.": "Αυτό το παράθυρο μπορεί να εξαφανιστεί πατώντας το πλήκτρο Escape ή πατώντας το κουμπί κλεισίματος.", + ", opens captions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις λεζάντες", + ", opens subtitles settings dialog": ", εμφανίζει τις ρυθμίσεις για τους υπότιτλους", + ", opens descriptions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις περιγραφές", + ", selected": ", επιλεγμένο" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/en.js b/jun_pc_web/assets/third_party/TCPlayer/lang/en.js new file mode 100644 index 000000000..c6d194b4e --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/en.js @@ -0,0 +1,100 @@ +TCPlayer.addLanguage("en",{ + "Audio Player": "Audio Player", + "Video Player": "Video Player", + "Play": "Play", + "Pause": "Pause", + "Replay": "Replay", + "Current Time": "Current Time", + "Duration Time": "Duration Time", + "Remaining Time": "Remaining Time", + "Stream Type": "Stream Type", + "LIVE": "LIVE", + "Loaded": "Loaded", + "Progress": "Progress", + "Progress Bar": "Progress Bar", + "progress bar timing: currentTime={1} duration={2}": "{1} of {2}", + "Fullscreen": "Fullscreen", + "Non-Fullscreen": "Non-Fullscreen", + "Mute": "Mute", + "Unmute": "Unmute", + "Playback Rate": "Playback Rate", + "Subtitles": "Subtitles", + "subtitles off": "subtitles off", + "Captions": "Captions", + "captions off": "captions off", + "Chapters": "Chapters", + "Descriptions": "Descriptions", + "descriptions off": "descriptions off", + "Audio Track": "Audio Track", + "Volume Level": "Volume Level", + "You aborted the media playback": "You aborted the media playback", + "A network error caused the media download to fail part-way.": "A network error caused the media download to fail part-way.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "The media could not be loaded, either because the server or network failed or because the format is not supported.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.", + "No compatible source was found for this media.": "No compatible source was found for this media.", + "The media is encrypted and we do not have the keys to decrypt it.": "The media is encrypted and we do not have the keys to decrypt it.", + "Play Video": "Play Video", + "Close": "Close", + "Close Modal Dialog": "Close Modal Dialog", + "Modal Window": "Modal Window", + "This is a modal window": "This is a modal window", + "This modal can be closed by pressing the Escape key or activating the close button.": "This modal can be closed by pressing the Escape key or activating the close button.", + ", opens captions settings dialog": ", opens captions settings dialog", + ", opens subtitles settings dialog": ", opens subtitles settings dialog", + ", opens descriptions settings dialog": ", opens descriptions settings dialog", + ", selected": ", selected", + "captions settings": "captions settings", + "subtitles settings": "subititles settings", + "descriptions settings": "descriptions settings", + "Text": "Text", + "White": "White", + "Black": "Black", + "Red": "Red", + "Green": "Green", + "Blue": "Blue", + "Yellow": "Yellow", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Background", + "Window": "Window", + "Transparent": "Transparent", + "Semi-Transparent": "Semi-Transparent", + "Opaque": "Opaque", + "Font Size": "Font Size", + "Text Edge Style": "Text Edge Style", + "None": "None", + "Raised": "Raised", + "Depressed": "Depressed", + "Uniform": "Uniform", + "Dropshadow": "Dropshadow", + "Font Family": "Font Family", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "Reset", + "restore all settings to the default values": "restore all settings to the default values", + "Done": "Done", + "Caption Settings Dialog": "Caption Settings Dialog", + "Beginning of dialog window. Escape will cancel and close the window.": "Beginning of dialog window. Escape will cancel and close the window.", + "End of dialog window.": "End of dialog window.", + "Powered by Tencent Cloud.": "Powered by Tencent Cloud.", + "Rise an internal exception when playing HLS.": "Rise an internal exception when playing HLS.", + "The media file does not exist. Please check if the fileID is correct.": "The media file does not exist. Please check if the fileID is correct.", + "The trial duration is illegal. The trial duration must be within the video duration.": "The trial duration is illegal. The trial duration must be within the video duration.", + "Param pcfg is not unique.": "Param pcfg is not unique.", + "The license has expired. Please check whether the expiration time setting is reasonable.": "The license has expired. Please check whether the expiration time setting is reasonable.", + "Did not find an adaptive stream that can be played.": "Did not find an adaptive stream that can be played. View document", + "Invalid request format, please check the request format.": "Invalid request format, please check the request format.", + "AppID is not exist, Please check if the AppID is correct.": "AppID is not exist. Please check if the AppID is correct.", + "Without anti-leech information.": "Without anti-leech information.", + "psign check failed.": "Param psign check failed, View document", + "Other errors.": "Other errors.", + "Internal error.": "Internal error.", + "Mirror": "mirror", + "Video statistic": "Video statistic", + "Play Next": "play next" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/es.js b/jun_pc_web/assets/third_party/TCPlayer/lang/es.js new file mode 100644 index 000000000..a988aeba6 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/es.js @@ -0,0 +1,27 @@ +TCPlayer.addLanguage("es",{ + "Play": "Reproducción", + "Play Video": "Reproducción Vídeo", + "Pause": "Pausa", + "Current Time": "Tiempo reproducido", + "Duration Time": "Duración total", + "Remaining Time": "Tiempo restante", + "Stream Type": "Tipo de secuencia", + "LIVE": "DIRECTO", + "Loaded": "Cargado", + "Progress": "Progreso", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Pantalla no completa", + "Mute": "Silenciar", + "Unmute": "No silenciado", + "Playback Rate": "Velocidad de reproducción", + "Subtitles": "Subtítulos", + "subtitles off": "Subtítulos desactivados", + "Captions": "Subtítulos especiales", + "captions off": "Subtítulos especiales desactivados", + "Chapters": "Capítulos", + "You aborted the media playback": "Ha interrumpido la reproducción del vídeo.", + "A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.", + "No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/fa.js b/jun_pc_web/assets/third_party/TCPlayer/lang/fa.js new file mode 100644 index 000000000..9a56fb9a7 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/fa.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("fa",{ + "Audio Player": "پخش کننده صوتی", + "Video Player": "پخش کننده ویدیو", + "Play": "پخش", + "Pause": "مکث", + "Replay": "بازپخش", + "Current Time": "زمان کنونی", + "Duration Time": "مدت زمان", + "Remaining Time": "زمان باقیمانده", + "Stream Type": "نوع استریم", + "LIVE": "زنده", + "Loaded": "بارگیری شده", + "Progress": "پیشرفت", + "Progress Bar": "نوار پیشرفت", + "progress bar timing: currentTime={1} duration={2}": "{1} از {2}", + "Fullscreen": "تمام‌صفحه", + "Non-Fullscreen": "غیر تمام‌صفحه", + "Mute": "بی صدا", + "Unmute": "صدا دار", + "Playback Rate": "سرعت پخش", + "Subtitles": "زیرنویس", + "subtitles off": "بدون زیرنویس", + "Captions": "زیرتوضیح", + "captions off": "بدون زیرتوضیح", + "Chapters": "قسمت‌ها", + "Descriptions": "توصیف", + "descriptions off": "بدون توصیف", + "Audio Track": "صوت", + "Volume Level": "میزان صدا", + "You aborted the media playback": "شما پخش را قطع کردید.", + "A network error caused the media download to fail part-way.": "خطای شبکه باعث عدم بارگیری بخشی از رسانه شد.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": ".رسانه قابل بارگیری نیست. علت آن ممکن است خطا در اتصال یا عدم پشتیبانی از فرمت باشد", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "پخش رسانه به علت اشکال در آن یا عدم پشتیبانی مرورگر شما قطع شد.", + "No compatible source was found for this media.": "هیچ منبع سازگاری، برای این رسانه پیدا نشد.", + "The media is encrypted and we do not have the keys to decrypt it.": "این رسانه رمزنگاری شده است و ما کلید رمزگشایی آن را نداریم.", + "Play Video": "پخش ویدیو", + "Close": "بستن", + "Close Modal Dialog": "بستن پنجره مودال", + "Modal Window": "پنجره مودال", + "This is a modal window": "این پنجره مودال", + "This modal can be closed by pressing the Escape key or activating the close button.": "این پنجره با دکمه اسکیپ با دکمه بستن قابل بسته شدن میباشد.", + ", opens captions settings dialog": ", تنظیمات زیرتوضیح را باز میکند", + ", opens subtitles settings dialog": ", تنظیمات زیرنویس را باز میکند", + ", opens descriptions settings dialog": ", تنظیمات توصیفات را باز میکند", + ", selected": ", انتخاب شده", + "captions settings": "تنظیمات زیرتوضیح", + "subtitles settings": "تنظیمات زیرنویس", + "descriptions settings": "تنظیمات توصیفات", + "Text": "متن", + "White": "سفید", + "Black": "سیاه", + "Red": "قرمز", + "Green": "سبز", + "Blue": "آبی", + "Yellow": "زرد", + "Magenta": "ارغوانی", + "Cyan": "سبزآبی", + "Background": "زمینه", + "Window": "پنجره", + "Transparent": "شفاف", + "Semi-Transparent": "نیمه شفاف", + "Opaque": "مات", + "Font Size": "اندازه فونت", + "Text Edge Style": "سبک لبه متن", + "None": "هیچ", + "Raised": "برآمده", + "Depressed": "فرورفته", + "Uniform": "یکنواخت", + "Dropshadow": "سایه دار", + "Font Family": "نوع فونت", + "Proportional Sans-Serif": "سنس-سریف متناسب", + "Monospace Sans-Serif": "سنس-سریف هم اندازه", + "Proportional Serif": "سریف متناسب", + "Monospace Serif": "سریف هم اندازه", + "Casual": "فانتزی", + "Script": "دست خط", + "Small Caps": "حروف کوچک به بزرگ", + "Reset": "باز نشاندن", + "restore all settings to the default values": "بازیابی همه تنظیمات به حالت اولیه", + "Done": "تکمیل", + "Caption Settings Dialog": "پنجره تنظیمات عناوین", + "Beginning of dialog window. Escape will cancel and close the window.": "ابتدای پنجره محاوره‌ای. دکمه اسکیپ پنجره را لغو میکند و میبندد.", + "End of dialog window.": "انتهای پنجره محاوره‌ای." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/fi.js b/jun_pc_web/assets/third_party/TCPlayer/lang/fi.js new file mode 100644 index 000000000..07ea3e805 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/fi.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("fi",{ + "Play": "Toisto", + "Pause": "Tauko", + "Current Time": "Tämänhetkinen aika", + "Duration Time": "Kokonaisaika", + "Remaining Time": "Jäljellä oleva aika", + "Stream Type": "Lähetystyyppi", + "LIVE": "LIVE", + "Loaded": "Ladattu", + "Progress": "Edistyminen", + "Fullscreen": "Koko näyttö", + "Non-Fullscreen": "Koko näyttö pois", + "Mute": "Ääni pois", + "Unmute": "Ääni päällä", + "Playback Rate": "Toistonopeus", + "Subtitles": "Tekstitys", + "subtitles off": "Tekstitys pois", + "Captions": "Tekstitys", + "captions off": "Tekstitys pois", + "Chapters": "Kappaleet", + "You aborted the media playback": "Olet keskeyttänyt videotoiston.", + "A network error caused the media download to fail part-way.": "Verkkovirhe keskeytti videon latauksen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videon lataus ei onnistunut joko palvelin- tai verkkovirheestä tai väärästä formaatista johtuen.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videon toisto keskeytyi, koska media on vaurioitunut tai käyttää käyttää toimintoja, joita selaimesi ei tue.", + "No compatible source was found for this media.": "Tälle videolle ei löytynyt yhteensopivaa lähdettä." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/fr.js b/jun_pc_web/assets/third_party/TCPlayer/lang/fr.js new file mode 100644 index 000000000..48d7aab34 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/fr.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("fr",{ + "Audio Player": "Lecteur audio", + "Video Player": "Lecteur vidéo", + "Play": "Lecture", + "Pause": "Pause", + "Replay": "Revoir", + "Current Time": "Temps actuel", + "Duration Time": "Durée", + "Remaining Time": "Temps restant", + "Stream Type": "Type de flux", + "LIVE": "EN DIRECT", + "Loaded": "Chargé", + "Progress": "Progression", + "Progress Bar": "Barre de progression", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Fullscreen": "Plein écran", + "Non-Fullscreen": "Fenêtré", + "Mute": "Sourdine", + "Unmute": "Son activé", + "Playback Rate": "Vitesse de lecture", + "Subtitles": "Sous-titres", + "subtitles off": "Sous-titres désactivés", + "Captions": "Sous-titres transcrits", + "captions off": "Sous-titres transcrits désactivés", + "Chapters": "Chapitres", + "Descriptions": "Descriptions", + "descriptions off": "descriptions désactivées", + "Audio Track": "Piste audio", + "Volume Level": "Niveau de volume", + "You aborted the media playback": "Vous avez interrompu la lecture de la vidéo.", + "A network error caused the media download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.", + "No compatible source was found for this media.": "Aucune source compatible n'a été trouvée pour cette vidéo.", + "The media is encrypted and we do not have the keys to decrypt it.": "Le média est chiffré et nous n'avons pas les clés pour le déchiffrer.", + "Play Video": "Lire la vidéo", + "Close": "Fermer", + "Close Modal Dialog": "Fermer la boîte de dialogue modale", + "Modal Window": "Fenêtre modale", + "This is a modal window": "Ceci est une fenêtre modale", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ce modal peut être fermé en appuyant sur la touche Échap ou activer le bouton de fermeture.", + ", opens captions settings dialog": ", ouvrir les paramètres des sous-titres transcrits", + ", opens subtitles settings dialog": ", ouvrir les paramètres des sous-titres", + ", opens descriptions settings dialog": ", ouvrir les paramètres des descriptions", + ", selected": ", sélectionné", + "captions settings": "Paramètres des sous-titres transcrits", + "subtitles settings": "Paramètres des sous-titres", + "descriptions settings": "Paramètres des descriptions", + "Text": "Texte", + "White": "Blanc", + "Black": "Noir", + "Red": "Rouge", + "Green": "Vert", + "Blue": "Bleu", + "Yellow": "Jaune", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Arrière-plan", + "Window": "Fenêtre", + "Transparent": "Transparent", + "Semi-Transparent": "Semi-transparent", + "Opaque": "Opaque", + "Font Size": "Taille des caractères", + "Text Edge Style": "Style des contours du texte", + "None": "Aucun", + "Raised": "Élevé", + "Depressed": "Enfoncé", + "Uniform": "Uniforme", + "Dropshadow": "Ombre portée", + "Font Family": "Famille de polices", + "Proportional Sans-Serif": "Polices à chasse variable sans empattement (Proportional Sans-Serif)", + "Monospace Sans-Serif": "Polices à chasse fixe sans empattement (Monospace Sans-Serif)", + "Proportional Serif": "Polices à chasse variable avec empattement (Proportional Serif)", + "Monospace Serif": "Polices à chasse fixe avec empattement (Monospace Serif)", + "Casual": "Manuscrite", + "Script": "Scripte", + "Small Caps": "Petites capitales", + "Reset": "Réinitialiser", + "restore all settings to the default values": "Restaurer tous les paramètres aux valeurs par défaut", + "Done": "Terminé", + "Caption Settings Dialog": "Boîte de dialogue des paramètres des sous-titres transcrits", + "Beginning of dialog window. Escape will cancel and close the window.": "Début de la fenêtre de dialogue. La touche d'échappement annulera et fermera la fenêtre.", + "End of dialog window.": "Fin de la fenêtre de dialogue." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/gl.js b/jun_pc_web/assets/third_party/TCPlayer/lang/gl.js new file mode 100644 index 000000000..241423bd7 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/gl.js @@ -0,0 +1,27 @@ +TCPlayer.addLanguage("gl",{ + "Play": "Reprodución", + "Play Video": "Reprodución Vídeo", + "Pause": "Pausa", + "Current Time": "Tempo reproducido", + "Duration Time": "Duración total", + "Remaining Time": "Tempo restante", + "Stream Type": "Tipo de secuencia", + "LIVE": "DIRECTO", + "Loaded": "Cargado", + "Progress": "Progreso", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Pantalla non completa", + "Mute": "Silenciar", + "Unmute": "Non silenciado", + "Playback Rate": "Velocidade de reprodución", + "Subtitles": "Subtítulos", + "subtitles off": "Subtítulos desactivados", + "Captions": "Subtítulos con lenda", + "captions off": "Subtítulos con lenda desactivados", + "Chapters": "Capítulos", + "You aborted the media playback": "Interrompeches a reprodución do vídeo.", + "A network error caused the media download to fail part-way.": "Un erro de rede interrompeu a descarga do vídeo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Non se puido cargar o vídeo debido a un fallo de rede ou do servidor ou porque o formato é incompatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reproducción de vídeo interrompeuse por un problema de corrupción de datos ou porque o vídeo precisa funcións que o teu navegador non ofrece.", + "No compatible source was found for this media.": "Non se atopou ningunha fonte compatible con este vídeo." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/he.js b/jun_pc_web/assets/third_party/TCPlayer/lang/he.js new file mode 100644 index 000000000..e0b0f1524 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/he.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("he",{ + "Audio Player": "נַגָּן שמע", + "Video Player": "נַגָּן וידאו", + "Play": "נַגֵּן", + "Pause": "השהה", + "Replay": "נַגֵּן שוב", + "Current Time": "זמן נוכחי", + "Duration Time": "זמן כולל", + "Remaining Time": "זמן נותר", + "Stream Type": "סוג Stream", + "LIVE": "שידור חי", + "Loaded": "נטען", + "Progress": "התקדמות", + "Progress Bar": "סרגל התקדמות", + "progress bar timing: currentTime={1} duration={2}": "{1} מתוך {2}", + "Fullscreen": "מסך מלא", + "Non-Fullscreen": "מסך לא מלא", + "Mute": "השתק", + "Unmute": "בטל השתקה", + "Playback Rate": "קצב ניגון", + "Subtitles": "כתוביות", + "subtitles off": "כתוביות כבויות", + "Captions": "כיתובים", + "captions off": "כיתובים כבויים", + "Chapters": "פרקים", + "Descriptions": "תיאורים", + "descriptions off": "תיאורים כבויים", + "Audio Track": "רצועת שמע", + "Volume Level": "רמת ווליום", + "You aborted the media playback": "ביטלת את השמעת המדיה", + "A network error caused the media download to fail part-way.": "שגיאת רשת גרמה להורדת המדיה להיכשל באמצע.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "לא ניתן לטעון את המדיה, או מכיוון שהרשת או השרת כשלו או מכיוון שהפורמט אינו נתמך.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "השמעת המדיה בוטלה בשל בעית השחטת מידע או מכיוון שהמדיה עשתה שימוש בתכונות שהדפדפן שלך לא תמך בהן.", + "No compatible source was found for this media.": "לא נמצא מקור תואם עבור מדיה זו.", + "The media is encrypted and we do not have the keys to decrypt it.": "המדיה מוצפנת ואין בידינו את המפתח כדי לפענח אותה.", + "Play Video": "נַגֵּן וידאו", + "Close": "סְגוֹר", + "Close Modal Dialog": "סְגוֹר דו-שיח מודאלי", + "Modal Window": "חלון מודאלי", + "This is a modal window": "זהו חלון מודאלי", + "This modal can be closed by pressing the Escape key or activating the close button.": "ניתן לסגור חלון מודאלי זה ע\"י לחיצה על כפתור ה-Escape או הפעלת כפתור הסגירה.", + ", opens captions settings dialog": ", פותח חלון הגדרות כיתובים", + ", opens subtitles settings dialog": ", פותח חלון הגדרות כתוביות", + ", opens descriptions settings dialog": ", פותח חלון הגדרות תיאורים", + ", selected": ", נבחר/ו", + "captions settings": "הגדרות כיתובים", + "subtitles settings": "הגדרות כתוביות", + "descriptions settings": "הגדרות תיאורים", + "Text": "טקסט", + "White": "לבן", + "Black": "שחור", + "Red": "אדום", + "Green": "ירוק", + "Blue": "כחול", + "Yellow": "צהוב", + "Magenta": "מַגֶ'נטָה", + "Cyan": "טורקיז", + "Background": "רקע", + "Window": "חלון", + "Transparent": "שקוף", + "Semi-Transparent": "שקוף למחצה", + "Opaque": "אָטוּם", + "Font Size": "גודל גופן", + "Text Edge Style": "סגנון קצוות טקסט", + "None": "ללא", + "Raised": "מורם", + "Depressed": "מורד", + "Uniform": "אחיד", + "Dropshadow": "הטלת צל", + "Font Family": "משפחת גופן", + "Proportional Sans-Serif": "פרופורציוני וללא תגיות (Proportional Sans-Serif)", + "Monospace Sans-Serif": "ברוחב אחיד וללא תגיות (Monospace Sans-Serif)", + "Proportional Serif": "פרופורציוני ועם תגיות (Proportional Serif)", + "Monospace Serif": "ברוחב אחיד ועם תגיות (Monospace Serif)", + "Casual": "אַגָבִי", + "Script": "תסריט", + "Small Caps": "אותיות קטנות", + "Reset": "אִפּוּס", + "restore all settings to the default values": "שחזר את כל ההגדרות לערכי ברירת המחדל", + "Done": "בוצע", + "Caption Settings Dialog": "דו-שיח הגדרות כיתובים", + "Beginning of dialog window. Escape will cancel and close the window.": "תחילת חלון דו-שיח. Escape יבטל ויסגור את החלון", + "End of dialog window.": "סוף חלון דו-שיח." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/hr.js b/jun_pc_web/assets/third_party/TCPlayer/lang/hr.js new file mode 100644 index 000000000..0191aeb38 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/hr.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("hr",{ + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vrijeme", + "Duration Time": "Vrijeme trajanja", + "Remaining Time": "Preostalo vrijeme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Puni ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/hu.js b/jun_pc_web/assets/third_party/TCPlayer/lang/hu.js new file mode 100644 index 000000000..977cdb377 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/hu.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("hu",{ + "Play": "Lejátszás", + "Pause": "Szünet", + "Current Time": "Aktuális időpont", + "Duration Time": "Hossz", + "Remaining Time": "Hátralévő idő", + "Stream Type": "Adatfolyam típusa", + "LIVE": "ÉLŐ", + "Loaded": "Betöltve", + "Progress": "Állapot", + "Fullscreen": "Teljes képernyő", + "Non-Fullscreen": "Normál méret", + "Mute": "Némítás", + "Unmute": "Némítás kikapcsolva", + "Playback Rate": "Lejátszási sebesség", + "Subtitles": "Feliratok", + "subtitles off": "Feliratok kikapcsolva", + "Captions": "Magyarázó szöveg", + "captions off": "Magyarázó szöveg kikapcsolva", + "Chapters": "Fejezetek", + "You aborted the media playback": "Leállította a lejátszást", + "A network error caused the media download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.", + "No compatible source was found for this media.": "Nincs kompatibilis forrás ehhez a videóhoz." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/it.js b/jun_pc_web/assets/third_party/TCPlayer/lang/it.js new file mode 100644 index 000000000..fed56e0ab --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/it.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("it",{ + "Play": "Play", + "Pause": "Pausa", + "Current Time": "Orario attuale", + "Duration Time": "Durata", + "Remaining Time": "Tempo rimanente", + "Stream Type": "Tipo del Streaming", + "LIVE": "LIVE", + "Loaded": "Caricato", + "Progress": "Stato", + "Fullscreen": "Schermo intero", + "Non-Fullscreen": "Chiudi schermo intero", + "Mute": "Muto", + "Unmute": "Audio", + "Playback Rate": "Tasso di riproduzione", + "Subtitles": "Sottotitoli", + "subtitles off": "Senza sottotitoli", + "Captions": "Sottotitoli non udenti", + "captions off": "Senza sottotitoli non udenti", + "Chapters": "Capitolo", + "You aborted the media playback": "La riproduzione del filmato è stata interrotta.", + "A network error caused the media download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.", + "No compatible source was found for this media.": "Non ci sono fonti compatibili per questo filmato." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/ja.js b/jun_pc_web/assets/third_party/TCPlayer/lang/ja.js new file mode 100644 index 000000000..9681dbbbd --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/ja.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("ja",{ + "Play": "再生", + "Pause": "一時停止", + "Current Time": "現在の時間", + "Duration Time": "長さ", + "Remaining Time": "残りの時間", + "Stream Type": "ストリームの種類", + "LIVE": "ライブ", + "Loaded": "ロード済み", + "Progress": "進行状況", + "Fullscreen": "フルスクリーン", + "Non-Fullscreen": "フルスクリーン以外", + "Mute": "ミュート", + "Unmute": "ミュート解除", + "Playback Rate": "再生レート", + "Subtitles": "サブタイトル", + "subtitles off": "サブタイトル オフ", + "Captions": "キャプション", + "captions off": "キャプション オフ", + "Chapters": "チャプター", + "You aborted the media playback": "動画再生を中止しました", + "A network error caused the media download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました", + "No compatible source was found for this media.": "この動画に対して互換性のあるソースが見つかりませんでした" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/ko.js b/jun_pc_web/assets/third_party/TCPlayer/lang/ko.js new file mode 100644 index 000000000..133ec03ea --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/ko.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("ko",{ + "Play": "재생", + "Pause": "일시중지", + "Current Time": "현재 시간", + "Duration Time": "지정 기간", + "Remaining Time": "남은 시간", + "Stream Type": "스트리밍 유형", + "LIVE": "라이브", + "Loaded": "로드됨", + "Progress": "진행", + "Fullscreen": "전체 화면", + "Non-Fullscreen": "전체 화면 해제", + "Mute": "음소거", + "Unmute": "음소거 해제", + "Playback Rate": "재생 비율", + "Subtitles": "서브타이틀", + "subtitles off": "서브타이틀 끄기", + "Captions": "자막", + "captions off": "자막 끄기", + "Chapters": "챕터", + "You aborted the media playback": "비디오 재생을 취소했습니다.", + "A network error caused the media download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.", + "No compatible source was found for this media.": "비디오에 호환되지 않는 소스가 있습니다." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/nb.js b/jun_pc_web/assets/third_party/TCPlayer/lang/nb.js new file mode 100644 index 000000000..7d991c5b5 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/nb.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("nb",{ + "Play": "Spill", + "Pause": "Pause", + "Current Time": "Aktuell tid", + "Duration Time": "Varighet", + "Remaining Time": "Gjenstående tid", + "Stream Type": "Type strøm", + "LIVE": "DIREKTE", + "Loaded": "Lastet inn", + "Progress": "Status", + "Fullscreen": "Fullskjerm", + "Non-Fullscreen": "Lukk fullskjerm", + "Mute": "Lyd av", + "Unmute": "Lyd på", + "Playback Rate": "Avspillingsrate", + "Subtitles": "Undertekst på", + "subtitles off": "Undertekst av", + "Captions": "Undertekst for hørselshemmede på", + "captions off": "Undertekst for hørselshemmede av", + "Chapters": "Kapitler", + "You aborted the media playback": "Du avbrøt avspillingen.", + "A network error caused the media download to fail part-way.": "En nettverksfeil avbrøt nedlasting av videoen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke lastes ned, på grunn av nettverksfeil eller serverfeil, eller fordi formatet ikke er støttet.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspillingen ble avbrudt på grunn av ødelagte data eller fordi videoen ville gjøre noe som nettleseren din ikke har støtte for.", + "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/nl.js b/jun_pc_web/assets/third_party/TCPlayer/lang/nl.js new file mode 100644 index 000000000..bedc3c171 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/nl.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("nl",{ + "Audio Player": "Audiospeler", + "Video Player": "Videospeler", + "Play": "Afspelen", + "Pause": "Pauzeren", + "Replay": "Opnieuw afspelen", + "Current Time": "Huidige tijd", + "Duration Time": "Tijdsduur", + "Remaining Time": "Resterende tijd", + "Stream Type": "Streamtype", + "LIVE": "LIVE", + "Loaded": "Geladen", + "Progress": "Voortgang", + "Progress Bar": "Voortgangsbalk", + "progress bar timing: currentTime={1} duration={2}": "{1} van {2}", + "Fullscreen": "Volledig scherm", + "Non-Fullscreen": "Geen volledig scherm", + "Mute": "Dempen", + "Unmute": "Niet dempen", + "Playback Rate": "Afspeelsnelheid", + "Subtitles": "Ondertiteling", + "subtitles off": "ondertiteling uit", + "Captions": "Bijschriften", + "captions off": "bijschriften uit", + "Chapters": "Hoofdstukken", + "Descriptions": "Beschrijvingen", + "descriptions off": "beschrijvingen uit", + "Audio Track": "Audiospoor", + "Volume Level": "Geluidsniveau", + "You aborted the media playback": "U heeft het afspelen van de media afgebroken", + "A network error caused the media download to fail part-way.": "Een netwerkfout heeft ervoor gezorgd dat het downloaden van de media halverwege is mislukt.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "De media kon niet worden geladen, dit komt doordat of de server of het netwerk mislukt of doordat het formaat niet wordt ondersteund.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Het afspelen van de media is afgebroken door een probleem met beschadeigde gegevens of doordat de media functies gebruikt die uw browser niet ondersteund.", + "No compatible source was found for this media.": "Er is geen geschikte bron voor deze media gevonden.", + "The media is encrypted and we do not have the keys to decrypt it.": "De media is versleuteld en we hebben de sleutels niet om deze te ontsleutelen.", + "Play Video": "Video afspelen", + "Close": "Sluiten", + "Close Modal Dialog": "Extra venster sluiten", + "Modal Window": "Extra venster", + "This is a modal window": "Dit is een extra venster", + "This modal can be closed by pressing the Escape key or activating the close button.": "Dit venster kan worden gesloten door op de Escape-toets te drukken of door de sluiten-knop te activeren.", + ", opens captions settings dialog": ", opent instellingen-venster voor bijschriften", + ", opens subtitles settings dialog": ", opent instellingen-venster voor ondertitelingen", + ", opens descriptions settings dialog": ", opent instellingen-venster voor beschrijvingen", + ", selected": ", geselecteerd", + "captions settings": "bijschriften-instellingen", + "subtitles settings": "ondertiteling-instellingen", + "descriptions settings": "beschrijvingen-instellingen", + "Text": "Tekst", + "White": "Wit", + "Black": "Zwart", + "Red": "Rood", + "Green": "Groen", + "Blue": "Blauw", + "Yellow": "Geel", + "Magenta": "Magenta", + "Cyan": "Cyaan", + "Background": "Achtergrond", + "Window": "Venster", + "Transparent": "Transparant", + "Semi-Transparent": "Semi-transparant", + "Opaque": "Ondoorzichtig", + "Font Size": "Lettergrootte", + "Text Edge Style": "Stijl tekstrand", + "None": "Geen", + "Raised": "Verhoogd", + "Depressed": "Ingedrukt", + "Uniform": "Uniform", + "Dropshadow": "Schaduw", + "Font Family": "Lettertype", + "Proportional Sans-Serif": "Proportioneel sans-serif", + "Monospace Sans-Serif": "Monospace sans-serif", + "Proportional Serif": "Proportioneel serif", + "Monospace Serif": "Monospace serif", + "Casual": "Luchtig", + "Script": "Script", + "Small Caps": "Kleine hoofdletters", + "Reset": "Herstellen", + "restore all settings to the default values": "alle instellingen naar de standaardwaarden herstellen", + "Done": "Klaar", + "Caption Settings Dialog": "Venster voor bijschriften-instellingen", + "Beginning of dialog window. Escape will cancel and close the window.": "Begin van dialoogvenster. Escape zal annuleren en het venster sluiten.", + "End of dialog window.": "Einde van dialoogvenster." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/nn.js b/jun_pc_web/assets/third_party/TCPlayer/lang/nn.js new file mode 100644 index 000000000..e3d2f8d6e --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/nn.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("nn",{ + "Play": "Spel", + "Pause": "Pause", + "Current Time": "Aktuell tid", + "Duration Time": "Varigheit", + "Remaining Time": "Tid attende", + "Stream Type": "Type straum", + "LIVE": "DIREKTE", + "Loaded": "Lasta inn", + "Progress": "Status", + "Fullscreen": "Fullskjerm", + "Non-Fullscreen": "Stenga fullskjerm", + "Mute": "Ljod av", + "Unmute": "Ljod på", + "Playback Rate": "Avspelingsrate", + "Subtitles": "Teksting på", + "subtitles off": "Teksting av", + "Captions": "Teksting for høyrselshemma på", + "captions off": "Teksting for høyrselshemma av", + "Chapters": "Kapitel", + "You aborted the media playback": "Du avbraut avspelinga.", + "A network error caused the media download to fail part-way.": "Ein nettverksfeil avbraut nedlasting av videoen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikkje lastas ned, på grunn av ein nettverksfeil eller serverfeil, eller av di formatet ikkje er stoda.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspelinga blei broten på grunn av øydelagde data eller av di videoen ville gjera noe som nettlesaren din ikkje stodar.", + "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/pl.js b/jun_pc_web/assets/third_party/TCPlayer/lang/pl.js new file mode 100644 index 000000000..496cbb0a1 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/pl.js @@ -0,0 +1,34 @@ +TCPlayer.addLanguage("pl",{ + "Play": "Odtwarzaj", + "Pause": "Pauza", + "Current Time": "Aktualny czas", + "Duration Time": "Czas trwania", + "Remaining Time": "Pozostały czas", + "Stream Type": "Typ strumienia", + "LIVE": "NA ŻYWO", + "Loaded": "Załadowany", + "Progress": "Status", + "Fullscreen": "Pełny ekran", + "Non-Fullscreen": "Pełny ekran niedostępny", + "Mute": "Wyłącz dźwięk", + "Unmute": "Włącz dźwięk", + "Playback Rate": "Szybkość odtwarzania", + "Subtitles": "Napisy", + "subtitles off": "Napisy wyłączone", + "Captions": "Transkrypcja", + "captions off": "Transkrypcja wyłączona", + "Chapters": "Rozdziały", + "You aborted the media playback": "Odtwarzanie zostało przerwane", + "A network error caused the media download to fail part-way.": "Problemy z siecią spowodowały błąd przy pobieraniu materiału wideo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Materiał wideo nie może być załadowany, ponieważ wystąpił problem z siecią lub format nie jest obsługiwany", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Odtwarzanie materiału wideo zostało przerwane z powodu uszkodzonego pliku wideo lub z powodu błędu funkcji, które nie są wspierane przez przeglądarkę.", + "No compatible source was found for this media.": "Dla tego materiału wideo nie znaleziono kompatybilnego źródła.", + "Play Video": "Odtwarzaj wideo", + "Close": "Zamknij", + "Modal Window": "Okno Modala", + "This is a modal window": "To jest okno modala", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ten modal możesz zamknąć naciskając przycisk Escape albo wybierając przycisk Zamknij.", + ", opens captions settings dialog": ", otwiera okno dialogowe ustawień transkrypcji", + ", opens subtitles settings dialog": ", otwiera okno dialogowe napisów", + ", selected": ", zaznaczone" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/pt-BR.js b/jun_pc_web/assets/third_party/TCPlayer/lang/pt-BR.js new file mode 100644 index 000000000..90352de3c --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/pt-BR.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("pt-BR",{ + "Play": "Tocar", + "Pause": "Pausar", + "Current Time": "Tempo", + "Duration Time": "Duração", + "Remaining Time": "Tempo Restante", + "Stream Type": "Tipo de Stream", + "LIVE": "AO VIVO", + "Loaded": "Carregado", + "Progress": "Progresso", + "Fullscreen": "Tela Cheia", + "Non-Fullscreen": "Tela Normal", + "Mute": "Mudo", + "Unmute": "Habilitar Som", + "Playback Rate": "Velocidade", + "Subtitles": "Legendas", + "subtitles off": "Sem Legendas", + "Captions": "Anotações", + "captions off": "Sem Anotações", + "Chapters": "Capítulos", + "You aborted the media playback": "Você parou a execução do vídeo.", + "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo parar parcialmente.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema com sua rede ou pelo formato do vídeo não ser suportado.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A execução foi interrompida por um problema com o vídeo ou por seu navegador não dar suporte ao seu formato.", + "No compatible source was found for this media.": "Não foi encontrada fonte de vídeo compatível." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/pt-PT.js b/jun_pc_web/assets/third_party/TCPlayer/lang/pt-PT.js new file mode 100644 index 000000000..da471c894 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/pt-PT.js @@ -0,0 +1,41 @@ +TCPlayer.addLanguage("pt-PT",{ + "Play": "Reproduzir", + "Pause": "Parar", + "Replay": "Reiniciar", + "Current Time": "Tempo Atual", + "Duration Time": "Duração", + "Remaining Time": "Tempo Restante", + "Stream Type": "Tipo de Stream", + "LIVE": "EM DIRETO", + "Loaded": "Carregado", + "Progress": "Progresso", + "Fullscreen": "Ecrã inteiro", + "Non-Fullscreen": "Ecrã normal", + "Mute": "Desativar som", + "Unmute": "Ativar som", + "Playback Rate": "Velocidade de reprodução", + "Subtitles": "Legendas", + "subtitles off": "desativar legendas", + "Captions": "Anotações", + "captions off": "desativar anotações", + "Chapters": "Capítulos", + "Close Modal Dialog": "Fechar Janela Modal", + "Descriptions": "Descrições", + "descriptions off": "desativar descrições", + "Audio Track": "Faixa Áudio", + "You aborted the media playback": "Parou a reprodução do vídeo.", + "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo falhar parcialmente.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema na rede ou no servidor, ou porque formato do vídeo não é compatível.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reprodução foi interrompida por um problema com o vídeo ou porque o formato não é compatível com o seu navegador.", + "No compatible source was found for this media.": "Não foi encontrada uma fonte de vídeo compatível.", + "The media is encrypted and we do not have the keys to decrypt it.": "O vídeo está encriptado e não há uma chave para o desencriptar.", + "Play Video": "Reproduzir Vídeo", + "Close": "Fechar", + "Modal Window": "Janela Modal", + "This is a modal window": "Isto é uma janela modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Esta modal pode ser fechada pressionando a tecla ESC ou ativando o botão de fechar.", + ", opens captions settings dialog": ", abre janela com definições de legendas", + ", opens subtitles settings dialog": ", abre janela com definições de legendas", + ", opens descriptions settings dialog": ", abre janela com definições de descrições", + ", selected": ", seleccionado" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/ru.js b/jun_pc_web/assets/third_party/TCPlayer/lang/ru.js new file mode 100644 index 000000000..e7c516601 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/ru.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("ru",{ + "Audio Player": "Аудио проигрыватель", + "Video Player": "Видео проигрыватель", + "Play": "Воспроизвести", + "Pause": "Приостановить", + "Replay": "Воспроизвести снова", + "Current Time": "Текущее время", + "Duration Time": "Продолжительность", + "Remaining Time": "Оставшееся время", + "Stream Type": "Тип потока", + "LIVE": "ОНЛАЙН", + "Loaded": "Загрузка", + "Progress": "Прогресс", + "Progress Bar": "Индикатор загрузки", + "progress bar timing: currentTime={1} duration={2}": "{1} из {2}", + "Fullscreen": "Полноэкранный режим", + "Non-Fullscreen": "Неполноэкранный режим", + "Mute": "Без звука", + "Unmute": "Со звуком", + "Playback Rate": "Скорость воспроизведения", + "Subtitles": "Субтитры", + "subtitles off": "Субтитры выкл.", + "Captions": "Подписи", + "captions off": "Подписи выкл.", + "Chapters": "Главы", + "Descriptions": "Описания", + "descriptions off": "Отключить описания", + "Audio Track": "Звуковая дорожка", + "Volume Level": "Уровень громкости", + "You aborted the media playback": "Вы прервали воспроизведение видео", + "A network error caused the media download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.", + "No compatible source was found for this media.": "Совместимые источники для этого видео отсутствуют.", + "The media is encrypted and we do not have the keys to decrypt it.": "Видео в зашифрованном виде, и у нас нет ключей для расшифровки.", + "Play Video": "Воспроизвести видео", + "Close": "Закрыть", + "Close Modal Dialog": "Закрыть модальное окно", + "Modal Window": "Модальное окно", + "This is a modal window": "Это модальное окно", + "This modal can be closed by pressing the Escape key or activating the close button.": "Модальное окно можно закрыть нажав Esc или кнопку закрытия окна.", + ", opens captions settings dialog": ", откроется диалог настройки подписей", + ", opens subtitles settings dialog": ", откроется диалог настройки субтитров", + ", opens descriptions settings dialog": ", откроется диалог настройки описаний", + ", selected": ", выбрано", + "captions settings": "настройки подписей", + "subtitles settings": "настройки субтитров", + "descriptions settings": "настройки описаний", + "Text": "Текст", + "White": "Белый", + "Black": "Черный", + "Red": "Красный", + "Green": "Зеленый", + "Blue": "Синий", + "Yellow": "Желтый", + "Magenta": "Пурпурный", + "Cyan": "Голубой", + "Background": "Фон", + "Window": "Окно", + "Transparent": "Прозрачный", + "Semi-Transparent": "Полупрозрачный", + "Opaque": "Прозрачность", + "Font Size": "Размер шрифта", + "Text Edge Style": "Стиль края текста", + "None": "Ничего", + "Raised": "Поднятый", + "Depressed": "Пониженный", + "Uniform": "Одинаковый", + "Dropshadow": "Тень", + "Font Family": "Шрифт", + "Proportional Sans-Serif": "Пропорциональный без засечек", + "Monospace Sans-Serif": "Моноширинный без засечек", + "Proportional Serif": "Пропорциональный с засечками", + "Monospace Serif": "Моноширинный с засечками", + "Casual": "Случайный", + "Script": "Письменный", + "Small Caps": "Малые прописные", + "Reset": "Сбросить", + "restore all settings to the default values": "сбросить все найстройки по умолчанию", + "Done": "Готово", + "Caption Settings Dialog": "Диалог настроек подписи", + "Beginning of dialog window. Escape will cancel and close the window.": "Начало диалоговго окна. Кнопка Escape закроет или отменит окно", + "End of dialog window.": "Конец диалогового окна." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/sk.js b/jun_pc_web/assets/third_party/TCPlayer/lang/sk.js new file mode 100644 index 000000000..81b0c62cd --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/sk.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("sk",{ + "Audio Player": "Zvukový prehrávač", + "Video Player": "Video prehrávač", + "Play": "Prehrať", + "Pause": "Pozastaviť", + "Replay": "Prehrať znova", + "Current Time": "Aktuálny čas", + "Duration Time": "Čas trvania", + "Remaining Time": "Zostávajúci čas", + "Stream Type": "Typ stopy", + "LIVE": "NAŽIVO", + "Loaded": "Načítané", + "Progress": "Priebeh", + "Progress Bar": "Ukazovateľ priebehu", + "progress bar timing: currentTime={1} duration={2}": "časovanie ukazovateľa priebehu: currentTime={1} duration={2}", + "Fullscreen": "Režim celej obrazovky", + "Non-Fullscreen": "Režim normálnej obrazovky", + "Mute": "Stlmiť", + "Unmute": "Zrušiť stlmenie", + "Playback Rate": "Rýchlosť prehrávania", + "Subtitles": "Titulky", + "subtitles off": "titulky vypnuté", + "Captions": "Popisky", + "captions off": "popisky vypnuté", + "Chapters": "Kapitoly", + "Descriptions": "Opisy", + "descriptions off": "opisy vypnuté", + "Audio Track": "Zvuková stopa", + "Volume Level": "Úroveň hlasitosti", + "You aborted the media playback": "Prerušili ste prehrávanie", + "A network error caused the media download to fail part-way.": "Sťahovanie súboru bolo zrušené pre chybu na sieti.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Súbor sa nepodarilo načítať pre chybu servera, sieťového pripojenia, alebo je formát súboru nepodporovaný.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Prehrávanie súboru bolo prerušené pre poškodené dáta, alebo súbor používa vlastnosti, ktoré váš prehliadač nepodporuje.", + "No compatible source was found for this media.": "Nebol nájdený žiaden kompatibilný zdroj pre tento súbor.", + "The media is encrypted and we do not have the keys to decrypt it.": "Súbor je zašifrovaný a nie je k dispozícii kľúč na rozšifrovanie.", + "Play Video": "Prehrať video", + "Close": "Zatvoriť", + "Close Modal Dialog": "Zatvoriť modálne okno", + "Modal Window": "Modálne okno", + "This is a modal window": "Toto je modálne okno", + "This modal can be closed by pressing the Escape key or activating the close button.": "Toto modálne okno je možné zatvoriť stlačením klávesy Escape, alebo aktivovaním tlačidla na zatvorenie.", + ", opens captions settings dialog": ", otvorí okno nastavení popiskov", + ", opens subtitles settings dialog": ", otvorí okno nastavení titulkov", + ", opens descriptions settings dialog": ", otvorí okno nastavení opisov", + ", selected": ", označené", + "captions settings": "nastavenia popiskov", + "subtitles settings": "nastavenia titulkov", + "descriptions settings": "nastavenia opisov", + "Text": "Text", + "White": "Biela", + "Black": "Čierna", + "Red": "Červená", + "Green": "Zelená", + "Blue": "Modrá", + "Yellow": "Žltá", + "Magenta": "Ružová", + "Cyan": "Tyrkysová", + "Background": "Pozadie", + "Window": "Okno", + "Transparent": "Priesvitné", + "Semi-Transparent": "Polopriesvitné", + "Opaque": "Plné", + "Font Size": "Veľkosť písma", + "Text Edge Style": "Typ okrajov písma", + "None": "Žiadne", + "Raised": "Zvýšené", + "Depressed": "Znížené", + "Uniform": "Pravidelné", + "Dropshadow": "S tieňom", + "Font Family": "Typ písma", + "Proportional Sans-Serif": "Proporčné bezpätkové", + "Monospace Sans-Serif": "Pravidelné, bezpätkové", + "Proportional Serif": "Proporčné pätkové", + "Monospace Serif": "Pravidelné pätkové", + "Casual": "Bežné", + "Script": "Písané", + "Small Caps": "Malé kapitálky", + "Reset": "Resetovať", + "restore all settings to the default values": "všetky nastavenia na základné hodnoty", + "Done": "Hotovo", + "Caption Settings Dialog": "Okno nastavení popiskov", + "Beginning of dialog window. Escape will cancel and close the window.": "Začiatok okna. Klávesa Escape zruší a zavrie okno.", + "End of dialog window.": "Koniec okna." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/sr.js b/jun_pc_web/assets/third_party/TCPlayer/lang/sr.js new file mode 100644 index 000000000..0b488fed2 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/sr.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("sr",{ + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vrijeme", + "Duration Time": "Vrijeme trajanja", + "Remaining Time": "Preostalo vrijeme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Puni ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/sv.js b/jun_pc_web/assets/third_party/TCPlayer/lang/sv.js new file mode 100644 index 000000000..ae3905107 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/sv.js @@ -0,0 +1,26 @@ +TCPlayer.addLanguage("sv",{ + "Play": "Spela", + "Pause": "Pausa", + "Current Time": "Aktuell tid", + "Duration Time": "Total tid", + "Remaining Time": "Återstående tid", + "Stream Type": "Strömningstyp", + "LIVE": "LIVE", + "Loaded": "Laddad", + "Progress": "Förlopp", + "Fullscreen": "Fullskärm", + "Non-Fullscreen": "Ej fullskärm", + "Mute": "Ljud av", + "Unmute": "Ljud på", + "Playback Rate": "Uppspelningshastighet", + "Subtitles": "Text på", + "subtitles off": "Text av", + "Captions": "Text på", + "captions off": "Text av", + "Chapters": "Kapitel", + "You aborted the media playback": "Du har avbrutit videouppspelningen.", + "A network error caused the media download to fail part-way.": "Ett nätverksfel gjorde att nedladdningen av videon avbröts.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Uppspelningen avbröts på grund av att videon är skadad, eller också för att videon använder funktioner som din webbläsare inte stöder.", + "No compatible source was found for this media.": "Det gick inte att hitta någon kompatibel källa för den här videon." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/tr.js b/jun_pc_web/assets/third_party/TCPlayer/lang/tr.js new file mode 100644 index 000000000..85f3ba2f4 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/tr.js @@ -0,0 +1,76 @@ +TCPlayer.addLanguage("tr",{ + "Play": "Oynat", + "Pause": "Duraklat", + "Replay": "Yeniden Oynat", + "Current Time": "Süre", + "Duration Time": "Toplam Süre", + "Remaining Time": "Kalan Süre", + "Stream Type": "Yayın Tipi", + "LIVE": "CANLI", + "Loaded": "Yüklendi", + "Progress": "Yükleniyor", + "Fullscreen": "Tam Ekran", + "Non-Fullscreen": "Küçük Ekran", + "Mute": "Ses Kapa", + "Unmute": "Ses Aç", + "Playback Rate": "Oynatma Hızı", + "Subtitles": "Altyazı", + "subtitles off": "Altyazı Kapalı", + "Captions": "Altyazı", + "captions off": "Altyazı Kapalı", + "Chapters": "Bölümler", + "Close Modal Dialog": "Dialogu Kapat", + "Descriptions": "Açıklamalar", + "descriptions off": "Açıklamalar kapalı", + "Audio Track": "Ses Dosyası", + "You aborted the media playback": "Video oynatmayı iptal ettiniz", + "A network error caused the media download to fail part-way.": "Video indirilirken bağlantı sorunu oluştu.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video oynatılamadı, ağ ya da sunucu hatası veya belirtilen format desteklenmiyor.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Tarayıcınız desteklemediği için videoda hata oluştu.", + "No compatible source was found for this media.": "Video için kaynak bulunamadı.", + "The media is encrypted and we do not have the keys to decrypt it.": "Video, şifrelenmiş bir kaynaktan geliyor ve oynatmak için gerekli anahtar bulunamadı.", + "Play Video": "Videoyu Oynat", + "Close": "Kapat", + "Modal Window": "Modal Penceresi", + "This is a modal window": "Bu bir modal penceresidir", + "This modal can be closed by pressing the Escape key or activating the close button.": "Bu modal ESC tuşuna basarak ya da kapata tıklanarak kapatılabilir.", + ", opens captions settings dialog": ", altyazı ayarları menüsünü açar", + ", opens subtitles settings dialog": ", altyazı ayarları menüsünü açar", + ", opens descriptions settings dialog": ", açıklama ayarları menüsünü açar", + ", selected": ", seçildi", + "captions settings": "altyazı ayarları", + "subtitles settings": "altyazı ayarları", + "descriptions settings": "açıklama ayarları", + "Text": "Yazı", + "White": "Beyaz", + "Black": "Siyah", + "Red": "Kırmızı", + "Green": "Yeşil", + "Blue": "Mavi", + "Yellow": "Sarı", + "Magenta": "Macenta", + "Cyan": "Açık Mavi (Camgöbeği)", + "Background": "Arka plan", + "Window": "Pencere", + "Transparent": "Saydam", + "Semi-Transparent": "Yarı-Saydam", + "Opaque": "Mat", + "Font Size": "Yazı Boyutu", + "Text Edge Style": "Yazı Kenarlıkları", + "None": "Hiçbiri", + "Raised": "Kabartılmış", + "Depressed": "Yassı", + "Uniform": "Düz", + "Dropshadow": "Gölgeli", + "Font Family": "Yazı Tipi", + "Proportional Sans-Serif": "Orantılı Sans-Serif", + "Monospace Sans-Serif": "Eşaralıklı Sans-Serif", + "Proportional Serif": "Orantılı Serif", + "Monospace Serif": "Eşaralıklı Serif", + "Casual": "Gündelik", + "Script": "El Yazısı", + "Small Caps": "Küçük Boyutlu Büyük Harfli", + "Done": "Tamam", + "Caption Settings Dialog": "Altyazı Ayarları Menüsü", + "Beginning of dialog window. Escape will cancel and close the window.": "Diyalog penceresinin başlangıcı. ESC tuşu işlemi iptal edip pencereyi kapatacaktır." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/uk.js b/jun_pc_web/assets/third_party/TCPlayer/lang/uk.js new file mode 100644 index 000000000..92511cc28 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/uk.js @@ -0,0 +1,40 @@ +TCPlayer.addLanguage("uk",{ + "Play": "Відтворити", + "Pause": "Призупинити", + "Current Time": "Поточний час", + "Duration Time": "Тривалість", + "Remaining Time": "Час, що залишився", + "Stream Type": "Тип потоку", + "LIVE": "НАЖИВО", + "Loaded": "Завантаження", + "Progress": "Прогрес", + "Fullscreen": "Повноекранний режим", + "Non-Fullscreen": "Неповноекранний режим", + "Mute": "Без звуку", + "Unmute": "Зі звуком", + "Playback Rate": "Швидкість відтворення", + "Subtitles": "Субтитри", + "subtitles off": "Без субтитрів", + "Captions": "Підписи", + "captions off": "Без підписів", + "Chapters": "Розділи", + "Close Modal Dialog": "Закрити модальний діалог", + "Descriptions": "Описи", + "descriptions off": "Без описів", + "Audio Track": "Аудіодоріжка", + "You aborted the media playback": "Ви припинили відтворення відео", + "A network error caused the media download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.", + "No compatible source was found for this media.": "Сумісні джерела для цього відео відсутні.", + "The media is encrypted and we do not have the keys to decrypt it.": "Відео в зашифрованому вигляді, і ми не маємо ключі для розшифровки.", + "Play Video": "Відтворити відео", + "Close": "Закрити", + "Modal Window": "Модальне вікно", + "This is a modal window": "Це модальне вікно.", + "This modal can be closed by pressing the Escape key or activating the close button.": "Модальне вікно можна закрити, натиснувши клавішу Esc або кнопку закриття вікна.", + ", opens captions settings dialog": ", відкриється діалогове вікно налаштування підписів", + ", opens subtitles settings dialog": ", відкриється діалогове вікно налаштування субтитрів", + ", opens descriptions settings dialog": ", відкриється діалогове вікно налаштування описів", + ", selected": ", обраний" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/vi.js b/jun_pc_web/assets/third_party/TCPlayer/lang/vi.js new file mode 100644 index 000000000..8ef7c814a --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/vi.js @@ -0,0 +1,84 @@ +TCPlayer.addLanguage("vi",{ + "Audio Player": "Trình phát Audio", + "Video Player": "Trình phát Video", + "Play": "Phát", + "Pause": "Tạm dừng", + "Replay": "Phát lại", + "Current Time": "Thời gian hiện tại", + "Duration Time": "Độ dài", + "Remaining Time": "Thời gian còn lại", + "Stream Type": "Kiểu Stream", + "LIVE": "TRỰC TIẾP", + "Loaded": "Đã tải", + "Progress": "Tiến trình", + "Progress Bar": "Thanh tiến trình", + "progress bar timing: currentTime={1} duration={2}": "{1} của {2}", + "Fullscreen": "Toàn màn hình", + "Non-Fullscreen": "Thoát toàn màn hình", + "Mute": "Tắt tiếng", + "Unmute": "Bật âm thanh", + "Playback Rate": "Tỉ lệ phát lại", + "Subtitles": "Phụ đề", + "subtitles off": "tắt phụ đề", + "Captions": "Chú thích", + "captions off": "tắt chú thích", + "Chapters": "Chương", + "Descriptions": "Mô tả", + "descriptions off": "tắt mô tả", + "Audio Track": "Track âm thanh", + "Volume Level": "Mức âm lượng", + "You aborted the media playback": "Bạn đã hủy việc phát lại media.", + "A network error caused the media download to fail part-way.": "Một lỗi mạng dẫn đến việc tải media bị lỗi.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Phát media đã bị hủy do một sai lỗi hoặc media sử dụng những tính năng trình duyệt không hỗ trợ.", + "No compatible source was found for this media.": "Không có nguồn tương thích cho media này.", + "The media is encrypted and we do not have the keys to decrypt it.": "Media đã được mã hóa và chúng tôi không có để giải mã nó.", + "Play Video": "Phát Video", + "Close": "Đóng", + "Close Modal Dialog": "Đóng cửa sổ", + "Modal Window": "Cửa sổ", + "This is a modal window": "Đây là một cửa sổ", + "This modal can be closed by pressing the Escape key or activating the close button.": "Cửa sổ này có thể thoát bằng việc nhấn phím Esc hoặc kích hoạt nút đóng.", + ", opens captions settings dialog": ", mở hộp thoại cài đặt chú thích", + ", opens subtitles settings dialog": ", mở hộp thoại cài đặt phụ đề", + ", opens descriptions settings dialog": ", mở hộp thoại cài đặt mô tả", + ", selected": ", đã chọn", + "captions settings": "cài đặt chú thích", + "subtitles settings": "cài đặt phụ đề", + "descriptions settings": "cài đặt mô tả", + "Text": "Văn bản", + "White": "Trắng", + "Black": "Đen", + "Red": "Đỏ", + "Green": "Xanh lá cây", + "Blue": "Xanh da trời", + "Yellow": "Vàng", + "Magenta": "Đỏ tươi", + "Cyan": "Lam", + "Background": "Nền", + "Window": "Cửa sổ", + "Transparent": "Trong suốt", + "Semi-Transparent": "Bán trong suốt", + "Opaque": "Mờ", + "Font Size": "Kích cỡ phông chữ", + "Text Edge Style": "Dạng viền văn bản", + "None": "None", + "Raised": "Raised", + "Depressed": "Depressed", + "Uniform": "Uniform", + "Dropshadow": "Dropshadow", + "Font Family": "Phông chữ", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "Đặt lại", + "restore all settings to the default values": "khôi phục lại tất cả các cài đặt về giá trị mặc định", + "Done": "Xong", + "Caption Settings Dialog": "Hộp thoại cài đặt chú thích", + "Beginning of dialog window. Escape will cancel and close the window.": "Bắt đầu cửa sổ hộp thoại. Esc sẽ thoát và đóng cửa sổ.", + "End of dialog window.": "Kết thúc cửa sổ hộp thoại." +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/zh-CN.js b/jun_pc_web/assets/third_party/TCPlayer/lang/zh-CN.js new file mode 100644 index 000000000..757347ee6 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/zh-CN.js @@ -0,0 +1,115 @@ +TCPlayer.addLanguage("zh-CN",{ + "Play": "播放", + "Pause": "暂停", + "Current Time": "当前时间", + "Duration Time": "时长", + "Remaining Time": "剩余时间", + "Stream Type": "媒体流类型", + "LIVE": "直播", + "Loaded": "加载完毕", + "Progress": "进度", + "Fullscreen": "全屏", + "Non-Fullscreen": "退出全屏", + "Mute": "静音", + "Unmute": "取消静音", + "Playback Rate": "播放速度", + "Subtitles": "字幕", + "subtitles off": "关闭字幕", + "Captions": "内嵌字幕", + "captions off": "关闭内嵌字幕", + "Chapters": "节目段落", + "Close Modal Dialog": "关闭弹窗", + "Descriptions": "描述", + "descriptions off": "关闭描述", + "Audio Track": "音轨", + "You aborted the media playback": "视频播放被终止", + "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", + "No compatible source was found for this media.": "无法找到此视频兼容的源或者当前环境无法播放该视频。", + "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。", + "Play Video": "播放视频", + "Close": "关闭", + "Modal Window": "弹窗", + "This is a modal window": "这是一个弹窗", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按键或启用关闭按钮来关闭此弹窗。", + ", opens captions settings dialog": ", 开启标题设置弹窗", + ", opens subtitles settings dialog": ", 开启字幕设置弹窗", + ", opens descriptions settings dialog": ", 开启描述设置弹窗", + ", selected": ", 选择", + "captions settings": "字幕设定", + "Audio Player": "音频播放器", + "Video Player": "视频播放器", + "Replay": "重播", + "Progress Bar": "进度小节", + "Volume Level": "音量", + "subtitles settings": "字幕设定", + "descriptions settings": "描述设定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "红", + "Green": "绿", + "Blue": "蓝", + "Yellow": "黄", + "Magenta": "紫红", + "Cyan": "青", + "Background": "背景", + "Window": "视窗", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字体尺寸", + "Text Edge Style": "字体边缘样式", + "None": "无", + "Raised": "浮雕", + "Depressed": "压低", + "Uniform": "均匀", + "Dropshadow": "下阴影", + "Font Family": "字体库", + "Proportional Sans-Serif": "比例无细体", + "Monospace Sans-Serif": "单间隔无细体", + "Proportional Serif": "比例细体", + "Monospace Serif": "单间隔细体", + "Casual": "舒适", + "Script": "手写体", + "Small Caps": "小型大写字体", + "Reset": "重启", + "restore all settings to the default values": "恢复全部设定至预设值", + "Done": "完成", + "Caption Settings Dialog": "字幕设定视窗", + "Beginning of dialog window. Escape will cancel and close the window.": "开始对话视窗。离开会取消及关闭视窗", + "End of dialog window.": "结束对话视窗", + "auto": "自动", + "Request timed out.": "请求超时,请稍后再试。", + "Could not download the video.": "无法加载视频,请检查网络。", + "Server is not respond.": "服务器请求失败,请稍后再试。", + "Server respond error data.": "服务器返回数据有误,请稍后再试。", + "Last time play at ": "上次看到 ", + "Resume play": "恢复播放", + "Powered by Tencent Cloud.": "腾讯云提供技术支持", + "Rise an internal exception when playing HLS.": "播放 HLS 时出现内部异常。", + "Authentication failed.": "防盗链参数鉴权失败。", + "Server failed.": "媒体服务器错误。", + "Get file error.": "媒体服务器获取文件错误。", + "The media file does not exist. Please check if the fileID is correct.": "媒体文件不存在,请检查 fileID 是否正确。", + "No video transcoding information found.": "没有找到视频转码信息。", + "The trial duration is illegal. The trial duration must be within the video duration.": "试看时长不合法,试看时长要在视频时长范围内。", + "Param pcfg is not unique.": "pcfg 不唯一。", + "The license has expired. Please check whether the expiration time setting is reasonable.": "license 过期,请检查过期时间设置是否合理。", + "Did not find an adaptive stream that can be played.": "没有找到可以播放的自适应码流,查看文档。", + "Invalid request format, please check the request format.": "请求格式不合法,请检查请求格式。", + "AppID is not exist, Please check if the AppID is correct.": "AppID 不存在,请检查 AppID 是否正确。", + "Without anti-leech information.": "没带防盗链检测。", + "psign check failed.": "播放参数 psign 校验失败,查看文档。", + "Other errors.": "其他错误。", + "Internal error.": "内部错误。", + "Mirror": "镜像", + "Video statistic": "视频统计信息", + "Play Next": "下一个", + "Current browser not support play this stream, please select another one.": "无法找到此视频兼容的源或者当前环境无法播放该视频,请选择其他视频播放。", + "Server respond error data.(eg. stream not exist)": "媒体服务器获取数据异常,可能该视频不存在,请选择其他视频播放。", + "Video play failed, please refresh to start play again.": "视频播放器失败,请刷新并重新播放。", + "Connection to the server has failed and the number of connection retries has exceeded the set value.": "媒体服务器连接异常,并达到最大重试次数,请检查网络是否正常并刷新重试", + "Video decoding failure.": "视频解码失败,请选择其他视频播放。" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/lang/zh-TW.js b/jun_pc_web/assets/third_party/TCPlayer/lang/zh-TW.js new file mode 100644 index 000000000..dda0aeb24 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/lang/zh-TW.js @@ -0,0 +1,83 @@ +TCPlayer.addLanguage("zh-TW",{ + "Play": "播放", + "Pause": "暫停", + "Current Time": "目前時間", + "Duration Time": "總共時間", + "Remaining Time": "剩餘時間", + "Stream Type": "串流類型", + "LIVE": "直播", + "Loaded": "載入完畢", + "Progress": "進度", + "Fullscreen": "全螢幕", + "Non-Fullscreen": "退出全螢幕", + "Mute": "靜音", + "Unmute": "取消靜音", + "Playback Rate": " 播放速率", + "Subtitles": "字幕", + "subtitles off": "關閉字幕", + "Captions": "內嵌字幕", + "captions off": "關閉內嵌字幕", + "Chapters": "章節", + "Close Modal Dialog": "關閉彈窗", + "Descriptions": "描述", + "descriptions off": "關閉描述", + "Audio Track": "音軌", + "You aborted the media playback": "影片播放已終止", + "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。", + "No compatible source was found for this media.": "無法找到相容此影片的來源。", + "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。", + "Play Video": "播放影片", + "Close": "關閉", + "Modal Window": "對話框", + "This is a modal window": "這是一個對話框", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按鍵或啟用關閉按鈕來關閉此對話框。", + ", opens captions settings dialog": ", 開啟標題設定對話框", + ", opens subtitles settings dialog": ", 開啟字幕設定對話框", + ", opens descriptions settings dialog": ", 開啟描述設定對話框", + ", selected": ", 選擇", + "captions settings": "字幕設定", + "Audio Player": "音頻播放器", + "Video Player": "視頻播放器", + "Replay": "重播", + "Progress Bar": "進度小節", + "Volume Level": "音量", + "subtitles settings": "字幕設定", + "descriptions settings": "描述設定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "紅", + "Green": "綠", + "Blue": "藍", + "Yellow": "黃", + "Magenta": "紫紅", + "Cyan": "青", + "Background": "背景", + "Window": "視窗", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字型尺寸", + "Text Edge Style": "字型邊緣樣式", + "None": "無", + "Raised": "浮雕", + "Depressed": "壓低", + "Uniform": "均勻", + "Dropshadow": "下陰影", + "Font Family": "字型庫", + "Proportional Sans-Serif": "比例無細體", + "Monospace Sans-Serif": "單間隔無細體", + "Proportional Serif": "比例細體", + "Monospace Serif": "單間隔細體", + "Casual": "輕便的", + "Script": "手寫體", + "Small Caps": "小型大寫字體", + "Reset": "重置", + "restore all settings to the default values": "恢復全部設定至預設值", + "Done": "完成", + "Caption Settings Dialog": "字幕設定視窗", + "Beginning of dialog window. Escape will cancel and close the window.": "開始對話視窗。離開會取消及關閉視窗", + "End of dialog window.": "結束對話視窗" +}); \ No newline at end of file diff --git a/jun_pc_web/assets/third_party/TCPlayer/libs/dash.all.min.2.9.3.js b/jun_pc_web/assets/third_party/TCPlayer/libs/dash.all.min.2.9.3.js new file mode 100644 index 000000000..2f853fac9 --- /dev/null +++ b/jun_pc_web/assets/third_party/TCPlayer/libs/dash.all.min.2.9.3.js @@ -0,0 +1,32 @@ +/*! v2.9.3-acda4c40, 2019-02-12T23:12:37Z */ +!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g>6),b.push(128|63&d)):d<65536?(b.push(224|d>>12),b.push(128|63&d>>6),b.push(128|63&d)):(b.push(240|d>>18),b.push(128|63&d>>12),b.push(128|63&d>>6),b.push(128|63&d))}return b},e.decode=function(a){for(var b=[],c=0;c>18)),d.push(b.charAt(63&f>>12)),d.push(b.charAt(63&f>>6)),d.push(b.charAt(63&f))}if(2==a.length-c){var f=(a[c]<<16)+(a[c+1]<<8);d.push(b.charAt(63&f>>18)),d.push(b.charAt(63&f>>12)),d.push(b.charAt(63&f>>6)),d.push("=")}else if(1==a.length-c){var f=a[c]<<16;d.push(b.charAt(63&f>>18)),d.push(b.charAt(63&f>>12)),d.push("==")}return d.join("")},d=function(){for(var a=[],c=0;c=c&&console.log(this.time+" ["+a+"] "+b)}},l=function(a){for(var b=[],c=0;ce&&(k.log("ERROR","Too large cursor position "+this.pos),this.pos=e)},moveCursor:function(a){var b=this.pos+a;if(a>1)for(var c=this.pos+1;c=144&&this.backSpace();var b=c(a);if(this.pos>=e)return void k.log("ERROR","Cannot insert "+a.toString(16)+" ("+b+") at position "+this.pos+". Skipping it!");this.chars[this.pos].setChar(b,this.currPenState),this.moveCursor(1)},clearFromPos:function(a){var b;for(b=a;b0&&(c=a?"["+b.join(" | ")+"]":b.join("\n")),c},getTextAndFormat:function(){return this.rows}};var q=function(a,b){this.chNr=a,this.outputFilter=b,this.mode=null,this.verbose=0,this.displayedMemory=new p,this.nonDisplayedMemory=new p,this.lastOutputScreen=new p,this.currRollUpRow=this.displayedMemory.rows[d-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null};q.prototype={modes:["MODE_ROLL-UP","MODE_POP-ON","MODE_PAINT-ON","MODE_TEXT"],reset:function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.currRollUpRow=this.displayedMemory.rows[d-1],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.lastCueEndTime=null},getHandler:function(){return this.outputFilter},setHandler:function(a){this.outputFilter=a},setPAC:function(a){this.writeScreen.setPAC(a)},setBkgData:function(a){this.writeScreen.setBkgData(a)},setMode:function(a){a!==this.mode&&(this.mode=a,k.log("INFO","MODE="+a),"MODE_POP-ON"==this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=a)},insertChars:function(a){for(var b=0;b=46,b.italics)b.foreground="white";else{var c=Math.floor(a/2)-16,d=["white","green","blue","cyan","red","yellow","magenta"];b.foreground=d[c]}k.log("INFO","MIDROW: "+JSON.stringify(b)),this.writeScreen.setPen(b)},outputDataUpdate:function(){var a=k.time;null!==a&&this.outputFilter&&(this.outputFilter.updateData&&this.outputFilter.updateData(a,this.displayedMemory),null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,a,this.lastOutputScreen),this.cueStartTime=this.displayedMemory.isEmpty()?null:a):this.cueStartTime=a,this.lastOutputScreen.copy(this.displayedMemory))},cueSplitAtTime:function(a){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,a,this.displayedMemory),this.cueStartTime=a))}};var r=function(a,b,c){this.field=a||1,this.outputs=[b,c],this.channels=[new q(1,b),new q(2,c)],this.currChNr=-1,this.lastCmdA=null,this.lastCmdB=null,this.bufferedData=[],this.startTime=null,this.lastTime=null,this.dataCounters={padding:0,char:0,cmd:0,other:0}};r.prototype={getHandler:function(a){return this.channels[a].getHandler()},setHandler:function(a,b){this.channels[a].setHandler(b)},addData:function(a,b){var c,d,e,f=!1;this.lastTime=a,k.setTime(a);for(var g=0;g=16&&d<=31&&d===this.lastCmdA&&e===this.lastCmdB)this.lastCmdA=null,this.lastCmdB=null,k.log("DEBUG","Repeated command ("+l([d,e])+") is dropped");else if(0!==d||0!==e){if(k.log("DATA","["+l([b[g],b[g+1]])+"] -> ("+l([d,e])+")"),c=this.parseCmd(d,e),c||(c=this.parseMidrow(d,e)),c||(c=this.parsePAC(d,e)),c||(c=this.parseBackgroundAttributes(d,e)),!c&&(f=this.parseChars(d,e)))if(this.currChNr&&this.currChNr>=0){var h=this.channels[this.currChNr-1];h.insertChars(f)}else k.log("WARNING","No channel found yet. TEXT-MODE?");c?this.dataCounters.cmd+=2:f?this.dataCounters.char+=2:(this.dataCounters.other+=2,k.log("WARNING","Couldn't parse cleaned data "+l([d,e])+" orig: "+l([b[g],b[g+1]])))}else this.dataCounters.padding+=2},parseCmd:function(a,b){var c=null,d=(20===a||21===a||28===a||29===a)&&32<=b&&b<=47,e=(23===a||31===a)&&33<=b&&b<=35;if(!d&&!e)return!1;c=20===a||21===a||23===a?1:2;var f=this.channels[c-1];return 20===a||21===a||28===a||29===a?32===b?f.cc_RCL():33===b?f.cc_BS():34===b?f.cc_AOF():35===b?f.cc_AON():36===b?f.cc_DER():37===b?f.cc_RU(2):38===b?f.cc_RU(3):39===b?f.cc_RU(4):40===b?f.cc_FON():41===b?f.cc_RDC():42===b?f.cc_TR():43===b?f.cc_RTD():44===b?f.cc_EDM():45===b?f.cc_CR():46===b?f.cc_ENM():47===b&&f.cc_EOC():f.cc_TO(b-32),this.lastCmdA=a,this.lastCmdB=b,this.currChNr=c,!0},parseMidrow:function(a,b){var c=null;if((17===a||25===a)&&32<=b&&b<=47){if((c=17===a?1:2)!==this.currChNr)return k.log("ERROR","Mismatch channel in midrow parsing"),!1;var d=this.channels[c-1];return d.insertChars([32]),d.cc_MIDROW(b),k.log("DEBUG","MIDROW ("+l([a,b])+")"),this.lastCmdA=a,this.lastCmdB=b,!0}return!1},parsePAC:function(a,b){var c=null,d=null,e=(17<=a&&a<=23||25<=a&&a<=31)&&64<=b&&b<=127,j=(16===a||24===a)&&64<=b&&b<=95;if(!e&&!j)return!1;c=a<=23?1:2,d=64<=b&&b<=95?1===c?f[a]:h[a]:1===c?g[a]:i[a];var k=this.interpretPAC(d,b);return this.channels[c-1].setPAC(k),this.lastCmdA=a,this.lastCmdB=b,this.currChNr=c,!0},interpretPAC:function(a,b){var c=b,d={color:null,italics:!1,indent:null,underline:!1,row:a};return c=b>95?b-96:b-64,d.underline=1==(1&c),c<=13?d.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(c/2)]:c<=15?(d.italics=!0,d.color="white"):d.indent=4*Math.floor((c-16)/2),d},parseChars:function(a,b){var d=null,e=null,f=null;if(a>=25?(d=2,f=a-8):(d=1,f=a),17<=f&&f<=19){var g=b;g=17===f?b+80:18===f?b+112:b+144,k.log("INFO","Special char '"+c(g)+"' in channel "+d),e=[g],this.lastCmdA=a,this.lastCmdB=b}else 32<=a&&a<=127&&(e=0===b?[a]:[a,b],this.lastCmdA=null,this.lastCmdB=null);if(e){var h=l(e);k.log("DEBUG","Char codes = "+h.join(","))}return e},parseBackgroundAttributes:function(a,b){var c,d,e,f,g=(16===a||24===a)&&32<=b&&b<=47,h=(23===a||31===a)&&45<=b&&b<=47;return!(!g&&!h)&&(c={},16===a||24===a?(d=Math.floor((b-32)/2),c.background=j[d],b%2==1&&(c.background=c.background+"_semi")):45===b?c.background="transparent":(c.foreground="black",47===b&&(c.underline=!0)),e=a<24?1:2,f=this.channels[e-1],f.setBkgData(c),this.lastCmdA=a,this.lastCmdB=b,!0)},reset:function(){for(var a=0;a/g,">").replace(/"/g,""").replace(/'/g,"'"):a}function g(a,b,c,d){for(var e=0;e0&&g(a.arrayAccessFormPaths,b,c,d)&&(b[c]=[b[c]])}function i(a){var b=a.split(/[-T:+Z]/g),c=new Date(b[0],b[1]-1,b[2]),d=b[5].split(".");if(c.setHours(b[3],b[4],d[0]),d.length>1&&c.setMilliseconds(d[1]),b[6]&&b[7]){var e=60*b[6]+Number(b[7]);e=0+("-"==(/\d\d-\d\d:\d\d$/.test(a)?"-":"+")?-1*e:e),c.setMinutes(c.getMinutes()-e-c.getTimezoneOffset())}else-1!==a.indexOf("Z",a.length-1)&&(c=new Date(Date.UTC(c.getFullYear(),c.getMonth(),c.getDate(),c.getHours(),c.getMinutes(),c.getSeconds(),c.getMilliseconds())));return c}function j(b,c,d){if(a.datetimeAccessFormPaths.length>0){var e=d.split(".#")[0];return g(a.datetimeAccessFormPaths,b,c,e)?i(b):b}return b}function k(b,c,d,e){return!(c==z.ELEMENT_NODE&&a.xmlElementsFilter.length>0)||g(a.xmlElementsFilter,b,d,e)}function l(b,c){if(b.nodeType==z.DOCUMENT_NODE){for(var f=new Object,g=b.childNodes,i=0;i1&&null!=f.__text&&a.skipEmptyTextNodesForObj&&(a.stripWhitespaces&&""==f.__text||""==f.__text.trim())&&delete f.__text:f=f.__cdata,delete f.__cnt,!a.enableToStringFunc||null==f.__text&&null==f.__cdata||(f.toString=function(){return(null!=this.__text?this.__text:"")+(null!=this.__cdata?this.__cdata:"")}),f}if(b.nodeType==z.TEXT_NODE||b.nodeType==z.CDATA_SECTION_NODE)return b.nodeValue}function m(b,c,d,e){var g="<"+(null!=b&&null!=b.__prefix?b.__prefix+":":"")+c;if(null!=d)for(var h=0;h":">"}function n(a,b){return""}function o(a,b){return-1!==a.indexOf(b,a.length-b.length)}function p(b,c){return!!("property"==a.arrayAccessForm&&o(c.toString(),"_asArray")||0==c.toString().indexOf(a.attributePrefix)||0==c.toString().indexOf("__")||b[c]instanceof Function)}function q(a){var b=0;if(a instanceof Object)for(var c in a)p(a,c)||b++;return b}function r(b,c,d){return 0==a.jsonPropertiesFilter.length||""==d||g(a.jsonPropertiesFilter,b,c,d)}function s(b){var c=[];if(b instanceof Object)for(var d in b)-1==d.toString().indexOf("__")&&0==d.toString().indexOf(a.attributePrefix)&&c.push(d);return c}function t(b){var c="";return null!=b.__cdata&&(c+=""),null!=b.__text&&(a.escapeMode?c+=f(b.__text):c+=b.__text),c}function u(b){var c="";return b instanceof Object?c+=t(b):null!=b&&(a.escapeMode?c+=f(b):c+=b),c}function v(a,b){return""===a?b:a+"."+b}function w(a,b,c,d){var e="";if(0==a.length)e+=m(a,b,c,!0);else for(var f=0;f0)for(var d in a)if(!p(a,d)&&(""==b||r(a,d,v(b,d)))){var e=a[d],f=s(e);if(null==e||void 0==e)c+=m(e,d,f,!0);else if(e instanceof Object)if(e instanceof Array)c+=w(e,d,f,b);else if(e instanceof Date)c+=m(e,d,f,!1),c+=e.toISOString(),c+=n(e,d);else{var g=q(e);g>0||null!=e.__text||null!=e.__cdata?(c+=m(e,d,f,!1),c+=x(e,v(b,d)),c+=n(e,d)):c+=m(e,d,f,!0)}else c+=m(e,d,f,!1),c+=u(e),c+=n(e,d)}return c+=u(a)}var y="1.2.0";a=a||{},b(),c();var z={ELEMENT_NODE:1,TEXT_NODE:3,CDATA_SECTION_NODE:4,COMMENT_NODE:8,DOCUMENT_NODE:9};this.parseXmlString=function(a){window.ActiveXObject||window;if(void 0===a)return null;var b;if(window.DOMParser){var c=new window.DOMParser;try{b=c.parseFromString(a,"text/xml"),b.getElementsByTagNameNS("*","parsererror").length>0&&(b=null)}catch(d){b=null}}else 0==a.indexOf("")+2)),b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a);return b},this.asArray=function(a){return void 0===a||null==a?[]:a instanceof Array?a:[a]},this.toXmlDateTime=function(a){return a instanceof Date?a.toISOString():"number"==typeof a?new Date(a).toISOString():null},this.asDateTime=function(a){return"string"==typeof a?i(a):a},this.xml2json=function(a){return l(a)},this.xml_str2json=function(a){var b=this.parseXmlString(a);return null!=b?this.xml2json(b):null},this.json2xml_str=function(a){return x(a,"")},this.json2xml=function(a){var b=this.json2xml_str(a);return this.parseXmlString(b)},this.getVersion=function(){return y}}Object.defineProperty(c,"__esModule",{value:!0}),c.default=d,b.exports=c.default},{}],4:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{default:a}}Object.defineProperty(c,"__esModule",{value:!0});var e=a(5),f=a(117),g=d(f),h=a(151),i=d(h),j=a(95),k=d(j),l=a(46),m=d(l);dashjs.Protection=i.default,dashjs.MetricsReporting=g.default,dashjs.MediaPlayerFactory=k.default,dashjs.Debug=m.default,c.default=dashjs,c.MediaPlayer=e.MediaPlayer,c.Protection=i.default,c.MetricsReporting=g.default,c.MediaPlayerFactory=k.default,c.Debug=m.default},{117:117,151:151,46:46,5:5,95:95}],5:[function(a,b,c){(function(b){"use strict";function d(a){return a&&a.__esModule?a:{default:a}}Object.defineProperty(c,"__esModule",{value:!0});var e=a(93),f=d(e),g=a(48),h=d(g),i=a(46),j=d(i),k=a(49),l="undefined"!=typeof window&&window||b,m=l.dashjs;m||(m=l.dashjs={}),m.MediaPlayer=f.default,m.FactoryMaker=h.default,m.Debug=j.default,m.Version=(0,k.getVersionString)(),c.default=m,c.MediaPlayer=f.default,c.FactoryMaker=h.default,c.Debug=j.default}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{46:46,48:48,49:49,93:93}],6:[function(a,b,c){/*! codem-isoboxer v0.3.5 https://github.com/madebyhiro/codem-isoboxer/blob/master/LICENSE.txt */ +var d={};d.parseBuffer=function(a){return new e(a).parse()},d.addBoxProcessor=function(a,b){"string"==typeof a&&"function"==typeof b&&(f.prototype._boxProcessors[a]=b)},d.createFile=function(){return new e},d.createBox=function(a,b,c){var d=f.create(a);return b&&b.append(d,c),d},d.createFullBox=function(a,b,c){var e=d.createBox(a,b,c);return e.version=0,e.flags=0,e},d.Utils={},d.Utils.dataViewToString=function(a,b){var c=b||"utf-8";if("undefined"!=typeof TextDecoder)return new TextDecoder(c).decode(a);var d=[],e=0;if("utf-8"===c)for(;e>6),b.push(128|63&d)):d<65536?(b.push(224|d>>12),b.push(128|63&d>>6),b.push(128|63&d)):(b.push(240|d>>18),b.push(128|63&d>>12),b.push(128|63&d>>6),b.push(128|63&d))}return b},d.Utils.appendBox=function(a,b,c){if(b._offset=a._cursor.offset,b._root=a._root?a._root:a,b._raw=a._raw,b._parent=a,-1!==c){if(void 0===c||null===c)return void a.boxes.push(b);var d,e=-1;if("number"==typeof c)e=c;else{if("string"==typeof c)d=c;else{if("object"!=typeof c||!c.type)return void a.boxes.push(b);d=c.type}for(var f=0;f>3,b},f.prototype._readUint=function(a){var b,c,d=null,e=this._cursor.offset-this._raw.byteOffset;switch(a){case 8:d=this._raw.getUint8(e);break;case 16:d=this._raw.getUint16(e);break;case 24:b=this._raw.getUint16(e),c=this._raw.getUint8(e+2),d=(b<<8)+c;break;case 32:d=this._raw.getUint32(e);break;case 64:b=this._raw.getUint32(e),c=this._raw.getUint32(e+4),d=b*Math.pow(2,32)+c}return this._cursor.offset+=a>>3,d},f.prototype._readString=function(a){for(var b="",c=0;c0?a:this._raw.byteLength-(this._cursor.offset-this._offset);if(b>0){var c=new Uint8Array(this._raw.buffer,this._cursor.offset,b);return this._cursor.offset+=b,c}return null},f.prototype._readUTF8String=function(){var a=this._raw.byteLength-(this._cursor.offset-this._offset),b=null;return a>0&&(b=new DataView(this._raw.buffer,this._cursor.offset,a),this._cursor.offset+=a),b?d.Utils.dataViewToString(b):b},f.prototype._parseBox=function(){if(this._parsing=!0,this._cursor.offset=this._offset,this._offset+8>this._raw.buffer.byteLength)return void(this._root._incomplete=!0);switch(this._procField("size","uint",32),this._procField("type","string",4),1===this.size&&this._procField("largesize","uint",64),"uuid"===this.type&&this._procFieldArray("usertype",16,"uint",8),this.size){case 0:this._raw=new DataView(this._raw.buffer,this._offset,this._raw.byteLength-this._cursor.offset+8);break;case 1:this._offset+this.size>this._raw.buffer.byteLength?(this._incomplete=!0,this._root._incomplete=!0):this._raw=new DataView(this._raw.buffer,this._offset,this.largesize);break;default:this._offset+this.size>this._raw.buffer.byteLength?(this._incomplete=!0,this._root._incomplete=!0):this._raw=new DataView(this._raw.buffer,this._offset,this.size)}this._incomplete||(this._boxProcessors[this.type]&&this._boxProcessors[this.type].call(this),-1!==this._boxContainers.indexOf(this.type)?this._parseContainerBox():this._data=this._readData())},f.prototype._parseFullBox=function(){this.version=this._readUint(8),this.flags=this._readUint(24)},f.prototype._parseContainerBox=function(){for(this.boxes=[];this._cursor.offset-this._raw.byteOffset>3}else this.size+=a>>3},f.prototype._writeUint=function(a,b){if(this._rawo){var c,d,e=this._cursor.offset-this._rawo.byteOffset;switch(a){case 8:this._rawo.setUint8(e,b);break;case 16:this._rawo.setUint16(e,b);break;case 24:c=(16776960&b)>>8,d=255&b,this._rawo.setUint16(e,c),this._rawo.setUint8(e+2,d);break;case 32:this._rawo.setUint32(e,b);break;case 64:c=Math.floor(b/Math.pow(2,32)),d=b-c*Math.pow(2,32),this._rawo.setUint32(e,c),this._rawo.setUint32(e+4,d)}this._cursor.offset+=a>>3}else this.size+=a>>3},f.prototype._writeString=function(a,b){for(var c=0;c>10&31),96+(this.language>>5&31),96+(31&this.language))),this._procField("pre_defined","uint",16)},f.prototype._boxProcessors.mehd=function(){this._procFullBox(),this._procField("fragment_duration","uint",1==this.version?64:32)},f.prototype._boxProcessors.mfhd=function(){this._procFullBox(),this._procField("sequence_number","uint",32)},f.prototype._boxProcessors.mfro=function(){this._procFullBox(),this._procField("mfra_size","uint",32)},f.prototype._boxProcessors.mp4a=f.prototype._boxProcessors.enca=function(){this._procFieldArray("reserved1",6,"uint",8),this._procField("data_reference_index","uint",16),this._procFieldArray("reserved2",2,"uint",32),this._procField("channelcount","uint",16),this._procField("samplesize","uint",16),this._procField("pre_defined","uint",16),this._procField("reserved3","uint",16),this._procField("samplerate","template",32),this._procField("esds","data",-1)},f.prototype._boxProcessors.mvhd=function(){this._procFullBox(),this._procField("creation_time","uint",1==this.version?64:32),this._procField("modification_time","uint",1==this.version?64:32),this._procField("timescale","uint",32),this._procField("duration","uint",1==this.version?64:32),this._procField("rate","template",32),this._procField("volume","template",16),this._procField("reserved1","uint",16),this._procFieldArray("reserved2",2,"uint",32),this._procFieldArray("matrix",9,"template",32),this._procFieldArray("pre_defined",6,"uint",32),this._procField("next_track_ID","uint",32)},f.prototype._boxProcessors.payl=function(){this._procField("cue_text","utf8")},f.prototype._boxProcessors.pssh=function(){this._procFullBox(),this._procFieldArray("SystemID",16,"uint",8),this._procField("DataSize","uint",32),this._procFieldArray("Data",this.DataSize,"uint",8)},f.prototype._boxProcessors.schm=function(){this._procFullBox(),this._procField("scheme_type","uint",32),this._procField("scheme_version","uint",32),1&this.flags&&this._procField("scheme_uri","string",-1)},f.prototype._boxProcessors.sdtp=function(){this._procFullBox();var a=-1;this._parsing&&(a=this._raw.byteLength-(this._cursor.offset-this._raw.byteOffset)),this._procFieldArray("sample_dependency_table",a,"uint",8)},f.prototype._boxProcessors.sidx=function(){this._procFullBox(),this._procField("reference_ID","uint",32),this._procField("timescale","uint",32),this._procField("earliest_presentation_time","uint",1==this.version?64:32),this._procField("first_offset","uint",1==this.version?64:32),this._procField("reserved","uint",16),this._procField("reference_count","uint",16),this._procEntries("references",this.reference_count,function(a){this._parsing||(a.reference=(1&a.reference_type)<<31,a.reference|=2147483647&a.referenced_size,a.sap=(1&a.starts_with_SAP)<<31,a.sap|=(3&a.SAP_type)<<28,a.sap|=268435455&a.SAP_delta_time),this._procEntryField(a,"reference","uint",32),this._procEntryField(a,"subsegment_duration","uint",32),this._procEntryField(a,"sap","uint",32),this._parsing&&(a.reference_type=a.reference>>31&1,a.referenced_size=2147483647&a.reference,a.starts_with_SAP=a.sap>>31&1,a.SAP_type=a.sap>>28&7,a.SAP_delta_time=268435455&a.sap)})},f.prototype._boxProcessors.smhd=function(){this._procFullBox(),this._procField("balance","uint",16),this._procField("reserved","uint",16)},f.prototype._boxProcessors.ssix=function(){this._procFullBox(),this._procField("subsegment_count","uint",32),this._procEntries("subsegments",this.subsegment_count,function(a){this._procEntryField(a,"ranges_count","uint",32),this._procSubEntries(a,"ranges",a.ranges_count,function(a){this._procEntryField(a,"level","uint",8),this._procEntryField(a,"range_size","uint",24)})})},f.prototype._boxProcessors.stsd=function(){this._procFullBox(),this._procField("entry_count","uint",32),this._procSubBoxes("entries",this.entry_count)},f.prototype._boxProcessors.subs=function(){this._procFullBox(),this._procField("entry_count","uint",32),this._procEntries("entries",this.entry_count,function(a){this._procEntryField(a,"sample_delta","uint",32),this._procEntryField(a,"subsample_count","uint",16),this._procSubEntries(a,"subsamples",a.subsample_count,function(a){this._procEntryField(a,"subsample_size","uint",1===this.version?32:16),this._procEntryField(a,"subsample_priority","uint",8),this._procEntryField(a,"discardable","uint",8),this._procEntryField(a,"codec_specific_parameters","uint",32)})})},f.prototype._boxProcessors.tenc=function(){this._procFullBox(),this._procField("default_IsEncrypted","uint",24),this._procField("default_IV_size","uint",8),this._procFieldArray("default_KID",16,"uint",8)},f.prototype._boxProcessors.tfdt=function(){this._procFullBox(),this._procField("baseMediaDecodeTime","uint",1==this.version?64:32)},f.prototype._boxProcessors.tfhd=function(){this._procFullBox(),this._procField("track_ID","uint",32),1&this.flags&&this._procField("base_data_offset","uint",64),2&this.flags&&this._procField("sample_description_offset","uint",32),8&this.flags&&this._procField("default_sample_duration","uint",32),16&this.flags&&this._procField("default_sample_size","uint",32),32&this.flags&&this._procField("default_sample_flags","uint",32)},f.prototype._boxProcessors.tfra=function(){this._procFullBox(),this._procField("track_ID","uint",32),this._parsing||(this.reserved=0,this.reserved|=(48&this.length_size_of_traf_num)<<4,this.reserved|=(12&this.length_size_of_trun_num)<<2,this.reserved|=3&this.length_size_of_sample_num),this._procField("reserved","uint",32),this._parsing&&(this.length_size_of_traf_num=(48&this.reserved)>>4,this.length_size_of_trun_num=(12&this.reserved)>>2,this.length_size_of_sample_num=3&this.reserved),this._procField("number_of_entry","uint",32),this._procEntries("entries",this.number_of_entry,function(a){this._procEntryField(a,"time","uint",1===this.version?64:32),this._procEntryField(a,"moof_offset","uint",1===this.version?64:32),this._procEntryField(a,"traf_number","uint",8*(this.length_size_of_traf_num+1)),this._procEntryField(a,"trun_number","uint",8*(this.length_size_of_trun_num+1)),this._procEntryField(a,"sample_number","uint",8*(this.length_size_of_sample_num+1))})},f.prototype._boxProcessors.tkhd=function(){this._procFullBox(),this._procField("creation_time","uint",1==this.version?64:32),this._procField("modification_time","uint",1==this.version?64:32),this._procField("track_ID","uint",32),this._procField("reserved1","uint",32),this._procField("duration","uint",1==this.version?64:32),this._procFieldArray("reserved2",2,"uint",32),this._procField("layer","uint",16),this._procField("alternate_group","uint",16),this._procField("volume","template",16),this._procField("reserved3","uint",16),this._procFieldArray("matrix",9,"template",32),this._procField("width","template",32),this._procField("height","template",32)},f.prototype._boxProcessors.trex=function(){this._procFullBox(),this._procField("track_ID","uint",32),this._procField("default_sample_description_index","uint",32),this._procField("default_sample_duration","uint",32),this._procField("default_sample_size","uint",32),this._procField("default_sample_flags","uint",32)},f.prototype._boxProcessors.trun=function(){this._procFullBox(),this._procField("sample_count","uint",32),1&this.flags&&this._procField("data_offset","int",32),4&this.flags&&this._procField("first_sample_flags","uint",32),this._procEntries("samples",this.sample_count,function(a){256&this.flags&&this._procEntryField(a,"sample_duration","uint",32),512&this.flags&&this._procEntryField(a,"sample_size","uint",32),1024&this.flags&&this._procEntryField(a,"sample_flags","uint",32),2048&this.flags&&this._procEntryField(a,"sample_composition_time_offset",1===this.version?"int":"uint",32)})},f.prototype._boxProcessors["url "]=f.prototype._boxProcessors["urn "]=function(){this._procFullBox(),"urn "===this.type&&this._procField("name","string",-1),this._procField("location","string",-1)},f.prototype._boxProcessors.vlab=function(){this._procField("source_label","utf8")},f.prototype._boxProcessors.vmhd=function(){this._procFullBox(),this._procField("graphicsmode","uint",16),this._procFieldArray("opcolor",3,"uint",16)},f.prototype._boxProcessors.vttC=function(){this._procField("config","utf8")},f.prototype._boxProcessors.vtte=function(){}},{}],7:[function(a,b,c){"use strict";var d=Array.isArray,e=Object.keys,f=Object.prototype.hasOwnProperty;b.exports=function a(b,c){if(b===c)return!0;var g,h,i,j=d(b),k=d(c);if(j&&k){if((h=b.length)!=c.length)return!1;for(g=0;g0)throw new Error("Invalid string. Length must be a multiple of 4");var k=a.length;i="="===a.charAt(k-2)?2:"="===a.charAt(k-1)?1:0,j=new e(3*a.length/4-i),g=i>0?a.length-4:a.length;var l=0;for(d=0,f=0;d>16),c((65280&h)>>8),c(255&h);return 2===i?(h=b(a.charAt(d))<<2|b(a.charAt(d+1))>>4,c(255&h)):1===i&&(h=b(a.charAt(d))<<10|b(a.charAt(d+1))<<4|b(a.charAt(d+2))>>2,c(h>>8&255),c(255&h)),j}function d(a){function b(a){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(a)}function c(a){return b(a>>18&63)+b(a>>12&63)+b(a>>6&63)+b(63&a)}var d,e,f,g=a.length%3,h="";for(d=0,f=a.length-g;d>2),h+=b(e<<4&63),h+="==";break;case 2:e=(a[a.length-2]<<8)+a[a.length-1],h+=b(e>>10),h+=b(e>>4&63),h+=b(e<<2&63),h+="="}return h}var e="undefined"!=typeof Uint8Array?Uint8Array:Array,f="+".charCodeAt(0),g="/".charCodeAt(0),h="0".charCodeAt(0),i="a".charCodeAt(0),j="A".charCodeAt(0),k="-".charCodeAt(0),l="_".charCodeAt(0);a.toByteArray=c,a.fromByteArray=d}(void 0===c?this.base64js={}:c)},{}],9:[function(a,b,c){},{}],10:[function(a,b,c){(function(b){/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +"use strict";function d(){function a(){}try{var b=new Uint8Array(1);return b.foo=function(){return 42},b.constructor=a,42===b.foo()&&b.constructor===a&&"function"==typeof b.subarray&&0===b.subarray(1,1).byteLength}catch(c){return!1}}function e(){return f.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function f(a){return this instanceof f?(f.TYPED_ARRAY_SUPPORT||(this.length=0,this.parent=void 0),"number"==typeof a?g(this,a):"string"==typeof a?h(this,a,arguments.length>1?arguments[1]:"utf8"):i(this,a)):arguments.length>1?new f(a,arguments[1]):new f(a)}function g(a,b){if(a=p(a,b<0?0:0|q(b)),!f.TYPED_ARRAY_SUPPORT)for(var c=0;c>>1&&(a.parent=Z),a}function q(a){if(a>=e())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+e().toString(16)+" bytes");return 0|a}function r(a,b){if(!(this instanceof r))return new r(a,b);var c=new f(a,b);return delete c.parent,c}function s(a,b){"string"!=typeof a&&(a=""+a);var c=a.length;if(0===c)return 0;for(var d=!1;;)switch(b){case"ascii":case"binary":case"raw":case"raws":return c;case"utf8":case"utf-8":return R(a).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*c;case"hex":return c>>>1;case"base64":return U(a).length;default:if(d)return R(a).length;b=(""+b).toLowerCase(),d=!0}}function t(a,b,c){var d=!1;if(b|=0,c=void 0===c||c===1/0?this.length:0|c,a||(a="utf8"),b<0&&(b=0),c>this.length&&(c=this.length),c<=b)return"";for(;;)switch(a){case"hex":return F(this,b,c);case"utf8":case"utf-8":return B(this,b,c);case"ascii":return D(this,b,c);case"binary":return E(this,b,c);case"base64":return A(this,b,c);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return G(this,b,c);default:if(d)throw new TypeError("Unknown encoding: "+a);a=(a+"").toLowerCase(),d=!0}}function u(a,b,c,d){c=Number(c)||0;var e=a.length-c;d?(d=Number(d))>e&&(d=e):d=e;var f=b.length;if(f%2!=0)throw new Error("Invalid hex string");d>f/2&&(d=f/2);for(var g=0;g239?4:f>223?3:f>191?2:1;if(e+h<=c){var i,j,k,l;switch(h){case 1:f<128&&(g=f);break;case 2:i=a[e+1],128==(192&i)&&(l=(31&f)<<6|63&i)>127&&(g=l);break;case 3:i=a[e+1],j=a[e+2],128==(192&i)&&128==(192&j)&&(l=(15&f)<<12|(63&i)<<6|63&j)>2047&&(l<55296||l>57343)&&(g=l);break;case 4:i=a[e+1],j=a[e+2],k=a[e+3],128==(192&i)&&128==(192&j)&&128==(192&k)&&(l=(15&f)<<18|(63&i)<<12|(63&j)<<6|63&k)>65535&&l<1114112&&(g=l)}}null===g?(g=65533,h=1):g>65535&&(g-=65536,d.push(g>>>10&1023|55296),g=56320|1023&g),d.push(g),e+=h}return C(d)}function C(a){var b=a.length;if(b<=$)return String.fromCharCode.apply(String,a);for(var c="",d=0;dd)&&(c=d);for(var e="",f=b;fc)throw new RangeError("Trying to access beyond buffer length")}function I(a,b,c,d,e,g){if(!f.isBuffer(a))throw new TypeError("buffer must be a Buffer instance");if(b>e||ba.length)throw new RangeError("index out of range")}function J(a,b,c,d){b<0&&(b=65535+b+1);for(var e=0,f=Math.min(a.length-c,2);e>>8*(d?e:1-e)}function K(a,b,c,d){b<0&&(b=4294967295+b+1);for(var e=0,f=Math.min(a.length-c,4);e>>8*(d?e:3-e)&255}function L(a,b,c,d,e,f){if(b>e||ba.length)throw new RangeError("index out of range");if(c<0)throw new RangeError("index out of range")}function M(a,b,c,d,e){return e||L(a,b,c,4,3.4028234663852886e38,-3.4028234663852886e38),X.write(a,b,c,d,23,4),c+4}function N(a,b,c,d,e){return e||L(a,b,c,8,1.7976931348623157e308,-1.7976931348623157e308),X.write(a,b,c,d,52,8),c+8}function O(a){if(a=P(a).replace(aa,""),a.length<2)return"";for(;a.length%4!=0;)a+="=";return a}function P(a){return a.trim?a.trim():a.replace(/^\s+|\s+$/g,"")}function Q(a){return a<16?"0"+a.toString(16):a.toString(16)}function R(a,b){b=b||1/0;for(var c,d=a.length,e=null,f=[],g=0;g55295&&c<57344){if(!e){if(c>56319){(b-=3)>-1&&f.push(239,191,189);continue}if(g+1===d){(b-=3)>-1&&f.push(239,191,189);continue}e=c;continue}if(c<56320){(b-=3)>-1&&f.push(239,191,189),e=c;continue}c=65536+(e-55296<<10|c-56320)}else e&&(b-=3)>-1&&f.push(239,191,189);if(e=null,c<128){if((b-=1)<0)break;f.push(c)}else if(c<2048){if((b-=2)<0)break;f.push(c>>6|192,63&c|128)}else if(c<65536){if((b-=3)<0)break;f.push(c>>12|224,c>>6&63|128,63&c|128)}else{if(!(c<1114112))throw new Error("Invalid code point");if((b-=4)<0)break;f.push(c>>18|240,c>>12&63|128,c>>6&63|128,63&c|128)}}return f}function S(a){for(var b=[],c=0;c>8,e=c%256,f.push(e),f.push(d);return f}function U(a){return W.toByteArray(O(a))}function V(a,b,c,d){for(var e=0;e=b.length||e>=a.length);e++)b[e+c]=a[e];return e}var W=a(8),X=a(14),Y=a(11);c.Buffer=f,c.SlowBuffer=r,c.INSPECT_MAX_BYTES=50,f.poolSize=8192;var Z={};f.TYPED_ARRAY_SUPPORT=void 0!==b.TYPED_ARRAY_SUPPORT?b.TYPED_ARRAY_SUPPORT:d(),f.TYPED_ARRAY_SUPPORT?(f.prototype.__proto__=Uint8Array.prototype,f.__proto__=Uint8Array):(f.prototype.length=void 0,f.prototype.parent=void 0),f.isBuffer=function(a){return!(null==a||!a._isBuffer)},f.compare=function(a,b){if(!f.isBuffer(a)||!f.isBuffer(b))throw new TypeError("Arguments must be Buffers");if(a===b)return 0;for(var c=a.length,d=b.length,e=0,g=Math.min(c,d);e0&&(a=this.toString("hex",0,b).match(/.{2}/g).join(" "),this.length>b&&(a+=" ... ")),""},f.prototype.compare=function(a){if(!f.isBuffer(a))throw new TypeError("Argument must be a Buffer");return this===a?0:f.compare(this,a)},f.prototype.indexOf=function(a,b){function c(a,b,c){for(var d=-1,e=0;c+e2147483647?b=2147483647:b<-2147483648&&(b=-2147483648),b>>=0,0===this.length)return-1;if(b>=this.length)return-1;if(b<0&&(b=Math.max(this.length+b,0)),"string"==typeof a)return 0===a.length?-1:String.prototype.indexOf.call(this,a,b);if(f.isBuffer(a))return c(this,a,b);if("number"==typeof a)return f.TYPED_ARRAY_SUPPORT&&"function"===Uint8Array.prototype.indexOf?Uint8Array.prototype.indexOf.call(this,a,b):c(this,[a],b);throw new TypeError("val must be string, number or Buffer")},f.prototype.get=function(a){return console.log(".get() is deprecated. Access using array indexes instead."),this.readUInt8(a)},f.prototype.set=function(a,b){return console.log(".set() is deprecated. Access using array indexes instead."),this.writeUInt8(a,b)},f.prototype.write=function(a,b,c,d){if(void 0===b)d="utf8",c=this.length,b=0;else if(void 0===c&&"string"==typeof b)d=b,c=this.length,b=0;else if(isFinite(b))b|=0,isFinite(c)?(c|=0,void 0===d&&(d="utf8")):(d=c,c=void 0);else{var e=d;d=b,b=0|c,c=e}var f=this.length-b;if((void 0===c||c>f)&&(c=f),a.length>0&&(c<0||b<0)||b>this.length)throw new RangeError("attempt to write outside buffer bounds");d||(d="utf8");for(var g=!1;;)switch(d){case"hex":return u(this,a,b,c);case"utf8":case"utf-8":return v(this,a,b,c);case"ascii":return w(this,a,b,c);case"binary":return x(this,a,b,c);case"base64":return y(this,a,b,c);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return z(this,a,b,c);default:if(g)throw new TypeError("Unknown encoding: "+d);d=(""+d).toLowerCase(),g=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var $=4096;f.prototype.slice=function(a,b){var c=this.length;a=~~a,b=void 0===b?c:~~b,a<0?(a+=c)<0&&(a=0):a>c&&(a=c),b<0?(b+=c)<0&&(b=0):b>c&&(b=c),b0&&(e*=256);)d+=this[a+--b]*e;return d},f.prototype.readUInt8=function(a,b){return b||H(a,1,this.length),this[a]},f.prototype.readUInt16LE=function(a,b){return b||H(a,2,this.length),this[a]|this[a+1]<<8},f.prototype.readUInt16BE=function(a,b){return b||H(a,2,this.length),this[a]<<8|this[a+1]},f.prototype.readUInt32LE=function(a,b){return b||H(a,4,this.length),(this[a]|this[a+1]<<8|this[a+2]<<16)+16777216*this[a+3]},f.prototype.readUInt32BE=function(a,b){return b||H(a,4,this.length),16777216*this[a]+(this[a+1]<<16|this[a+2]<<8|this[a+3])},f.prototype.readIntLE=function(a,b,c){a|=0,b|=0,c||H(a,b,this.length);for(var d=this[a],e=1,f=0;++f=e&&(d-=Math.pow(2,8*b)),d},f.prototype.readIntBE=function(a,b,c){a|=0,b|=0,c||H(a,b,this.length);for(var d=b,e=1,f=this[a+--d];d>0&&(e*=256);)f+=this[a+--d]*e;return e*=128,f>=e&&(f-=Math.pow(2,8*b)),f},f.prototype.readInt8=function(a,b){return b||H(a,1,this.length),128&this[a]?-1*(255-this[a]+1):this[a]},f.prototype.readInt16LE=function(a,b){b||H(a,2,this.length);var c=this[a]|this[a+1]<<8;return 32768&c?4294901760|c:c},f.prototype.readInt16BE=function(a,b){b||H(a,2,this.length);var c=this[a+1]|this[a]<<8;return 32768&c?4294901760|c:c},f.prototype.readInt32LE=function(a,b){return b||H(a,4,this.length),this[a]|this[a+1]<<8|this[a+2]<<16|this[a+3]<<24},f.prototype.readInt32BE=function(a,b){return b||H(a,4,this.length),this[a]<<24|this[a+1]<<16|this[a+2]<<8|this[a+3]},f.prototype.readFloatLE=function(a,b){return b||H(a,4,this.length),X.read(this,a,!0,23,4)},f.prototype.readFloatBE=function(a,b){return b||H(a,4,this.length),X.read(this,a,!1,23,4)},f.prototype.readDoubleLE=function(a,b){return b||H(a,8,this.length),X.read(this,a,!0,52,8)},f.prototype.readDoubleBE=function(a,b){return b||H(a,8,this.length),X.read(this,a,!1,52,8)},f.prototype.writeUIntLE=function(a,b,c,d){a=+a,b|=0,c|=0,d||I(this,a,b,c,Math.pow(2,8*c),0);var e=1,f=0;for(this[b]=255&a;++f=0&&(f*=256);)this[b+e]=a/f&255;return b+c},f.prototype.writeUInt8=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,1,255,0),f.TYPED_ARRAY_SUPPORT||(a=Math.floor(a)),this[b]=255&a,b+1},f.prototype.writeUInt16LE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8):J(this,a,b,!0),b+2},f.prototype.writeUInt16BE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=255&a):J(this,a,b,!1),b+2},f.prototype.writeUInt32LE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[b+3]=a>>>24,this[b+2]=a>>>16,this[b+1]=a>>>8,this[b]=255&a):K(this,a,b,!0),b+4},f.prototype.writeUInt32BE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+2]=a>>>8,this[b+3]=255&a):K(this,a,b,!1),b+4},f.prototype.writeIntLE=function(a,b,c,d){if(a=+a,b|=0,!d){var e=Math.pow(2,8*c-1);I(this,a,b,c,e-1,-e)}var f=0,g=1,h=a<0?1:0;for(this[b]=255&a;++f>0)-h&255;return b+c},f.prototype.writeIntBE=function(a,b,c,d){if(a=+a,b|=0,!d){var e=Math.pow(2,8*c-1);I(this,a,b,c,e-1,-e)}var f=c-1,g=1,h=a<0?1:0;for(this[b+f]=255&a;--f>=0&&(g*=256);)this[b+f]=(a/g>>0)-h&255;return b+c},f.prototype.writeInt8=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,1,127,-128),f.TYPED_ARRAY_SUPPORT||(a=Math.floor(a)),a<0&&(a=255+a+1),this[b]=255&a,b+1},f.prototype.writeInt16LE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8):J(this,a,b,!0),b+2},f.prototype.writeInt16BE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=255&a):J(this,a,b,!1),b+2},f.prototype.writeInt32LE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,4,2147483647,-2147483648),f.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8,this[b+2]=a>>>16,this[b+3]=a>>>24):K(this,a,b,!0),b+4},f.prototype.writeInt32BE=function(a,b,c){return a=+a,b|=0,c||I(this,a,b,4,2147483647,-2147483648),a<0&&(a=4294967295+a+1),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+2]=a>>>8,this[b+3]=255&a):K(this,a,b,!1),b+4},f.prototype.writeFloatLE=function(a,b,c){return M(this,a,b,!0,c)},f.prototype.writeFloatBE=function(a,b,c){return M(this,a,b,!1,c)},f.prototype.writeDoubleLE=function(a,b,c){return N(this,a,b,!0,c)},f.prototype.writeDoubleBE=function(a,b,c){return N(this,a,b,!1,c)},f.prototype.copy=function(a,b,c,d){if(c||(c=0),d||0===d||(d=this.length),b>=a.length&&(b=a.length),b||(b=0),d>0&&d=this.length)throw new RangeError("sourceStart out of bounds");if(d<0)throw new RangeError("sourceEnd out of bounds");d>this.length&&(d=this.length),a.length-b=0;e--)a[e+b]=this[e+c];else if(g<1e3||!f.TYPED_ARRAY_SUPPORT)for(e=0;e=this.length)throw new RangeError("start out of bounds");if(c<0||c>this.length)throw new RangeError("end out of bounds");var d;if("number"==typeof a)for(d=b;d0&&this._events[a].length>c&&(this._events[a].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[a].length),"function"==typeof console.trace&&console.trace())}return this},d.prototype.on=d.prototype.addListener,d.prototype.once=function(a,b){function c(){this.removeListener(a,c),d||(d=!0,b.apply(this,arguments))}if(!e(b))throw TypeError("listener must be a function");var d=!1;return c.listener=b,this.on(a,c),this},d.prototype.removeListener=function(a,b){var c,d,f,h;if(!e(b))throw TypeError("listener must be a function");if(!this._events||!this._events[a])return this;if(c=this._events[a],f=c.length,d=-1,c===b||e(c.listener)&&c.listener===b)delete this._events[a],this._events.removeListener&&this.emit("removeListener",a,b);else if(g(c)){for(h=f;h-- >0;)if(c[h]===b||c[h].listener&&c[h].listener===b){d=h;break}if(d<0)return this;1===c.length?(c.length=0,delete this._events[a]):c.splice(d,1),this._events.removeListener&&this.emit("removeListener",a,b)}return this},d.prototype.removeAllListeners=function(a){var b,c;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[a]&&delete this._events[a],this;if(0===arguments.length){for(b in this._events)"removeListener"!==b&&this.removeAllListeners(b);return this.removeAllListeners("removeListener"),this._events={},this}if(c=this._events[a],e(c))this.removeListener(a,c);else for(;c.length;)this.removeListener(a,c[c.length-1]);return delete this._events[a],this},d.prototype.listeners=function(a){return this._events&&this._events[a]?e(this._events[a])?[this._events[a]]:this._events[a].slice():[]},d.listenerCount=function(a,b){return a._events&&a._events[b]?e(a._events[b])?1:a._events[b].length:0}},{}],14:[function(a,b,c){c.read=function(a,b,c,d,e){var f,g,h=8*e-d-1,i=(1<>1,k=-7,l=c?e-1:0,m=c?-1:1,n=a[b+l];for(l+=m,f=n&(1<<-k)-1,n>>=-k,k+=h;k>0;f=256*f+a[b+l],l+=m,k-=8);for(g=f&(1<<-k)-1,f>>=-k,k+=d;k>0;g=256*g+a[b+l],l+=m,k-=8);if(0===f)f=1-j;else{if(f===i)return g?NaN:1/0*(n?-1:1);g+=Math.pow(2,d),f-=j}return(n?-1:1)*g*Math.pow(2,f-d)},c.write=function(a,b,c,d,e,f){var g,h,i,j=8*f-e-1,k=(1<>1,m=23===e?Math.pow(2,-24)-Math.pow(2,-77):0,n=d?0:f-1,o=d?1:-1,p=b<0||0===b&&1/b<0?1:0;for(b=Math.abs(b),isNaN(b)||b===1/0?(h=isNaN(b)?1:0,g=k):(g=Math.floor(Math.log(b)/Math.LN2),b*(i=Math.pow(2,-g))<1&&(g--,i*=2),b+=g+l>=1?m/i:m*Math.pow(2,1-l),b*i>=2&&(g++,i/=2),g+l>=k?(h=0,g=k):g+l>=1?(h=(b*i-1)*Math.pow(2,e),g+=l):(h=b*Math.pow(2,l-1)*Math.pow(2,e),g=0));e>=8;a[c+n]=255&h,n+=o,h/=256,e-=8);for(g=g<0;a[c+n]=255&g,n+=o,g/=256,j-=8);a[c+n-o]|=128*p}},{}],15:[function(a,b,c){"function"==typeof Object.create?b.exports=function(a,b){a.super_=b,a.prototype=Object.create(b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}})}:b.exports=function(a,b){a.super_=b;var c=function(){};c.prototype=b.prototype,a.prototype=new c,a.prototype.constructor=a}},{}],16:[function(a,b,c){function d(a){return!!a.constructor&&"function"==typeof a.constructor.isBuffer&&a.constructor.isBuffer(a)}function e(a){return"function"==typeof a.readFloatLE&&"function"==typeof a.slice&&d(a.slice(0,0))}/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ +b.exports=function(a){return null!=a&&(d(a)||e(a)||!!a._isBuffer)}},{}],17:[function(a,b,c){(function(a){"use strict";function c(b,c,d,e){if("function"!=typeof b)throw new TypeError('"callback" argument must be a function');var f,g,h=arguments.length;switch(h){case 0:case 1:return a.nextTick(b);case 2:return a.nextTick(function(){b.call(null,c)});case 3:return a.nextTick(function(){b.call(null,c,d)});case 4:return a.nextTick(function(){b.call(null,c,d,e)});default:for(f=new Array(h-1),g=0;g1)for(var c=1;c0?("string"==typeof b||g.objectMode||Object.getPrototypeOf(b)===L.prototype||(b=e(b)),d?g.endEmitted?a.emit("error",new Error("stream.unshift() after end event")):k(a,g,b,!0):g.ended?a.emit("error",new Error("stream.push() after EOF")):(g.reading=!1,g.decoder&&!c?(b=g.decoder.write(b),g.objectMode||0!==b.length?k(a,g,b,!1):s(a,g)):k(a,g,b,!1))):d||(g.reading=!1)}return m(g)}function k(a,b,c,d){b.flowing&&0===b.length&&!b.sync?(a.emit("data",c),a.read(0)):(b.length+=b.objectMode?1:c.length,d?b.buffer.unshift(c):b.buffer.push(c),b.needReadable&&q(a)),s(a,b)}function l(a,b){var c;return f(b)||"string"==typeof b||void 0===b||a.objectMode||(c=new TypeError("Invalid non-string/buffer chunk")),c}function m(a){return!a.ended&&(a.needReadable||a.length=U?a=U:(a--,a|=a>>>1,a|=a>>>2,a|=a>>>4,a|=a>>>8,a|=a>>>16,a++),a}function o(a,b){return a<=0||0===b.length&&b.ended?0:b.objectMode?1:a!==a?b.flowing&&b.length?b.buffer.head.data.length:b.length:(a>b.highWaterMark&&(b.highWaterMark=n(a)),a<=b.length?a:b.ended?b.length:(b.needReadable=!0,0))}function p(a,b){if(!b.ended){if(b.decoder){var c=b.decoder.end();c&&c.length&&(b.buffer.push(c),b.length+=b.objectMode?1:c.length)}b.ended=!0,q(a)}}function q(a){var b=a._readableState;b.needReadable=!1,b.emittedReadable||(P("emitReadable",b.flowing),b.emittedReadable=!0,b.sync?G.nextTick(r,a):r(a))}function r(a){P("emit readable"),a.emit("readable"),y(a)}function s(a,b){b.readingMore||(b.readingMore=!0,G.nextTick(t,a,b))}function t(a,b){for(var c=b.length;!b.reading&&!b.flowing&&!b.ended&&b.length=b.length?(c=b.decoder?b.buffer.join(""):1===b.buffer.length?b.buffer.head.data:b.buffer.concat(b.length),b.buffer.clear()):c=A(a,b.buffer,b.decoder),c}function A(a,b,c){var d;return af.length?f.length:a;if(g===f.length?e+=f:e+=f.slice(0,a),0===(a-=g)){g===f.length?(++d,c.next?b.head=c.next:b.head=b.tail=null):(b.head=c,c.data=f.slice(g));break}++d}return b.length-=d,e}function C(a,b){var c=L.allocUnsafe(a),d=b.head,e=1;for(d.data.copy(c),a-=d.data.length;d=d.next;){var f=d.data,g=a>f.length?f.length:a;if(f.copy(c,c.length-a,0,g),0===(a-=g)){g===f.length?(++e,d.next?b.head=d.next:b.head=b.tail=null):(b.head=d,d.data=f.slice(g));break}++e}return b.length-=e,c}function D(a){var b=a._readableState;if(b.length>0)throw new Error('"endReadable()" called on non-empty stream');b.endEmitted||(b.ended=!0,G.nextTick(E,b,a))}function E(a,b){a.endEmitted||0!==a.length||(a.endEmitted=!0,b.readable=!1,b.emit("end"))}function F(a,b){for(var c=0,d=a.length;c=b.highWaterMark||b.ended))return P("read: emitReadable",b.length,b.ended),0===b.length&&b.ended?D(this):q(this),null;if(0===(a=o(a,b))&&b.ended)return 0===b.length&&D(this),null;var d=b.needReadable;P("need readable",d),(0===b.length||b.length-a0?z(a,b):null,null===e?(b.needReadable=!0,a=0):b.length-=a,0===b.length&&(b.ended||(b.needReadable=!0),c!==a&&b.ended&&D(this)),null!==e&&this.emit("data",e),e},i.prototype._read=function(a){this.emit("error",new Error("_read() is not implemented"))},i.prototype.pipe=function(a,b){function d(a,b){P("onunpipe"),a===m&&b&&!1===b.hasUnpiped&&(b.hasUnpiped=!0,f())}function e(){P("onend"),a.end()}function f(){P("cleanup"),a.removeListener("close",j),a.removeListener("finish",k),a.removeListener("drain",q),a.removeListener("error",i),a.removeListener("unpipe",d),m.removeListener("end",e),m.removeListener("end",l),m.removeListener("data",h),r=!0,!n.awaitDrain||a._writableState&&!a._writableState.needDrain||q()}function h(b){P("ondata"),s=!1,!1!==a.write(b)||s||((1===n.pipesCount&&n.pipes===a||n.pipesCount>1&&-1!==F(n.pipes,a))&&!r&&(P("false write response, pause",m._readableState.awaitDrain),m._readableState.awaitDrain++,s=!0),m.pause())}function i(b){P("onerror",b),l(),a.removeListener("error",i),0===J(a,"error")&&a.emit("error",b)}function j(){a.removeListener("finish",k),l()}function k(){P("onfinish"),a.removeListener("close",j),l()}function l(){P("unpipe"),m.unpipe(a)}var m=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=a;break;case 1:n.pipes=[n.pipes,a];break;default:n.pipes.push(a)}n.pipesCount+=1,P("pipe count=%d opts=%j",n.pipesCount,b);var o=(!b||!1!==b.end)&&a!==c.stdout&&a!==c.stderr,p=o?e:l;n.endEmitted?G.nextTick(p):m.once("end",p),a.on("unpipe",d);var q=u(m);a.on("drain",q);var r=!1,s=!1;return m.on("data",h),g(a,"error",i),a.once("close",j),a.once("finish",k),a.emit("pipe",m),n.flowing||(P("pipe resume"),m.resume()),a},i.prototype.unpipe=function(a){var b=this._readableState,c={hasUnpiped:!1};if(0===b.pipesCount)return this;if(1===b.pipesCount)return a&&a!==b.pipes?this:(a||(a=b.pipes),b.pipes=null,b.pipesCount=0,b.flowing=!1,a&&a.emit("unpipe",this,c),this);if(!a){var d=b.pipes,e=b.pipesCount;b.pipes=null,b.pipesCount=0,b.flowing=!1;for(var f=0;f-1?setImmediate:B.nextTick;j.WritableState=i;var E=a(12);E.inherits=a(15);var F={deprecate:a(37)},G=a(27),H=a(34).Buffer,I=d.Uint8Array||function(){},J=a(26);E.inherits(j,G),i.prototype.getBuffer=function(){for(var a=this.bufferedRequest,b=[];a;)b.push(a),a=a.next;return b},function(){try{Object.defineProperty(i.prototype,"buffer",{get:F.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(a){}}();var K;"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(K=Function.prototype[Symbol.hasInstance],Object.defineProperty(j,Symbol.hasInstance,{value:function(a){return!!K.call(this,a)||this===j&&(a&&a._writableState instanceof i)}})):K=function(a){return a instanceof this},j.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},j.prototype.write=function(a,b,c){var d=this._writableState,e=!1,i=!d.objectMode&&g(a);return i&&!H.isBuffer(a)&&(a=f(a)),"function"==typeof b&&(c=b,b=null),i?b="buffer":b||(b=d.defaultEncoding),"function"!=typeof c&&(c=h),d.ended?k(this,c):(i||l(this,d,a,c))&&(d.pendingcb++,e=n(this,d,i,a,b,c)),e},j.prototype.cork=function(){this._writableState.corked++},j.prototype.uncork=function(){var a=this._writableState;a.corked&&(a.corked--,a.writing||a.corked||a.finished||a.bufferProcessing||!a.bufferedRequest||u(this,a))},j.prototype.setDefaultEncoding=function(a){if("string"==typeof a&&(a=a.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((a+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+a);return this._writableState.defaultEncoding=a,this},Object.defineProperty(j.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),j.prototype._write=function(a,b,c){c(new Error("_write() is not implemented"))},j.prototype._writev=null,j.prototype.end=function(a,b,c){var d=this._writableState;"function"==typeof a?(c=a,a=null,b=null):"function"==typeof b&&(c=b,b=null),null!==a&&void 0!==a&&this.write(a,b),d.corked&&(d.corked=1,this.uncork()),d.ending||d.finished||z(this,d,c)},Object.defineProperty(j.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(a){this._writableState&&(this._writableState.destroyed=a)}}),j.prototype.destroy=J.destroy,j.prototype._undestroy=J.undestroy,j.prototype._destroy=function(a,b){this.end(),b(a)}}).call(this,a(18),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{12:12,15:15,17:17,18:18,20:20,26:26,27:27,34:34,37:37}],25:[function(a,b,c){"use strict";function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(a,b,c){a.copy(b,c)}var f=a(34).Buffer,g=a(9);b.exports=function(){function a(){d(this,a),this.head=null,this.tail=null,this.length=0}return a.prototype.push=function(a){var b={data:a,next:null};this.length>0?this.tail.next=b:this.head=b,this.tail=b,++this.length},a.prototype.unshift=function(a){var b={data:a,next:this.head};0===this.length&&(this.tail=b),this.head=b,++this.length},a.prototype.shift=function(){if(0!==this.length){var a=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,a}},a.prototype.clear=function(){this.head=this.tail=null,this.length=0},a.prototype.join=function(a){if(0===this.length)return"";for(var b=this.head,c=""+b.data;b=b.next;)c+=a+b.data;return c},a.prototype.concat=function(a){if(0===this.length)return f.alloc(0);if(1===this.length)return this.head.data;for(var b=f.allocUnsafe(a>>>0),c=this.head,d=0;c;)e(c.data,b,d),d+=c.data.length,c=c.next;return b},a}(),g&&g.inspect&&g.inspect.custom&&(b.exports.prototype[g.inspect.custom]=function(){var a=g.inspect({length:this.length});return this.constructor.name+" "+a})},{34:34,9:9}],26:[function(a,b,c){"use strict";function d(a,b){var c=this,d=this._readableState&&this._readableState.destroyed,e=this._writableState&&this._writableState.destroyed;return d||e?(b?b(a):!a||this._writableState&&this._writableState.errorEmitted||g.nextTick(f,this,a),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(a||null,function(a){!b&&a?(g.nextTick(f,c,a),c._writableState&&(c._writableState.errorEmitted=!0)):b&&b(a)}),this)}function e(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function f(a,b){a.emit("error",b)}var g=a(17);b.exports={destroy:d,undestroy:e}},{17:17}],27:[function(a,b,c){b.exports=a(13).EventEmitter},{13:13}],28:[function(a,b,c){arguments[4][11][0].apply(c,arguments)},{11:11}],29:[function(a,b,c){"use strict";function d(a){if(!a)return"utf8";for(var b;;)switch(a){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return a;default:if(b)return;a=(""+a).toLowerCase(),b=!0}}function e(a){var b=d(a);if("string"!=typeof b&&(s.isEncoding===t||!t(a)))throw new Error("Unknown encoding: "+a);return b||a}function f(a){this.encoding=e(a);var b;switch(this.encoding){case"utf16le":this.text=m,this.end=n,b=4;break;case"utf8":this.fillLast=j,b=4;break;case"base64":this.text=o,this.end=p,b=3;break;default:return this.write=q,void(this.end=r)}this.lastNeed=0,this.lastTotal=0,this.lastChar=s.allocUnsafe(b)}function g(a){return a<=127?0:a>>5==6?2:a>>4==14?3:a>>3==30?4:a>>6==2?-1:-2}function h(a,b,c){var d=b.length-1;if(d=0?(e>0&&(a.lastNeed=e-1),e):--d=0?(e>0&&(a.lastNeed=e-2),e):--d=0?(e>0&&(2===e?e=0:a.lastNeed=e-3),e):0)}function i(a,b,c){if(128!=(192&b[0]))return a.lastNeed=0,"�";if(a.lastNeed>1&&b.length>1){if(128!=(192&b[1]))return a.lastNeed=1,"�";if(a.lastNeed>2&&b.length>2&&128!=(192&b[2]))return a.lastNeed=2,"�"}}function j(a){var b=this.lastTotal-this.lastNeed,c=i(this,a,b);return void 0!==c?c:this.lastNeed<=a.length?(a.copy(this.lastChar,b,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(a.copy(this.lastChar,b,0,a.length),void(this.lastNeed-=a.length))}function k(a,b){var c=h(this,a,b);if(!this.lastNeed)return a.toString("utf8",b);this.lastTotal=c;var d=a.length-(c-this.lastNeed);return a.copy(this.lastChar,0,d),a.toString("utf8",b,d)}function l(a){var b=a&&a.length?this.write(a):"";return this.lastNeed?b+"�":b}function m(a,b){if((a.length-b)%2==0){var c=a.toString("utf16le",b);if(c){var d=c.charCodeAt(c.length-1);if(d>=55296&&d<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=a[a.length-2],this.lastChar[1]=a[a.length-1],c.slice(0,-1)}return c}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=a[a.length-1],a.toString("utf16le",b,a.length-1)}function n(a){var b=a&&a.length?this.write(a):"";if(this.lastNeed){var c=this.lastTotal-this.lastNeed;return b+this.lastChar.toString("utf16le",0,c)}return b}function o(a,b){var c=(a.length-b)%3;return 0===c?a.toString("base64",b):(this.lastNeed=3-c,this.lastTotal=3,1===c?this.lastChar[0]=a[a.length-1]:(this.lastChar[0]=a[a.length-2],this.lastChar[1]=a[a.length-1]),a.toString("base64",b,a.length-c))}function p(a){var b=a&&a.length?this.write(a):"";return this.lastNeed?b+this.lastChar.toString("base64",0,3-this.lastNeed):b}function q(a){return a.toString(this.encoding)}function r(a){return a&&a.length?this.write(a):""}var s=a(34).Buffer,t=s.isEncoding||function(a){switch((a=""+a)&&a.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};c.StringDecoder=f,f.prototype.write=function(a){if(0===a.length)return"";var b,c;if(this.lastNeed){if(void 0===(b=this.fillLast(a)))return"";c=this.lastNeed,this.lastNeed=0}else c=0;return c=this.charLength-this.charReceived?this.charLength-this.charReceived:a.length;if(a.copy(this.charBuffer,this.charReceived,0,c),this.charReceived+=c,this.charReceived=55296&&d<=56319)){if(this.charReceived=this.charLength=0,0===a.length)return b;break}this.charLength+=this.surrogateSize,b=""}this.detectIncompleteChar(a);var e=a.length;this.charLength&&(a.copy(this.charBuffer,0,a.length-this.charReceived,e),e-=this.charReceived),b+=a.toString(this.encoding,0,e);var e=b.length-1,d=b.charCodeAt(e);if(d>=55296&&d<=56319){var f=this.surrogateSize;return this.charLength+=f,this.charReceived+=f,this.charBuffer.copy(this.charBuffer,f,0,f),a.copy(this.charBuffer,0,0,f),b.substring(0,e)}return b},j.prototype.detectIncompleteChar=function(a){for(var b=a.length>=3?3:a.length;b>0;b--){var c=a[a.length-b];if(1==b&&c>>5==6){this.charLength=2;break}if(b<=2&&c>>4==14){this.charLength=3;break}if(b<=3&&c>>3==30){this.charLength=4;break}}this.charReceived=b},j.prototype.end=function(a){var b="";if(a&&a.length&&(b=this.write(a)),this.charReceived){var c=this.charReceived,d=this.charBuffer,e=this.encoding;b+=d.slice(0,c).toString(e)}return b}},{10:10}],37:[function(a,b,c){(function(a){function c(a,b){function c(){if(!e){if(d("throwDeprecation"))throw new Error(b);d("traceDeprecation")?console.trace(b):console.warn(b),e=!0}return a.apply(this,arguments)}if(d("noDeprecation"))return a;var e=!1;return c}function d(b){try{if(!a.localStorage)return!1}catch(d){return!1}var c=a.localStorage[b];return null!=c&&"true"===String(c).toLowerCase()}b.exports=c}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],38:[function(a,b,c){!function(a,b,c,d,e){function f(a){this.node=a}function g(){this.events=[],this.head=null,this.body=null}function h(){this.styling=null,this.layout=null}function i(){this.styles={}}function j(){this.id=null,this.styleAttrs=null,this.styleRefs=null}function k(){this.regions={}}function l(a){this.kind=a,this.begin=null,this.end=null,this.styleAttrs=null,this.regionID=null,this.sets=null,this.timeContainer=null}function m(){l.call(this,"body")}function n(){l.call(this,"div")}function o(){l.call(this,"p")}function p(){l.call(this,"span"),this.space=null}function q(){l.call(this,"span"),this.space=null,this.text=null}function r(){l.call(this,"br")}function s(){this.id=null,this.begin=null,this.end=null,this.styleAttrs=null,this.sets=null}function t(){this.begin=null,this.end=null,this.qname=null,this.value=null}function u(a){return a&&"xml:id"in a.attributes?a.attributes["xml:id"].value||null:null}function v(a){return a&&"region"in a.attributes?a.attributes.region.value:""}function w(a,b){var c=a&&"timeContainer"in a.attributes?a.attributes.timeContainer.value:null;return c&&"par"!==c?"seq"===c?"seq":(K(b,"Illegal value of timeContainer (assuming 'par')"),"par"):"par"}function x(a){return a&&"style"in a.attributes?a.attributes.style.value.split(" "):[]}function y(a,b){var c={};if(null!==a)for(var e in a.attributes){var f=a.attributes[e].uri+" "+a.attributes[e].local,g=d.byQName[f];if(void 0!==g){var h=g.parse(a.attributes[e].value);null!==h?(c[f]=h,g===d.byName.zIndex&&J(b,"zIndex attribute present but not used by IMSC1 since regions do not overlap")):K(b,"Cannot parse styling attribute "+f+" --\x3e "+a.attributes[e].value)}}return c}function z(a,b,c){for(var d in a.attributes)if(a.attributes[d].uri===b&&a.attributes[d].local===c)return a.attributes[d].value;return null}function A(a,b){var d=z(a,c.ns_ittp,"aspectRatio"),e=null;if(null!==d){var f=/(\d+) (\d+)/,g=f.exec(d);if(null!==g){var h=parseInt(g[1]),i=parseInt(g[2]);0!==h&&0!==i?e=h/i:K(b,"Illegal aspectRatio values (ignoring)")}else K(b,"Malformed aspectRatio attribute (ignoring)")}return e}function B(a,b){var d=z(a,c.ns_ttp,"cellResolution"),e=15,f=32;if(null!==d){var g=/(\d+) (\d+)/,h=g.exec(d);null!==h?(f=parseInt(h[1]),e=parseInt(h[2])):J(b,"Malformed cellResolution value (using initial value instead)")}return{w:f,h:e}}function C(a,b){var d,e=z(a,c.ns_ttp,"frameRate"),f=30;if(null!==e){d=/(\d+)/.exec(e),null!==d?f=parseInt(d[1]):J(b,"Malformed frame rate attribute (using initial value instead)")}var g=z(a,c.ns_ttp,"frameRateMultiplier"),h=1;if(null!==g){d=/(\d+) (\d+)/.exec(g),null!==d?h=parseInt(d[1])/parseInt(d[2]):J(b,"Malformed frame rate multiplier attribute (using initial value instead)")}var i=h*f,j=1,k=z(a,c.ns_ttp,"tickRate");if(null===k)null!==e&&(j=i);else{d=/(\d+)/.exec(k),null!==d?j=parseInt(d[1]):J(b,"Malformed tick rate attribute (using initial value instead)")}return{effectiveFrameRate:i,tickRate:j}}function D(a,b){var d=z(a,c.ns_tts,"extent");if(null===d)return null;var f=d.split(" ");if(2!==f.length)return J(b,"Malformed extent (ignoring)"),null;var g=e.parseLength(f[0]),h=e.parseLength(f[1]);return h&&g?{h:h,w:g}:(J(b,"Malformed extent values (ignoring)"),null)}function E(a,b,c){var d,e=/^(\d{2,}):(\d\d):(\d\d(?:\.\d+)?)$/,f=/^(\d{2,}):(\d\d):(\d\d)\:(\d{2,})$/,g=/^(\d+(?:\.\d+)?)f$/,h=/^(\d+(?:\.\d+)?)t$/,i=/^(\d+(?:\.\d+)?)ms$/,j=/^(\d+(?:\.\d+)?)s$/,k=/^(\d+(?:\.\d+)?)h$/,l=/^(\d+(?:\.\d+)?)m$/,m=null;return null!==(d=g.exec(c))?null!==b&&(m=parseFloat(d[1])/b):null!==(d=h.exec(c))?null!==a&&(m=parseFloat(d[1])/a):null!==(d=i.exec(c))?m=parseFloat(d[1])/1e3:null!==(d=j.exec(c))?m=parseFloat(d[1]):null!==(d=k.exec(c))?m=3600*parseFloat(d[1]):null!==(d=l.exec(c))?m=60*parseFloat(d[1]):null!==(d=e.exec(c))?m=3600*parseInt(d[1])+60*parseInt(d[2])+parseFloat(d[3]):null!==(d=f.exec(c))&&null!==b&&(m=3600*parseInt(d[1])+60*parseInt(d[2])+parseInt(d[3])+(null===d[4]?0:parseInt(d[4])/b)),m}function F(a,b,c,d){var e=b&&"seq"===b.timeContainer,f=0;c&&"begin"in c.attributes&&null===(f=E(a.tickRate,a.effectiveFrameRate,c.attributes.begin.value))&&(J(d,"Malformed begin value "+c.attributes.begin.value+" (using 0)"),f=0);var g=e?0:null;c&&"dur"in c.attributes&&null===(g=E(a.tickRate,a.effectiveFrameRate,c.attributes.dur.value))&&J(d,"Malformed dur value "+c.attributes.dur.value+" (ignoring)");var h=null;c&&"end"in c.attributes&&null===(h=E(a.tickRate,a.effectiveFrameRate,c.attributes.end.value))&&J(d,"Malformed end value (ignoring)");var i=0;if(b&&(i=e&&"contents"in b&&b.contents.length>0?b.contents[b.contents.length-1].end:b.begin||0),f+=i,null!==g)h=f+g;else{var j=b&&"end"in b?b.end:Number.POSITIVE_INFINITY;h=null!==h?h+i:j}return{begin:f,end:h}}function G(a,b,c){for(;b.styleRefs.length>0;){var d=b.styleRefs.pop();d in a.styles?(G(a,a.styles[d],c),I(a.styles[d].styleAttrs,b.styleAttrs)):K(c,"Non-existant style id referenced")}}function H(a,b,c,d){for(var e=b.length-1;e>=0;e--){var f=b[e];f in a.styles?I(a.styles[f].styleAttrs,c):K(d,"Non-existant style id referenced")}}function I(a,b){for(var c in a)c in b||(b[c]=a[c])}function J(a,b){if(a&&a.warn&&a.warn(b))throw b}function K(a,b){if(a&&a.error&&a.error(b))throw b}function L(a,b){throw a&&a.fatal&&a.fatal(b),b}function M(a,b){for(var c,d=0,e=a.length-1;d<=e;){c=Math.floor((d+e)/2);var f=a[c];if(fb))return{found:!0,index:c};e=c-1}}return{found:!1,index:d}}a.fromXML=function(a,d,e){var l=b.parser(!0,{xmlns:!0}),u=[],v=[],w=[],x=0,y=null;l.onclosetag=function(a){if(u[0]instanceof i)for(var b in u[0].styles)G(u[0],u[0].styles[b],d);else if(u[0]instanceof o||u[0]instanceof p){if(u[0].contents.length>1){var g,h=[u[0].contents[0]];for(g=1;g0&&e&&"onCloseTag"in e&&e.onCloseTag());w.shift(),v.shift(),u.shift()},l.ontext=function(a){if(void 0===u[0]);else if(u[0]instanceof p||u[0]instanceof o){var b=new q;b.initFromText(y,u[0],a,w[0],d),u[0].contents.push(b)}else u[0]instanceof f&&x>0&&e&&"onText"in e&&e.onText(a)},l.onopentag=function(a){var b=a.attributes["xml:space"];b?w.unshift(b.value):0===w.length?w.unshift("default"):w.unshift(w[0]);var l=a.attributes["xml:lang"];if(l?v.unshift(l.value):0===v.length?v.unshift(""):v.unshift(v[0]),a.uri===c.ns_tt)if("tt"===a.local)null!==y&&L("Two elements at ("+this.line+","+this.column+")"),y=new g,y.initFromNode(a,d),u.unshift(y);else if("head"===a.local)u[0]instanceof g||L("Parent of element is not at ("+this.line+","+this.column+")"),null!==y.head&&L("Second element at ("+this.line+","+this.column+")"),y.head=new h,u.unshift(y.head);else if("styling"===a.local)u[0]instanceof h||L("Parent of element is not at ("+this.line+","+this.column+")"),null!==y.head.styling&&L("Second element at ("+this.line+","+this.column+")"),y.head.styling=new i,u.unshift(y.head.styling);else if("style"===a.local){var q;u[0]instanceof i?(q=new j,q.initFromNode(a,d),q.id?y.head.styling.styles[q.id]=q:K(" + + + +
    +
    +
    +
    4
    😔
    6
    +
    +
    哎呀!找不到模板文件
    +
    {$file | default=""}模板不存在,请检查对应的目录文件,注意区分大小写!
    +
    + +
    + + + \ No newline at end of file diff --git a/jun_pc_web/base/common/roletemplate.html b/jun_pc_web/base/common/roletemplate.html new file mode 100644 index 000000000..5644099ea --- /dev/null +++ b/jun_pc_web/base/common/roletemplate.html @@ -0,0 +1,38 @@ + + + + + + + + + 你没有权限 + + + + +
    +
    +
    +
    4
    😔
    6
    +
    +
    哎呀!你没有权限,请联系管理员或者HR!
    +
    + +
    + + + \ No newline at end of file diff --git a/jun_pc_web/business/analysis/index.html b/jun_pc_web/business/analysis/index.html new file mode 100644 index 000000000..787878954 --- /dev/null +++ b/jun_pc_web/business/analysis/index.html @@ -0,0 +1,431 @@ +{extend name="../../base/view/common/base" /} + +{block name="style"} + +{/block} + +{block name="body"} +
    +
    +
    +
    +
    报销售额
    +
    +
    ¥ 126,560
    +
    + 周同比 12% + + 日同比 3% + +
    +
    日销报销 ¥12,423
    +
    +
    +
    +
    +
    +
    +
    发票总数
    +
    +
    6,560
    +
    +
    +
    +
    总发票数 1,234
    +
    +
    +
    +
    +
    +
    +
    访问量
    +
    +
    6,560
    +
    +
    +
    +
    日访问量 1,234
    +
    +
    +
    +
    +
    +
    +
    业绩效果
    +
    +
    83%
    +
    +
    +
    +
    +
    +
    +
    +
    回款金额 ¥ 12,234
    +
    +
    +
    +
    + + +
    +
    +
    地域分布
    +
    +
    +
    +
    +
    + +
    +
    +
    在线人数
    +
    +
    +
    +
    +
    +
    +
    +
    浏览器分布
    +
    +
    +
    +
    +
    +
    +
    +{/block} + + + +{block name="script"} + + + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/contract/cate/cate.html b/jun_pc_web/contract/cate/cate.html new file mode 100644 index 000000000..a759ee990 --- /dev/null +++ b/jun_pc_web/contract/cate/cate.html @@ -0,0 +1,167 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +

    说明

    +

    合同性质分为:普通合同、框架合同、补充协议、其他合同

    +

    1、普通合同有合同金额,且金额为必填项;

    +

    2、框架合同无合同金额;

    +

    3、补充协议和其它合同有合同金额,但合同金额不是必填项;

    +

    4、补充协议必须要选择一个母合同。

    +
    +
     <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
     <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
     <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
     <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
     <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
     <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n

     <\/p>\n

     <\/p>\n

     <\/p>\n

     <\/p>\n

     <\/p>", + "read": 125, + "type": 1, + "status": 1, + "sort": 0, + "create_time": "2023-11-06 21:26:24", + "update_time": null, + "delete_time": 0, + "cate_title": "工具", + "department": "财务部", + "user": "风采铃" + }, + { + "id": 18, + "title": "三字经", + "cate_id": 2, + "keywords": "", + "desc": "人之初,性本善", + "thumb": 0, + "uid": 5, + "did": 2, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    人之初,性本善。性相近,习相远<\/p>", + "read": 148, + "type": 1, + "status": 1, + "sort": 0, + "create_time": "2023-08-14 17:58:16", + "update_time": "2023-08-14 18:00:11", + "delete_time": 0, + "cate_title": "规章制度", + "department": "人事部", + "user": "玉辞心" + }, + { + "id": 16, + "title": "医疗行业前景", + "cate_id": 16, + "keywords": "", + "desc": "123", + "thumb": 0, + "uid": 4, + "did": 3, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    学医佛挡杀佛大多发发发的发<\/span><\/span><\/span><\/p>", + "read": 197, + "type": 1, + "status": 1, + "sort": 0, + "create_time": "2023-08-04 15:04:07", + "update_time": null, + "delete_time": 0, + "cate_title": "医疗", + "department": "财务部", + "user": "风采铃" + }, + { + "id": 15, + "title": "天气预报", + "cate_id": 5, + "keywords": "", + "desc": "内容摘要", + "thumb": 0, + "uid": 4, + "did": 3, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    123232131<\/p>", + "read": 85, + "type": 3, + "status": 1, + "sort": 0, + "create_time": "2023-08-04 15:01:07", + "update_time": null, + "delete_time": 0, + "cate_title": "科技信息", + "department": "财务部", + "user": "风采铃" + }, + { + "id": 13, + "title": "顶顶顶顶", + "cate_id": 2, + "keywords": "", + "desc": "顶顶顶顶", + "thumb": 0, + "uid": 7, + "did": 6, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    顶顶顶顶<\/p>", + "read": 82, + "type": 1, + "status": 1, + "sort": 0, + "create_time": "2023-07-22 08:14:58", + "update_time": null, + "delete_time": 0, + "cate_title": "规章制度", + "department": "技术部", + "user": "叶小钗" + }, + { + "id": 8, + "title": "cc测试共享知识", + "cate_id": 2, + "keywords": "", + "desc": "阿斯蒂芬阿斯蒂芬爱的色放爱的色放爱的色放爱的色放阿迪斯发第三方", + "thumb": 0, + "uid": 3, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    阿斯蒂芬阿斯蒂芬爱的色放爱的色放爱的色放爱的色放阿迪斯发第三方<\/p>", + "read": 144, + "type": 0, + "status": 1, + "sort": 0, + "create_time": "2023-06-27 13:02:03", + "update_time": null, + "delete_time": 0, + "cate_title": "规章制度", + "department": "董事会", + "user": "一页书" + }, + { + "id": 2, + "title": "勾股Admin——优秀的前端Web UI解决方案", + "cate_id": 2, + "keywords": "", + "desc": "勾股Admin是一款开基于Layui的最新版扩展的Web UI解决方案。封装了Layui的自身调用方法和一些常用的工具函数,整合部分第三方开源的组件。", + "thumb": 0, + "uid": 1, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    勾股Admin是一款开基于Layui的最新版扩展的Web UI解决方案。封装了Layui的自身调用方法和一些常用的工具函数,整合部分第三方开源的组件。更多是为服务端程序员量身定做,为使用者提供相对完善的前端UI开发方案,相信她是一个很好的前端轮子。<\/p>\r\n

    项目体验地址:http:\/\/admin.gougucms.com<\/p>

    项目开源地址:https:\/\/gitee.com\/gouguopen\/guoguadmin<\/p>", + "read": 397, + "type": 0, + "status": 1, + "sort": 1, + "create_time": "2022-04-25 00:19:49", + "update_time": null, + "delete_time": 0, + "cate_title": "规章制度", + "department": "董事会", + "user": "超级员工" + }, + { + "id": 5, + "title": "勾股DEV——研发管理与团队协作的工具", + "cate_id": 2, + "keywords": "", + "desc": "勾股DEV是一款专为IT行业研发团队打造的智能化项目管理与团队协作的工具,可以在线管理团队的工作、项目和任务,覆盖从需求提出到研发完成上线整个过程的项目协作。", + "thumb": 0, + "uid": 1, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    勾股DEV是一款专为IT行业研发团队打造的智能化项目管理与团队协作的工具软件,可以在线管理团队的工作、项目和任务,覆盖从需求提出到研发完成上线整个过程的项目协作。<\/p>

    项目体验地址:https:\/\/www.gougucms.com\/home\/pages\/detail\/s\/gougudev.html<\/p>

    项目开源地址:https:\/\/gitee.com\/gouguopen\/dev<\/p>", + "read": 171, + "type": 0, + "status": 1, + "sort": 1, + "create_time": "2022-04-25 00:19:49", + "update_time": null, + "delete_time": 0, + "cate_title": "规章制度", + "department": "董事会", + "user": "超级员工" + }, + { + "id": 4, + "title": "勾股BLOG——简约,易用开源的个人博客系统", + "cate_id": 2, + "keywords": "", + "desc": "勾股BLOG是一款实用的开源免费的个人博客系统。集成了系统管理、基础数据、博客文章、博客动态、语雀知识库、用户管理、访问统计等功能。具有简约,易用,内存占用低等特点,可以用来做个人博客,工作室官网,自...", + "thumb": 0, + "uid": 1, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    勾股BLOG是一款实用的开源免费的个人博客系统。集成了系统管理、基础数据、博客文章、博客动态、语雀知识库、用户管理、访问统计等功能。具有简约,易用,内存占用低等特点,可以用来做个人博客,工作室官网,自媒体官网等网站,二次开发之后也可以作为资讯、展品展示等网站。<\/p>

    项目体验地址:http:\/\/blog.gougucms.com<\/p>

    项目开源地址:https:\/\/gitee.com\/gouguopen\/blog<\/p>", + "read": 147, + "type": 0, + "status": 1, + "sort": 1, + "create_time": "2022-04-25 00:19:12", + "update_time": null, + "delete_time": 0, + "cate_title": "规章制度", + "department": "董事会", + "user": "超级员工" + }, + { + "id": 3, + "title": "勾股CMS——轻量级、高性能极速后台开发框架", + "cate_id": 2, + "keywords": "", + "desc": "勾股CMS是一套轻量级、高性能极速后台开发框架。通用型的后台权限管理框架,极低门槛、操作简单、开箱即用。系统易于功能扩展,代码维护,方便二次开发,让...", + "thumb": 0, + "uid": 1, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    勾股CMS是一套轻量级、高性能极速后台开发框架。通用型的后台权限管理框架,极低门槛、操作简单、开箱即用。系统易于功能扩展,代码维护,方便二次开发,让开发者更专注于业务深度需求的开发,帮助开发者简单高效降低二次开发成本。<\/p>

    项目体验地址:http:\/\/www.gougucms.com<\/p>

    项目开源地址:https:\/\/gitee.com\/gouguopen\/gougucms<\/p>", + "read": 104, + "type": 0, + "status": 1, + "sort": 1, + "create_time": "2022-04-25 00:18:05", + "update_time": null, + "delete_time": 0, + "cate_title": "规章制度", + "department": "董事会", + "user": "超级员工" + }, + { + "id": 1, + "title": "勾股OA——简单实用的开源免费的企业办公系统框架", + "cate_id": 2, + "keywords": "", + "desc": "勾股办公是一款简单实用的开源免费的企业办公系统框架。系统集成了系统设置、人事管理模块、消息管理模块、日常办公、财务管理等基础模块。系统简约,易于功...", + "thumb": 0, + "uid": 1, + "did": 1, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    勾股办公是一款简单实用的开源免费的企业办公系统框架。系统集成了系统设置、人事管理模块、消息管理模块、日常办公、财务管理等基础模块。系统简约,易于功能扩展,方便二次开发,让开发者更专注于业务深度需求的开发,帮助开发者简单高效降低二次开发成本,通过二次开发之后可以用来做CRM,ERP,业务管理等系统。<\/p>

    项目体验地址:https:\/\/www.gougucms.com\/home\/pages\/detail\/s\/gouguoa.html<\/p>

    项目开源地址:https:\/\/gitee.com\/gouguopen\/office<\/p>", + "read": 170, + "type": 2, + "status": 1, + "sort": 1, + "create_time": "2021-11-27 11:54:40", + "update_time": "2022-04-25 00:18:27", + "delete_time": 0, + "cate_title": "规章制度", + "department": "董事会", + "user": "超级员工" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/article/index/index2.html b/jun_pc_web/article/index/index2.html new file mode 100644 index 000000000..52c388147 --- /dev/null +++ b/jun_pc_web/article/index/index2.html @@ -0,0 +1,84 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +

    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/article/index/list.html b/jun_pc_web/article/index/list.html new file mode 100644 index 000000000..73dfe3410 --- /dev/null +++ b/jun_pc_web/article/index/list.html @@ -0,0 +1,202 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/article/index/list.json b/jun_pc_web/article/index/list.json new file mode 100644 index 000000000..85f5f2200 --- /dev/null +++ b/jun_pc_web/article/index/list.json @@ -0,0 +1,31 @@ +{ + "code": 0, + "msg": "", + "count": 1, + "data": [ + { + "id": 13, + "title": "顶顶顶顶", + "cate_id": 2, + "keywords": "", + "desc": "顶顶顶顶", + "thumb": 0, + "uid": 7, + "did": 6, + "origin_url": "", + "file_ids": "", + "is_share": 1, + "share_dids": "", + "share_uids": "", + "content": "

    顶顶顶顶<\/p>", + "read": 82, + "type": 1, + "status": 1, + "sort": 0, + "create_time": "2023-07-22 08:14:58", + "update_time": null, + "delete_time": 0, + "cate_title": "规章制度" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/article/index/list2.html b/jun_pc_web/article/index/list2.html new file mode 100644 index 000000000..7945ec408 --- /dev/null +++ b/jun_pc_web/article/index/list2.html @@ -0,0 +1,148 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +

    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/article/index/view.html b/jun_pc_web/article/index/view.html new file mode 100644 index 000000000..8662e69a6 --- /dev/null +++ b/jun_pc_web/article/index/view.html @@ -0,0 +1,242 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +
    +

    感受到防守打法撒的发生

    +
    + 发表于:2023-11-06 21:26:24 + 发布人:风采铃 + 部门:财务部 + 分类:工具 +
    +
    +

    阿萨法的说法说得对歌诗达搜嘎代发手打

    +

    阿萨德刚地方撒

    +
    <div>slkjadslkfjsl</div>
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            
            
            
            
            
            
    +

     

    +

     

    +

     

    +

     

    +

     

    +
    +
    +

    相关评论

    +
    +
    +
    + {vo.name} +
    +
    +
    + 素还真2023-11-20 18:00:54 +
    +
    对方感到舒服
    +
    +
    +
    +
    +
    +
    + {vo.name} +
    +
    +
    + 素还真2023-11-08 16:09:55 +
    +
    额前的
    +
    +
    +
    + + +
    + + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/article/index/view2.html b/jun_pc_web/article/index/view2.html new file mode 100644 index 000000000..321a0e0a0 --- /dev/null +++ b/jun_pc_web/article/index/view2.html @@ -0,0 +1,134 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
    +

    {$detail.title}

    +
    + 发表于:{$detail.create_time | date='Y-m-d H:i:s'} + 发布人:{$detail.user} + 部门:{$detail.department} + 分类:{$detail.cate_title} +
    +
    + {$detail.content|raw} +
    + {notempty name="$detail.file_ids"} +

    相关附件

    +
    + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo,'view')}
    + {/volist} +
    + {/notempty} +
    +
    +

    相关评论

    + {volist name="$detail.comment" id="vo"} +
    +
    +
    + {vo.name} +
    +
    +
    + {$vo.name}{$vo.create_time}{$vo.update_time} + {eq name="$vo.admin_id" value="$login_admin.id"} + + {/eq} +
    +
    {$vo.content}
    +
    +
    +
    + {/volist} + +
    + + +
    + +
    +
    +
    +{/block} + + + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/assets/css/admin.css b/jun_pc_web/assets/css/admin.css new file mode 100644 index 000000000..1f69d5282 --- /dev/null +++ b/jun_pc_web/assets/css/admin.css @@ -0,0 +1,5252 @@ +/** EasyWeb iframe v3.1.8 date:2020-05-04 License By http://easyweb.vip */ +* { + font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif; +} + +body { + color: #595959; + background-color: #f5f7f9; +} + +.layui-layout-body { + overflow: auto; +} + +.layui-layout-admin { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; + -webkit-transition: left .3s, right .3s; + transition: left .3s, right .3s; +} + +/** header */ +.layui-layout-admin .layui-header { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 50px; + background-color: #fff; + box-shadow: 0 1px 0 0 rgba(0, 0, 0, .03); + z-index: 999; +} + +.layui-layer-gougu-admin {box-shadow: 1px 1px 10px rgba(0,0,0,.1); border-radius: 0!important;overflow:initial!important;} +.express-box { position: fixed; z-index:9999; height:100%; right: -100%; top:0;background-color: #fff;} +.express-box article{width:100%; height:100%; overflow:auto;} +.express-mask{ display: none; position: fixed; top: 0; left: 0; z-index: 9998; width: 100%; height: 100%; background-color: rgba(0,0,0,.6); } +.express-close{position: absolute;width:24px;height:60px; padding:20px 6px; line-height:30px;text-align:center; left: -38px;right:0; top: 16%;background-color:#FF5722;color:#fff;border-radius:6px 0 0 6px; cursor:pointer; border:2px solid #fff; border-right:none; font-weight:600; font-size:14px;} +.express-close:hover{opacity:0.9} + +/* header logo */ +.layui-layout-admin .layui-header .layui-logo { + color: #ddd; + width: 235px; + line-height: 50px; + background-color: #191a23; + box-shadow: 1px 2px 2px 0 rgba(0, 0, 0, .05); + position: relative; + vertical-align: top; + white-space: nowrap; + display: inline-block; + -webkit-transition: width .3s; + transition: width .3s; + overflow: hidden; +} + +.layui-layout-admin .layui-header .layui-logo img { + height: 28px; + vertical-align: middle; +} + +.layui-layout-admin .layui-header .layui-logo cite { + font-style: normal; + vertical-align: middle; +} + +/* header nav */ +.layui-layout-admin .layui-header .layui-layout-left { + padding: 0; + vertical-align: top; + display: inline-block; + position: static !important; +} + +.layui-layout-admin .layui-header .layui-layout-right { + padding: 0; +} + +.layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar { + height: 2px; + top: 0 !important; + background-color: #191a23; +} + +.layui-layout-admin .layui-header .layui-nav .layui-nav-item { + line-height: 50px; + vertical-align: top; +} + +.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child { + top: 55px; +} + +.layui-layout-admin .layui-header .layui-nav-item .layui-icon { + font-size: 16px; +} + +.layui-layout-admin .layui-header a { + color: #595959; + padding: 0 15px; + cursor: pointer; +} + +.layui-layout-admin .layui-header a:hover { + color: #595959; +} + +.layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; + text-align: center; +} + +.layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #8c8c8c transparent transparent; +} + +.layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #8c8c8c; +} + +.layui-layout-admin .layui-header .layui-nav-img { + width: 26px; + height: 26px; + margin-right: 2px; + vertical-align: middle; +} + +.layui-layout-admin .layui-header .layui-nav-img + cite { + margin-right: 3px; + vertical-align: middle; +} + +.layui-layout-admin .layui-header .layui-badge-dot { + right: 8px; + margin: -10px 0 0 0; +} + +/** //header end */ + +/** body */ +.layui-layout-admin .layui-body { + position: absolute; + left: 235px; + top: 50px; + z-index: auto; + overflow: auto; + -webkit-transition: left .3s; + transition: left .3s; + -webkit-overflow-scrolling: touch; +} + +.admin-iframe { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; +} + +.layui-fluid { + padding: 15px; +} + +/* footer */ +.layui-layout-admin .layui-footer { + position: absolute; + left: 235px; + background: #fff; + box-sizing: border-box; + border-top: 1px solid #f5f7f9; + -webkit-transition: left .3s; + transition: left .3s; + overflow: hidden; +} + +.close-footer .layui-layout-admin .layui-footer { + display: none; +} + +.close-footer .layui-layout-admin .layui-body { + bottom: 0; +} + +/** //body end */ + +/** side */ +.layui-layout-admin .layui-side { + position: absolute; + top: 50px; + width: 235px; + background-color: #191a23; + box-shadow: 1px 2px 2px 0 rgba(0, 0, 0, .05); + -webkit-transition: width .3s; + transition: width .3s; + -webkit-user-select: none; + user-select: none; + z-index: 1000; +} + +.layui-layout-admin .layui-side .layui-side-scroll { + width: 255px; + -webkit-transition: width .3s; + transition: width .3s; +} + +.layui-layout-admin .layui-side .layui-nav { + width: 235px; + background-color: transparent; + -webkit-transition: width .3s; + transition: width .3s; +} + +.layui-layout-admin .layui-side > .layui-side-scroll > .layui-nav:first-child { + margin-top: 10px; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-item > a { + cursor: pointer; + padding-top: 5px; + padding-bottom: 5px; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-item a { + -webkit-transition: color .3s, background-color .3s; + transition: color .3s, background-color .3s; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-more { + right: 15px; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-item > .layui-nav-child { + position: static; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child a { + padding-left: 50px; + cursor: pointer; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child a { + padding-left: 70px; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child .layui-nav-child a { + padding-left: 90px; +} + +.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child .layui-nav-child .layui-nav-child a { + padding-left: 110px; +} + +/** //side end */ + +/** 折叠状态下样式 */ +@media screen and (min-width: 769px) { + /* header */ + .layui-layout-admin.admin-nav-mini .layui-header .layui-logo { + width: 60px; + } + + .layui-layout-admin.admin-nav-mini .layui-header .layui-logo cite { + display: none; + } + + .layui-layout-admin.admin-nav-mini .layui-header .layui-icon-shrink-right:before { + content: "\e66b"; + } + + /* body、footer */ + .layui-layout-admin.admin-nav-mini .layui-body, .layui-layout-admin.admin-nav-mini .layui-footer { + left: 60px; + } + + /* side */ + .layui-layout-admin.admin-nav-mini .layui-side, .layui-layout-admin.admin-nav-mini .layui-side .layui-nav { + width: 60px; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a { + overflow: visible; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a > cite, + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a .layui-nav-more, + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed > .layui-nav-child { + display: none !important; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav li.layui-nav-itemed > a { + background: rgba(0, 0, 0, .3); + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a > .layui-icon { + font-size: 16px; + -webkit-transition: font-size .3s; + transition: font-size .3s; + } + + /* 折叠状态下 side hover */ + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child { + position: fixed; + top: 60px; + left: 60px; + padding: 5px; + min-width: 150px; + display: block !important; + background: transparent !important; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + content: ''; + position: absolute; + right: 5px; + left: 5px; + bottom: 0; + top: 0; + border-radius: 4px; + background: #191a23; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child dd:first-child > .layui-nav-child { + margin-top: -5px; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child dd:last-child > .layui-nav-child.show-top { + margin-top: 5px; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child > dd > a { + padding: 0 20px !important; + } + + /* side hover 箭头 */ + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more { + border-color: transparent transparent transparent rgba(255, 255, 255, .7); + right: 7px; + margin-top: -6px; + } + + /* side hover arrow2、arrow3 */ + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav.arrow2 .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more, + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav.arrow3 .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more { + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + width: 6px; + height: 10px; + right: 10px; + margin-top: -5px; + font-weight: 600; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav.arrow2 .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more:before, + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav.arrow3 .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more:before { + content: "\e602"; + left: -4px; + top: -2px; + } + + .layui-layout-admin.admin-nav-mini .layui-side .layui-nav.arrow3 .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more:before { + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} + +/** //折叠状态下样式end */ + +/** admin移动端样式 */ +@media screen and (max-width: 768px) { + .layui-layout-admin { + left: -235px; + } + + .layui-layout-admin .layui-side, .layui-layout-admin .layui-header .layui-logo { + box-shadow: none !important; + } + + .layui-layout-admin .layui-header .layui-icon-shrink-right:before { + content: "\e66b"; + } + + /* 移动端展开 */ + .layui-layout-admin.admin-nav-mini { + left: 0; + right: -235px; + position: fixed; + } + + .layui-layout-admin.admin-nav-mini .layui-header .layui-icon-shrink-right:before { + content: "\e668"; + } + + .layui-layout-admin.admin-nav-mini .layui-side, .layui-layout-admin.admin-nav-mini .layui-header .layui-logo { + box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05); + } + + /* 移动端展开时遮罩层 */ + .layui-layout-admin.admin-nav-mini .site-mobile-shade { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 235px; + background-color: rgba(0, 0, 0, .25); + -webkit-transition: background-color .3s; + transition: background-color .3s; + cursor: pointer; + z-index: 1000; + } +} + +/** //移动端样式end */ + +/** side hover 进入动画 */ +.ew-anim-drop-in { + -webkit-animation: ewTransitionDropIn .3s ease-in-out; + animation: ewTransitionDropIn .3s ease-in-out; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +@-webkit-keyframes ewTransitionDropIn { + from { + opacity: 0; + -webkit-transform: scale(0.8); + } + to { + opacity: 1; + -webkit-transform: scale(1); + } +} + +@keyframes ewTransitionDropIn { + from { + opacity: 0; + transform: scale(0.8); + } + to { + opacity: 1; + transform: scale(1); + } +} + +/** //side hover 进入动画end */ + +/** layui nav tree */ +.layui-nav-tree .layui-nav-bar { + display: none; +} + +.layui-nav-tree > .layui-nav-item > a:before { + content: ""; + position: absolute; + top: 0; + left: 0; + bottom: 100%; + width: 4px; + background-color: #009688; + -webkit-transition: all .3s ease; + transition: all .3s ease; +} + +.layui-nav-tree > .layui-nav-item:hover > a:before { + bottom: 0; +} + +.layui-nav-tree .layui-nav-item a:hover { + background-color: transparent; +} + +.layui-nav-tree .layui-this > a:hover { + background-color: #009688; +} + +.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-this { + background: transparent; +} + +.layui-nav-tree .layui-nav-item .layui-nav-child { + padding: 5px 0; + background-color: rgba(0, 0, 0, .3) !important; +} + +/* 小三角改箭头 */ +.layui-nav-tree.arrow2 .layui-nav-more { + font-family: layui-icon !important; + font-size: 12px; + font-weight: 600; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow: hidden; + line-height: normal; + border: none; + margin: -3px 0 0 0; + padding: 0; + width: 10px; + height: 6px; + top: 50%; + display: inline-block; + -webkit-transition: all .3s ease; + transition: all .3s ease; +} + +.layui-nav-tree.arrow2 .layui-nav-more:before { + content: "\e61a"; + position: absolute; + right: -1px; + top: -4px; +} + +.layui-nav-tree.arrow2 .layui-nav-itemed > a > .layui-nav-more { + -ms-transform: rotate(-180deg); + -moz-transform: rotate(-180deg); + -webkit-transform: rotate(-180deg); + -o-transform: rotate(-180deg); + transform: rotate(-180deg); +} + +/* 小三角改加减号 */ +.layui-nav-tree.arrow3 .layui-nav-more { + font-family: layui-icon !important; + font-size: 12px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow: hidden; + line-height: normal; + border: none; + margin: -5px 0 0 0; + padding: 0; + width: 10px; + height: 10px; + top: 50%; + display: inline-block; + -webkit-transition: all .3s ease; + transition: all .3s ease; +} + +.layui-nav-tree.arrow3 .layui-nav-more:before { + content: "\e654"; + position: absolute; + top: -2px; + left: -1px; +} + +.layui-nav-tree.arrow3 .layui-nav-itemed > a > .layui-nav-more { + -ms-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +.layui-nav-tree.arrow3 .layui-nav-itemed > a > .layui-nav-more:before { + content: ''; + width: 8px; + height: 2px; + background-color: rgba(255, 255, 255, .7); + top: 4px; + left: 1px; + -ms-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} + +/** //layui nav tree end */ + +/** 多标签tab */ +.layui-layout-admin .layui-body > .layui-tab { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: 0; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-content { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 40px; + padding: 0; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-content > .layui-tab-item { + position: absolute; + bottom: 0; + right: 0; + top: 0; + left: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; + display: block; + visibility: hidden; + opacity: 0; + filter: Alpha(opacity=0); +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-content > .layui-tab-item.layui-show { + visibility: visible; + opacity: 1; + filter: Alpha(opacity=100); +} + +.layui-layout-admin.admin-side-flexible .layui-body > .layui-tab > .layui-tab-content > .layui-tab-item { + display: none; +} + +/* tab标题 */ +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title { + height: 40px; + line-height: 40px; + padding: 0 80px 0 40px; + background-color: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .1); + position: absolute; + top: 0; + left: 0; + right: 0; + border: none; + overflow: hidden; + -webkit-transition: none; + transition: none; + z-index: 998; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li { + min-width: auto; + max-width: 160px; + line-height: 40px; + padding: 0 30px 0 15px; + border-right: 1px solid #f6f6f6; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + -webkit-transition: background-color .2s; + transition: background-color .2s; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this, +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li:hover { + background-color: #f6f6f6; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + height: 2px; + border: none; + border-radius: 0; + background-color: #191a23; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li:first-child { + padding: 0 15px; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li cite { + font-style: normal; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title .layui-tab-bar { + display: none; +} + +/* tab关闭按钮 */ +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li .layui-tab-close { + width: 16px; + height: 16px; + line-height: 16px; + font-size: 12px; + border-radius: 50%; + position: absolute; + top: 12px; + right: 8px; + -webkit-transition: background-color .2s, color .2s; + transition: background-color .2s, color .2s; +} + +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li:first-child .layui-tab-close { + display: none; +} + +/* tab操作按钮 */ +.admin-tabs-control { + position: absolute; + top: 0; + width: 40px; + height: 40px; + line-height: 40px; + background-color: #fff; + border-left: 1px solid #f6f6f6; + -webkit-transition: background-color .2s; + transition: background-color .2s; + text-align: center; + cursor: pointer; + z-index: 998; +} + +.admin-tabs-control:hover { + background-color: #f6f6f6; +} + +.admin-tabs-control.layui-icon-prev { + left: 0; + border-left: none; + border-right: 1px solid #f6f6f6; +} + +.admin-tabs-control.layui-icon-next { + right: 40px; +} + +.admin-tabs-control.layui-icon-down { + right: 0; +} + +.admin-tabs-control > .layui-nav, .admin-tabs-control > .layui-nav .layui-nav-item { + position: absolute; + top: 0; + left: 0; + padding: 0; + width: 100%; + height: 100%; + background: transparent; +} + +.admin-tabs-control > .layui-nav .layui-nav-child { + right: 0; + top: 40px; + left: auto; +} + +.admin-tabs-control > .layui-nav .layui-nav-child a { + color: #595959; +} + +.admin-tabs-control > .layui-nav .layui-nav-bar, .admin-tabs-control > .layui-nav .layui-nav-more { + display: none; +} + +/** //多标签tab end */ + +/** 单标签标题 */ +.layui-body-header { + padding: 0 20px; + height: 40px; + line-height: 40px; + background-color: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .1); + box-sizing: border-box; + position: absolute; + left: 0; + right: 0; + z-index: 998; + display: none; +} + +.layui-body-header.show { + display: block; +} + +.layui-body-header-title { + padding-left: 6px; + border-left: 4px solid #009688; +} + +.layui-body-header.show + div { + position: absolute; + left: 0; + right: 0; + top: 40px; + bottom: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +/* 全局隐藏单标签标题 */ +.hide-body-title .layui-body-header.show { + display: none; +} + +.hide-body-title .layui-body-header.show + div { + top: 0; +} + +.layui-layout-admin .layui-body > .page-loading, +.layui-layout-admin .layui-body > .layui-tab > .layui-tab-content > .layui-tab-item > .page-loading, +.layui-layout-admin .layui-body > div > iframe[lay-id] + .page-loading { + z-index: 997; +} + +/** //单标签标题end */ + +/** 右侧弹窗 */ +.layui-layer.layui-layer-adminRight { + bottom: 0; + top: 50px !important; + border: none !important; + box-shadow: 1px 1px 50px rgba(0, 0, 0, .3) !important; + overflow: auto; +} + +.layui-layer.layui-layer-adminRight > .layui-layer-content, +.layui-layer.layui-layer-adminRight > .layui-layer-content > iframe { + height: 100% !important; +} + +.layui-layer.layui-layer-adminRight > .layui-layer-title + .layui-layer-content { + position: absolute; + top: 43px; + left: 0; + right: 0; + bottom: 0; + height: auto !important; +} + +.layui-anim-rl { + -webkit-animation-name: layui-rl; + animation-name: layui-rl; +} + +@-webkit-keyframes layui-rl { + from { + -webkit-transform: translate3d(100%, 0, 0); + } + to { + -webkit-transform: translate3d(0, 0, 0); + } +} + +@keyframes layui-rl { + from { + transform: translate3d(100%, 0, 0); + } + to { + transform: translate3d(0, 0, 0); + } +} + +.layui-anim-lr, .layui-anim-rl.layer-anim-close { + -webkit-animation-name: layui-lr; + animation-name: layui-lr +} + +@-webkit-keyframes layui-lr { + from { + -webkit-transform: translate3d(0, 0, 0); + opacity: 1 + } + to { + -webkit-transform: translate3d(100%, 0, 0); + opacity: 1 + } +} + +@keyframes layui-lr { + from { + transform: translate3d(0, 0, 0) + } + to { + transform: translate3d(100%, 0, 0) + } +} + +/** //右侧弹窗end */ + +/** admin风格弹窗 */ +.layui-layer.layui-layer-admin { + border: none !important; + box-shadow: 1px 1px 50px rgba(0, 0, 0, .3) !important; +} + +.layui-layer.layui-layer-admin .layui-layer-title { + color: #fff; + height: 50px; + line-height: 50px; + background-color: #191a23; + border: none; +} + +.layui-layer.layui-layer-admin .layui-layer-setwin { + top: 17px; +} + +.layui-layer.layui-layer-admin .layui-layer-setwin a { + color: #fff; + font-size: 16px; + font-style: normal; + font-family: layui-icon !important; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* 关闭按钮 */ +.layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-close1 { + background: none; + margin-top: -1px; +} + +.layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-close1:before { + content: "\1006"; +} + +/* 最小化按钮 */ +.layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-min cite { + background-color: #dddddd; +} + +/* 最大化按钮 */ +.layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-max { + font-size: 14px; + padding-top: 1px; + background: none; +} + +.layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-max:before { + content: "\e622"; +} + +.layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-maxmin:before { + content: "\e758"; +} + +/* 弹窗按钮 */ +.layui-layer.layui-layer-admin .layui-layer-btn { + padding-bottom: 15px; +} + +.layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #009688; + background-color: #009688; +} + +.layui-layer.layui-layer-admin .layui-layer-btn a { + height: 34px; + line-height: 34px; +} + +.layui-layer-admin { + max-width: 100%; +} + +.layui-layer-iframe .layui-layer-content { + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +/* 移动端两边留空白 */ +@media screen and (max-width: 768px) { + .layui-layer-admin { + max-width: 98%; + max-width: -webkit-calc(100% - 30px); + max-width: -moz-calc(100% - 30px); + max-width: calc(100% - 30px); + width: max-content; + left: 0 !important; + right: 0 !important; + margin: auto !important; + margin-bottom: 15px !important; + } + + .layui-layer-admin[area] { + max-width: 100%; + margin-bottom: 0 !important; + } +} + +/* msg样式 */ +body .layui-layer-msg { + border: none; + border-radius: 4px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); +} + +body .layui-layer-load { + background: transparent; +} + +/** //admin风格弹窗end */ + +/** loading */ +.page-loading { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 19891017; + background-color: #fff; +} + +body > .page-loading { + position: fixed; + background-color: #f5f7f9; +} + +.layui-layout-admin > .layui-body > .layui-tab > .layui-tab-content > .layui-tab-item > .page-loading, +.layui-layout-admin > .layui-body > .page-loading, +.layui-layout-admin > .layui-body > div > iframe[lay-id] + .page-loading { + background-color: #f5f7f9; +} + +.layui-layout-admin > .layui-body > .layui-body-header.show + div + .page-loading { + top: 40px; + height: auto; +} + +.page-no-scroll { + overflow-x: hidden !important; + overflow-y: hidden !important; + min-height: 80px; +} + +.rubik-loader, .ball-loader, .signal-loader, .layui-loader { + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.ball-loader > span, .signal-loader > span { + background-color: #4aca85; + display: inline-block; +} + +.ball-loader > span:nth-child(1), .ball-loader.sm > span:nth-child(1), .signal-loader > span:nth-child(1), .signal-loader.sm > span:nth-child(1) { + -webkit-animation-delay: 0s; + animation-delay: 0s; +} + +.ball-loader > span:nth-child(2), .ball-loader.sm > span:nth-child(2), .signal-loader > span:nth-child(2), .signal-loader.sm > span:nth-child(2) { + -webkit-animation-delay: 0.1s; + animation-delay: 0.1s; +} + +.ball-loader > span:nth-child(3), .ball-loader.sm > span:nth-child(3), .signal-loader > span:nth-child(3), .signal-loader.sm > span:nth-child(3) { + -webkit-animation-delay: 0.15s; + animation-delay: 0.15s; +} + +.ball-loader > span:nth-child(4), .ball-loader.sm > span:nth-child(4), .signal-loader > span:nth-child(4), .signal-loader.sm > span:nth-child(4) { + -webkit-animation-delay: 0.2s; + animation-delay: 0.2s; +} + +/* 魔方loading */ +.rubik-loader { + width: 64px; + height: 64px; + background-image: url(img/ic_loading.gif); + background-repeat: no-repeat; + background-position: center; + background-size: contain; +} + +.rubik-loader.sm { + width: 50px; + height: 50px; +} + +/* 球形loading */ +.ball-loader > span { + width: 20px; + height: 20px; + margin: 0 3px; + border-radius: 50%; + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation: 1s ball-load ease-in-out infinite; + animation: ball-load 1s ease-in-out infinite; +} + +@-webkit-keyframes ball-load { + 0% { + -webkit-transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + } + 100% { + -webkit-transform: scale(0); + } +} + +@keyframes ball-load { + 0% { + transform: scale(0); + } + 50% { + transform: scale(1); + } + 100% { + transform: scale(0); + } +} + +.ball-loader.sm > span { + width: 15px; + height: 15px; + margin: 0 2px; +} + +/* 信号loading */ +.signal-loader { + width: 50px; + height: 22px; +} + +.signal-loader > span { + width: 8px; + height: 0; + position: absolute; + bottom: 0; + left: 0; + margin: 0; + -webkit-animation: signal-load 1s infinite; + animation: signal-load 1s infinite; +} + +.signal-loader > span:nth-child(2) { + left: 14px; +} + +.signal-loader > span:nth-child(3) { + left: 28px; +} + +.signal-loader > span:nth-child(4) { + left: 42px; +} + +@-webkit-keyframes signal-load { + 0% { + height: 0; + } + 50% { + height: 22px; + } + 100% { + height: 0; + } +} + +@keyframes signal-load { + 0% { + height: 0; + } + 50% { + height: 22px; + } + 100% { + height: 0; + } +} + +/* 信号loading小型 */ +.signal-loader.sm { + width: 32px; + height: 15px; +} + +.signal-loader.sm > span { + width: 5px; + -webkit-animation: signal-load-sm 1s infinite; + animation: signal-load-sm 1s infinite; +} + +.signal-loader.sm > span:nth-child(2) { + left: 9px; +} + +.signal-loader.sm > span:nth-child(3) { + left: 18px; +} + +.signal-loader.sm > span:nth-child(4) { + left: 27px; +} + +@-webkit-keyframes signal-load-sm { + 0% { + height: 0; + } + 50% { + height: 15px; + } + 100% { + height: 0; + } +} + +@keyframes signal-load-sm { + 0% { + height: 0; + } + 50% { + height: 15px; + } + 100% { + height: 0; + } +} + +/* 简洁风格loading */ +.layui-loader .layui-icon { + font-size: 36px; + color: #bbb; +} + +.layui-loader.sm .layui-icon { + font-size: 30px; +} + +/** //loading end */ + +/** 组件样式 */ +/* toolbar */ +.layui-form.toolbar .layui-form-item, +.layui-form.toolbar .layui-form-item .layui-inline > .layui-input-inline { + margin-bottom: 0; +} + +.layui-form.toolbar .layui-form-item .layui-inline { + margin-bottom: 10px; +} + +.toolbar + .layui-table, .layui-card-body > .layui-table, +.toolbar + table + .layui-table-view, .layui-card-body > .layui-table-view, +.toolbar + table + .ew-tree-table { + margin: 0; +} + +.mr0, .layui-form.toolbar .layui-form-item .layui-inline > .layui-input-inline { + margin-right: 0 !important; +} + +.w-auto { + width: auto !important; +} + +/* form */ +.model-form { + padding: 25px 30px 0 0; +} + +.model-form.no-padding { + padding: 0; +} + +.model-form .model-form-body { + overflow-y: auto; + padding: 25px 30px 0 0; + max-height: calc(100vh - 180px); +} + +.model-form.no-padding .model-form-footer { + padding-top: 10px; + padding-right: 30px; +} + +.layui-form.model-form > .layui-form-item:last-child { + margin-bottom: 0; + padding-bottom: 20px; +} + +.layui-form-required:before { + content: "*"; + display: inline-block; + font-family: SimSun; + margin-right: 4px; + font-size: 14px; + line-height: 1; + color: #ed4014; +} + +.layui-input, .layui-textarea { + color: #595959; +} + +.layui-form-select .layui-input { + padding-right: 0; +} + +.layui-form-select-top .layui-form-select > dl { + top: auto; + bottom: 42px; +} + +.ew-select-fixed .layui-form-selected dl { + position: fixed; + min-width: auto; + bottom: auto; + right: auto; +} + +body .layui-form-checked[lay-skin=primary] i, +body .layui-form-checked[lay-skin=primary]:hover i { + color: #fff; +} + +body .layui-form-checkbox[lay-skin=primary] span, +body .layui-form-checkbox[lay-skin=primary]:hover span { + background-color: transparent; +} + +body .layui-form-danger + .layui-form-select .layui-input, +body .layui-input.layui-form-danger:focus, +body .layui-textarea.layui-form-danger:focus { + border-color: #FF5722 !important; +} + +body .layui-laypage input.layui-input { + height: 30px; + line-height: 30px; +} + +body .layui-table-page .layui-laypage input.layui-input { + height: 26px; + line-height: 26px; +} + +body .layui-form-onswitch em { + margin-left: 3px; + margin-right: 18px; +} + +/* button */ +.layui-btn { + -webkit-transition: background-color .2s; + transition: background-color .2s; +} + +body .layui-btn.layui-btn-radius { + border-radius: 100px; +} + +.layui-btn-primary { + color: #595959; + border-color: #e6e6e6; +} + +.layui-btn-primary:hover { + border-color: #BBBBBB; +} + +.layui-btn-group .layui-btn-primary:hover { + border-color: #e6e6e6; +} + +.layui-btn-group .layui-btn-primary:first-child { + border-left: 1px solid #e6e6e6; +} + +body .layui-btn.layui-btn-disabled, +body .layui-transfer-active .layui-btn.layui-btn-disabled { + background-color: #FBFBFB !important; + border-color: #e6e6e6 !important; + color: #C9C9C9 !important; +} + +body .layui-btn.layui-btn-primary { + background-color: #fff; +} + +body .layui-btn.layui-btn-normal { + background-color: #1E9FFF; +} + +body .layui-btn.layui-btn-warm { + background-color: #FFB800; +} + +body .layui-btn.layui-btn-danger { + background-color: #FF5722; +} + +.layui-btn-group > .layui-btn + .layui-btn { + border-radius: 0; +} + +.layui-btn-group > .layui-btn:last-child { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +/* 解决穿梭框受主题的影响 */ +body .layui-transfer-active .layui-btn { + background-color: #5FB878 !important; + border-color: #5FB878 !important; + color: #fff !important; +} + +/* 圆形按钮 */ +.btn-circle { + width: 50px; + height: 50px; + line-height: 50px; + border-radius: 50%; + background: #009688; + position: fixed; + right: 15px; + bottom: 15px; + color: #ffffff; + text-align: center; + box-shadow: 0 0 8px rgba(0, 0, 0, .2); + cursor: pointer; +} + +.btn-circle:hover { + color: #fff; + opacity: .8; +} + +.btn-circle .layui-icon { + font-size: 24px; +} + +/* 组件加图标 */ +.icon-date, .date-icon { + background-image: url(img/icon_date.png); + background-repeat: no-repeat; + background-position: right center; + padding-right: 28px; +} + +.icon-search { + background-image: url(img/icon_search.png); + background-repeat: no-repeat; + background-position: right center; + padding-right: 26px; +} + +span.icon-text > .layui-icon, a.icon-text > .layui-icon, .layui-form-label.icon-text > .layui-icon { + font-size: 14px; + margin: 0 2px; +} + +.layui-btn.icon-btn { + padding: 0 10px; +} + +.layui-btn.layui-btn-sm.icon-btn { + padding: 0 6px; +} + +/* 辅助样式 */ +.bg-white, html.bg-white > body { + background-color: white; +} + +[ew-href], [lay-tips] { + cursor: pointer; +} + +.inline-block { + display: inline-block; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-primary, .layui-link { + color: #009688 !important;; +} + +.text-success { + color: #5FB878 !important;; +} + +.text-warning { + color: #FFB800 !important;; +} + +.text-danger { + color: #FF5722 !important; +} + +.text-info { + color: #01AAED !important;; +} + +.text-muted { + color: #c2c2c2 !important;; +} + +.layui-text a:not(.layui-btn) { + color: #2d8cf0; + cursor: pointer; +} + +.layui-text a:not(.layui-btn):hover { + text-decoration: none; +} + +.ew-console-wrapper .layui-card { + box-shadow: none; + border-radius: 4px; +} + +.layui-card-header { + color: #595959; +} + +.lay-big-font { + font-size: 36px; + line-height: 36px; + padding: 5px 0 10px; + overflow: hidden; + white-space: nowrap; + word-break: break-all; + text-overflow: ellipsis; +} + +/* 隐藏滚动条 */ +.no-scrollbar { + overflow-x: hidden !important; + overflow-y: hidden !important; +} + +/* 输入框禁用样式 */ +input.layui-disabled, input.layui-disabled:hover, textarea.layui-disabled, textarea.layui-disabled:hover { + color: #595959 !important; + background-color: #f6f6f6; +} + +.layui-input::-webkit-input-placeholder, .layui-textarea::-webkit-input-placeholder { + color: #ccc; +} + +.layui-input::-moz-placeholder, .layui-textarea::-moz-placeholder { + color: #ccc; +} + +.layui-input::-ms-input-placeholder, .layui-textarea::-ms-input-placeholder { + color: #ccc; +} + +/* 下拉菜单 */ +.dropdown-menu { + display: inline-block; +} + +.dropdown-menu .dropdown-menu-nav { + display: none; +} + +.dropdown-menu + .dropdown-menu, .layui-btn + .dropdown-menu, .dropdown-menu + .layui-btn { + margin-left: 10px; +} + +/** //组件样式end */ + +/** 滚动条样式 */ +::-webkit-scrollbar { + width: 10px; + height: 10px; + background: transparent; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + border-radius: 5px; + background-color: #C1C1C1; +} + +::-webkit-scrollbar-thumb:hover { + background-color: #A8A8A8; +} + +.mini-bar::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +.mini-bar::-webkit-scrollbar-thumb { + border-radius: 3px; +} + +@media screen and (max-width: 768px) { + ::-webkit-scrollbar { + width: 4px; + height: 4px; + } + + ::-webkit-scrollbar-thumb { + border-radius: 0; + } +} + +/** //滚动条样式end */ + +/** 地图选择位置弹窗 */ +#ew-map-select-map { + height: 450px; +} + +#ew-map-select-pois { + height: 450px; + overflow-x: hidden; + overflow-y: auto; +} + +.ew-map-select-search-list-item { + padding: 10px 30px 10px 15px; + border-bottom: 1px solid #e8e8e8; + cursor: pointer; + position: relative; +} + +.ew-map-select-search-list-item:hover { + background: #F2F2F2; +} + +.ew-map-select-search-list-item:last-child { + border-bottom: none; +} + +.ew-map-select-search-list-item .ew-map-select-search-list-item-title { + font-size: 14px; + color: #262626; +} + +.ew-map-select-search-list-item .ew-map-select-search-list-item-address { + font-size: 12px; + color: #595959; + padding-top: 5px; +} + +.ew-map-select-search-list-item-icon-ok { + position: absolute; + right: 15px; + top: 50%; + transform: translateY(-50%); +} + +.ew-map-select-search-list-item-icon-ok .layui-icon { + color: #3B74FF; +} + +.ew-map-select-tool { + padding: 5px 15px; + box-shadow: 0 1px 0 0 rgba(0, 0, 0, .05); +} + +#ew-map-select-center-img { + position: absolute; + bottom: 50%; + left: 50%; + width: 26px; + margin-left: -13px; +} + +#ew-map-select-center-img2 { + position: absolute; + left: 50%; + top: 50%; + font-size: 12px; + display: inline-block; + margin-left: -6px; + margin-top: -7px; + color: #3B74FF; +} + +.bounceInDown { + animation: bounceInDown 500ms; + animation-direction: alternate; + -webkit-animation: bounceInDown 500ms; + -webkit-animation-direction: alternate +} + +@-webkit-keyframes bounceInDown { + 0%, 60%, 75%, 90%, to { + -webkit-transition-timing-function: cubic-bezier(.215, .61, .355, 1); + } + 0%, to { + -webkit-transform: translate3d(0, 0, 0); + } + 25% { + -webkit-transform: translate3d(0, -30px, 0); + } + 50% { + -webkit-transform: translate3d(0, -15px, 0); + } + 75% { + -webkit-transform: translate3d(0, -4px, 0); + } +} + +@keyframes bounceInDown { + 0%, 60%, 75%, 90%, to { + transition-timing-function: cubic-bezier(.215, .61, .355, 1) + } + 0%, to { + transform: translate3d(0, 0, 0) + } + 25% { + transform: translate3d(0, -10px, 0) + } + 50% { + transform: translate3d(0, -20px, 0) + } + 75% { + transform: translate3d(0, -10px, 0) + } +} + +#ew-map-select-tips { + position: absolute; + z-index: 999; + background: #fff; + max-height: 430px; + overflow: auto; + top: 48px; + left: 56px; + width: 280px; + box-shadow: 0 2px 4px rgba(0, 0, 0, .12); + border: 1px solid #d2d2d2; +} + +#ew-map-select-tips .ew-map-select-search-list-item { + padding: 10px 15px 10px 35px; +} + +.ew-map-select-search-list-item-icon-search { + position: absolute; + left: 10px; + top: 50%; + transform: translateY(-50%); +} + +.ew-map-select-search-list-item-icon-search .layui-icon { + color: #8c8c8c; +} + +/** //地图选择位置弹窗end */ + +/** 表格头部工具栏迷你样式 */ +.table-tool-mini .layui-table-view { + position: relative; +} + +.table-tool-mini .layui-table-tool { + position: absolute; + min-height: unset; + height: auto; + padding: 3px 10px; + width: auto; + top: -38px; + right: -1px; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + border: 1px solid #e6e6e6; + border-bottom: none; +} + +.table-tool-mini .layui-table-tool .layui-table-tool-temp { + padding-right: 0; + display: inline-block; +} + +.table-tool-mini .layui-table-tool .layui-table-tool-self { + position: static; + display: inline-block; +} + +.table-tool-mini .layui-table-tool .layui-table-tool-self .layui-inline[lay-event]:first-child { + margin: 0; +} + +/* full-table mini toolbar */ +.table-tool-mini.full-table .layui-table-tool { + top: -35px; + height: 1px; + padding: 0 10px; + background: transparent; + border: none; +} + +.table-tool-mini.full-table .layui-table-tool:before { + content: ""; + position: absolute; + top: -3px; + right: 0; + left: 0; + height: 36px; + background-color: #f2f2f2; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + border: 1px solid #e6e6e6; + border-bottom: none; +} + +/** //表格头部工具栏迷你样式end */ + +/** laydate自适应 */ +@media screen and (max-width: 768px) { + .layui-laydate-range { + left: 0 !important; + top: 0 !important; + right: 0 !important; + margin: 10px auto !important; + max-width: 95%; + } + + .layui-laydate-range .layui-laydate-main, .layui-laydate-range .layui-laydate-content table { + width: 100%; + } + + .layui-laydate-range .laydate-main-list-0 .laydate-next-m, .layui-laydate-range .laydate-main-list-0 .laydate-next-y, .layui-laydate-range .laydate-main-list-1 .laydate-prev-m, .layui-laydate-range .laydate-main-list-1 .laydate-prev-y { + display: inline-block !important; + } + + .layui-laydate-range .laydate-main-list-1 .layui-laydate-header { + border-top: 1px solid #e2e2e2; + } + + .layui-laydate-range .laydate-main-list-1 .layui-laydate-content { + border-left: none !important; + } + + .layui-laydate-range .laydate-time-list ol li { + padding-left: 0 !important; + text-align: center; + } + + .layui-laydate-range .laydate-time-list ol { + overflow: auto !important; + } +} + +/** //laydate自适应end */ + +/** tree展开箭头朝下 */ +.layui-tree-spread > div > div > span > .layui-tree-iconArrow:after { + border-color: #c0c4cc transparent transparent transparent; + top: 6px; + left: 0; +} + +.layui-tree .layui-tree-iconArrow:after { + transition: none; +} + +/** //tree展开箭头朝下end */ + +/** 数据表格内checkbox */ +.ew-tb-cell-ck .layui-form-checkbox[lay-skin=primary] { + padding-left: 22px; +} + +.ew-tb-cell-ck .layui-form-checkbox[lay-skin=primary] span { + padding-right: 5px; +} + +/** //数据表格内checkbox end */ + +/** 字段集嵌套数据表格 */ +.ew-field-group > .layui-elem-field { + border-bottom: none; + margin: 0; +} + +.ew-field-group > .ew-field-box { + border: 1px solid #e6e6e6; + padding: 10px 15px; + border-top: none; +} + +body .layui-elem-quote.layui-quote-nm { + border-color: #e6e6e6; +} + +/** //字段集嵌套数据表格end */ + +/** 选项卡样式优化 */ +.layui-card > .layui-tab-brief > .layui-tab-title li { + padding: 0 5px; + margin: 0 10px; + line-height: 43px; + height: 43px; + transition: color .2s; + -webkit-transition: color .2s; +} + +.layui-card > .layui-tab-brief > .layui-tab-title li:after { + height: 43px; +} + +.layui-card > .layui-tab-brief > .layui-tab-title { + border-bottom-color: #f6f6f6; + height: 42px; + transition: none; + -webkit-transition: none; +} + +.layui-card > .layui-tab-brief > .layui-tab-content { + padding: 10px 15px; +} + +/** 垂直选项卡 */ +.layui-tab.layui-tab-vertical { + position: relative; +} + +.layui-tab.layui-tab-vertical:after { + content: ""; + clear: both; + display: block; +} + +.layui-tab.layui-tab-vertical > .layui-tab-title { + width: 130px; + height: auto; + border: none; + border-right: 1px solid #E9E9E9; + box-sizing: border-box; + padding: 10px 0; + float: left; +} + +.layui-tab.layui-tab-vertical > .layui-tab-title > li { + display: block; + margin-right: -1px; + border-right: 2px solid transparent; + white-space: normal; + line-height: normal; + padding: 10px 20px; + text-align: right; +} + +.layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-right: 2px solid #5FB878; + color: #5FB878; +} + +.layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this:after { + display: none; +} + +.layui-tab.layui-tab-vertical > .layui-tab-title > li > .layui-icon { + font-size: 14px; + margin-right: 5px; +} + +.layui-tab.layui-tab-vertical > .layui-tab-content { + margin-left: 130px; +} + +.layui-tab.layui-tab-vertical.layui-tab-vertical-right > .layui-tab-title { + float: right; + border-right: none; + border-left: 1px solid #E9E9E9; +} + +.layui-tab.layui-tab-vertical.layui-tab-vertical-right > .layui-tab-content { + margin-left: 0; + margin-right: 130px; +} + +.layui-tab.layui-tab-vertical.layui-tab-vertical-right > .layui-tab-title > li { + text-align: left; + border-left: 2px solid transparent; + border-right: none; +} + +.layui-tab.layui-tab-vertical.layui-tab-vertical-right > .layui-tab-title > li.layui-this { + border-left: 2px solid #5FB878; +} + +.layui-tab.layui-tab-vertical.layui-tab-vertical-full > .layui-tab-title { + position: absolute; + top: 0; + left: 0; + right: auto; + min-height: 100%; +} + +.layui-tab.layui-tab-vertical.layui-tab-vertical-right.layui-tab-vertical-full > .layui-tab-title { + right: 0; + left: auto; +} + +/** //垂直选项卡end */ + +/** 按钮加载中状态 */ +.ew-btn-loading { + opacity: .8; + pointer-events: none; + font-size: 0 !important; +} + +.ew-btn-loading * { + display: none !important; +} + +.ew-btn-loading > .ew-btn-loading-text { + font-size: 14px !important; + display: inline-block !important; +} + +.ew-btn-loading.layui-btn-sm > .ew-btn-loading-text, .ew-btn-loading.layui-btn-xs > .ew-btn-loading-text { + font-size: 12px !important; +} + +.ew-btn-loading.layui-btn-lg > .ew-btn-loading-text { + font-size: 16px !important; +} + +.ew-btn-loading > .ew-btn-loading-text * { + display: inline-block !important; +} + +/** //按钮加载中状态end */ + +/** 搜索展开更多 */ +.form-search-expand, .form-search-expand:hover { + padding: 0 !important; + color: #2d8cf0 !important; + border: none !important; + box-shadow: none !important; + background-color: transparent !important; +} + +.form-search-expand .layui-icon { + font-size: 12px !important; + font-weight: 600 !important; +} + +.form-search-show-expand { + display: none !important; +} + +/** //搜索展开更多 */ + +/** 徽章扩展样式 */ +.layui-badge-green { + color: #52c41a; + background: #f6ffed; + border: 1px solid #b7eb8f; +} + +.layui-badge-blue { + color: #1890ff; + background: #e6f7ff; + border: 1px solid #91d5ff; +} + +.layui-badge-red { + color: #f5222d; + background: #fff1f0; + border: 1px solid #ffa39e; +} + +.layui-badge-yellow { + color: #faad14; + background: #fffbe6; + border: 1px solid #ffe58f; +} + +.layui-badge-gray { + color: #8c8c8c; + background: #fafafa; + border: 1px solid #ccc; +} + +.layui-badge { + height: 20px; + line-height: 19px; + box-sizing: border-box; +} + +.layui-badge-list .layui-badge { + height: 23px; + line-height: 22px; + margin: 0 6px 8px 0; +} + +.layui-badge-list .layui-badge.layui-bg-gray { + border: 1px solid #ccc; + background-color: #fafafa !important; +} + +.layui-card .layui-card-header .layui-badge.pull-right { + top: 50%; + margin-top: -10px; +} + +/** //徽章扩展样式end */ + +/* 锁屏 */ +#ew-lock-screen-group { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 19891099; +} + +/** ios下iframe兼容 */ +.ios-iframe-body { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +/** xmSelect样式优化 */ +xm-select > .xm-body { + margin-left: -2px; +} + +xm-select > .xm-body .xm-option { + background-color: transparent !important; +} + +xm-select > .xm-body .xm-option.hide-icon.selected { + background-color: #5FB878 !important; +} + +xm-select > .xm-body .xm-option:hover { + background-color: #f2f2f2 !important; +} + +.xm-body .xm-tree { + min-width: 200px; +} + +.xm-body .xm-tree .xm-option-content { + padding-left: 6px; +} + +xm-select { + border-color: #e6e6e6 !important; +} + +xm-select:hover { + border-color: #D2D2D2 !important; +} + +xm-select[style="border-color: rgb(229, 77, 66);"] { + border-color: rgb(229, 77, 66) !important; +} + +body .ew-xmselect-tree xm-select .xm-body .xm-option .xm-option-icon { + position: absolute; + left: 30px; + top: 0; + right: 0; + bottom: 0; + width: auto; + height: auto; + border: none !important; + z-index: 1; +} + +body .ew-xmselect-tree xm-select .xm-body .xm-option .xm-option-icon:before { + display: none; +} + +body .ew-xmselect-tree xm-select .xm-body .xm-option.selected { + background-color: #f2f2f2 !important; +} + +body .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #5FB878 !important; +} + +/** //xmSelect样式优化end */ + +/** ---------------------------蓝色主题start----------------------------------- */ +/* logo */ +.theme-blue .layui-layout-admin .layui-header .layui-logo { + color: #fff; + box-shadow: none; + background-color: transparent; +} + +/* header */ +.theme-blue .layui-layout-admin .layui-header { + background-color: #3C8DBC; +} + +.theme-blue .layui-layout-admin .layui-header a { + color: #fff; +} + +.theme-blue .layui-layout-admin .layui-header a:hover { + color: #fff; +} + +.theme-blue .layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; +} + +.theme-blue .layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #eee transparent transparent; +} + +.theme-blue .layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #eee; +} + +.theme-blue .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-blue .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #fff; +} + +/* side */ +.theme-blue .layui-layout-admin .layui-side { + background-color: #222D32; +} + +.theme-blue .layui-side .layui-nav .layui-nav-item a { + color: #b8c7ce; +} + +.theme-blue .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-blue .layui-nav-tree .layui-this > a, +.theme-blue .layui-nav-tree .layui-this > a:hover { + color: #fff; + background-color: #3C8DBC; +} + +.theme-blue .layui-nav-tree > .layui-nav-item > a:before { + background-color: #3C8DBC; +} + +.theme-blue .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #222D32 !important; +} + +/* body tab */ +.theme-blue .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #3C8DBC; + top: 38px; +} + +/* body title */ +.theme-blue .layui-body-header-title { + border-left-color: #3C8DBC; +} + +/* admin dialog */ +.theme-blue .layui-layer.layui-layer-admin .layui-layer-title { + background-color: #3C8DBC; +} + +.theme-blue .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #3C8DBC; + background-color: #3C8DBC; +} + +/* other */ +.theme-blue .ball-loader > span, +.theme-blue .signal-loader > span { + background-color: #3C8DBC; +} + +.theme-blue .btn-circle { + background: #3C8DBC; +} + +.theme-blue .more-theme-item:hover, +.theme-blue .more-theme-item.active { + border-color: #3C8DBC; +} + +.theme-blue .text-primary, +.theme-blue .layui-link { + color: #3C8DBC !important; +} + +/* button */ +.theme-blue .layui-btn { + background-color: #3C8DBC; +} + +/* switch */ +.theme-blue .layui-form-onswitch { + border-color: #3C8DBC; + background-color: #3C8DBC; +} + +/* radio */ +.theme-blue .layui-form-radio > i:hover, +.theme-blue .layui-form-radioed > i, +.theme-blue .layui-form-checked i, +.theme-blue .layui-form-checked:hover i { + color: #3C8DBC; +} + +/* checkbox */ +.theme-blue .layui-form-checked[lay-skin=primary] i, +.theme-blue .layui-form-checked span, +.theme-blue .layui-form-checked:hover span { + border-color: #3C8DBC !important; + background-color: #3C8DBC; +} + +.theme-blue .layui-form-checked[lay-skin=primary] i:hover, +.theme-blue .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #3C8DBC !important; +} + +/* select */ +.theme-blue .layui-form-select dl dd.layui-this { + background-color: #3C8DBC; +} + +/* laypage */ +.theme-blue .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #3C8DBC; +} + +.theme-blue .layui-laypage input:focus, +.theme-blue .layui-laypage select:focus { + border-color: #3C8DBC !important; +} + +.theme-blue .layui-laypage a:hover { + color: #3C8DBC; +} + +/* tab */ +.theme-blue .layui-tab-brief > .layui-tab-title .layui-this { + color: #3C8DBC; +} + +.theme-blue .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-blue .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #3C8DBC !important; +} + +.theme-blue .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #3C8DBC; + color: #3C8DBC; +} + +/* breadcrumb */ +.theme-blue .layui-breadcrumb a:hover { + color: #3C8DBC !important; +} + +/* laydate */ +.theme-blue .layui-laydate-footer span:hover, +.theme-blue .layui-laydate-header i:hover, +.theme-blue .layui-laydate-header span:hover { + color: #3C8DBC; +} + +.theme-blue .layui-laydate .layui-this { + background-color: #3C8DBC !important; +} + +.theme-blue .layui-laydate-content td.laydate-selected { + background-color: rgba(60, 141, 188, .1); +} + +.theme-blue .laydate-selected:hover { + background-color: rgba(60, 141, 188, .1) !important; +} + +/* timeline */ +.theme-blue .layui-timeline-axis { + color: #3C8DBC; +} + +/* transfer */ +.theme-blue .layui-transfer-active .layui-btn { + background-color: #3C8DBC !important; + border-color: #3C8DBC !important; +} + +/* progress-bar */ +.theme-blue .layui-progress-bar { + background-color: #3C8DBC; +} + +/* slider */ +.theme-blue .layui-slider-bar { + background-color: #3C8DBC !important; +} + +.theme-blue .layui-slider-wrap-btn { + border-color: #3C8DBC !important; +} + +/* steps */ +.theme-blue .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #3C8DBC; +} + +.theme-blue .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-blue .layui-elem-quote { + border-color: #3C8DBC; +} + +.theme-blue .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-blue .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #3C8DBC; +} + +.theme-blue .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #9DC6DD; +} + +.theme-blue .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #3C8DBC; +} + +.theme-blue .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #9DC6DD !important; +} + +.theme-blue .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #3C8DBC !important; +} + +/* cascader */ +.theme-blue .ew-cascader-dropdown-list-item.active, +.theme-blue .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #3C8DBC; +} + +/* tagsinput */ +.theme-blue div.tagsinput span.tag { + background: #3C8DBC; +} + +/* xmSelect */ +.theme-blue xm-select .xm-body .xm-option .xm-option-icon { + border-color: #3C8DBC !important; +} + +.theme-blue xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-blue xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-blue .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #3C8DBC !important; +} + +.theme-blue xm-select .xm-label .xm-label-block, +.theme-blue xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #3C8DBC !important; +} + +/* city-select */ +.theme-blue .city-select a.active { + color: #fff !important; + background-color: #3C8DBC !important; +} + +.theme-blue .city-select a:hover, +.theme-blue .city-select a:focus { + background-color: rgba(60, 141, 188, .1); + color: #3C8DBC; +} + +.theme-blue .city-picker-span > .title > span:hover { + background-color: rgba(60, 141, 188, .1); +} + +.theme-blue .city-select-tab > a.active { + color: #3C8DBC; +} + +/** ---------------------------蓝色主题end----------------------------------- */ + +/** ---------------------------绿色主题start----------------------------------- */ +/* logo */ +.theme-green .layui-layout-admin .layui-header .layui-logo { + color: #fff; + box-shadow: none; + background-color: transparent; +} + +/* header */ +.theme-green .layui-layout-admin .layui-header { + background-color: #00A65A; +} + +.theme-green .layui-layout-admin .layui-header a { + color: #fff; +} + +.theme-green .layui-layout-admin .layui-header a:hover { + color: #fff; +} + +.theme-green .layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; +} + +.theme-green .layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #eee transparent transparent; +} + +.theme-green .layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #eee; +} + +.theme-green .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-green .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #fff; +} + +/* side */ +.theme-green .layui-layout-admin .layui-side { + background-color: #222D32; +} + +.theme-green .layui-side .layui-nav .layui-nav-item a { + color: #b8c7ce; +} + +.theme-green .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-green .layui-nav-tree .layui-this > a, +.theme-green .layui-nav-tree .layui-this > a:hover { + color: #fff; + background-color: #00A65A; +} + +.theme-green .layui-nav-tree > .layui-nav-item > a:before { + background-color: #00A65A; +} + +.theme-green .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #222D32 !important; +} + +/* body tab */ +.theme-green .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #00A65A; + top: 38px; +} + +/* body title */ +.theme-green .layui-body-header-title { + border-left-color: #00A65A; +} + +/* admin dialog */ +.theme-green .layui-layer.layui-layer-admin .layui-layer-title { + background-color: #00A65A; +} + +.theme-green .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #00A65A; + background-color: #00A65A; +} + +/* other */ +.theme-green .more-theme-item:hover, +.theme-green .more-theme-item.active { + border-color: #00A65A; +} + +.theme-green .btn-circle { + background: #00A65A; +} + +.theme-green .ball-loader > span, +.theme-green .signal-loader > span { + background-color: #00A65A; +} + +.theme-green .text-primary, +.theme-green .layui-link { + color: #00A65A !important; +} + +/* button */ +.theme-green .layui-btn { + background-color: #00A65A; +} + +/* switch */ +.theme-green .layui-form-onswitch { + border-color: #00A65A; + background-color: #00A65A; +} + +/* radio */ +.theme-green .layui-form-radio > i:hover, +.theme-green .layui-form-radioed > i, +.theme-green .layui-form-checked i, +.theme-green .layui-form-checked:hover i { + color: #00A65A; +} + +/* checkbox */ +.theme-green .layui-form-checked[lay-skin=primary] i, +.theme-green .layui-form-checked span, +.theme-green .layui-form-checked:hover span { + border-color: #00A65A !important; + background-color: #00A65A; +} + +.theme-green .layui-form-checked[lay-skin=primary] i:hover, +.theme-green .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #00A65A !important; +} + +/* select */ +.theme-green .layui-form-select dl dd.layui-this { + background-color: #00A65A; +} + +/* laypage */ +.theme-green .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #00A65A; +} + +.theme-green .layui-laypage input:focus, +.theme-green .layui-laypage select:focus { + border-color: #00A65A !important; +} + +.theme-green .layui-laypage a:hover { + color: #00A65A; +} + +/* tab */ +.theme-green .layui-tab-brief > .layui-tab-title .layui-this { + color: #00A65A; +} + +.theme-green .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-green .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #00A65A !important; +} + +.theme-green .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #00A65A; + color: #00A65A; +} + +/* breadcrumb */ +.theme-green .layui-breadcrumb a:hover { + color: #00A65A !important; +} + +/* laydate */ +.theme-green .layui-laydate-footer span:hover, +.theme-green .layui-laydate-header i:hover, +.theme-green .layui-laydate-header span:hover { + color: #00A65A; +} + +.theme-green .layui-laydate .layui-this { + background-color: #00A65A !important; +} + +.theme-green .layui-laydate-content td.laydate-selected { + background-color: rgba(0, 166, 90, .1); +} + +.theme-green .laydate-selected:hover { + background-color: rgba(0, 166, 90, .1) !important; +} + +/* timeline */ +.theme-green .layui-timeline-axis { + color: #00A65A; +} + +/* transfer */ +.theme-green .layui-transfer-active .layui-btn { + background-color: #00A65A !important; + border-color: #00A65A !important; +} + +/* progress-bar */ +.theme-green .layui-progress-bar { + background-color: #00A65A; +} + +/* slider */ +.theme-green .layui-slider-bar { + background-color: #00A65A !important; +} + +.theme-green .layui-slider-wrap-btn { + border-color: #00A65A !important; +} + +/* steps */ +.theme-green .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #00A65A; +} + +.theme-green .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-green .layui-elem-quote { + border-color: #00A65A; +} + +.theme-green .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-green .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #00A65A; +} + +.theme-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #7FD2AC; +} + +.theme-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #00A65A; +} + +.theme-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #7FD2AC !important; +} + +.theme-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #00A65A !important; +} + +/* cascader */ +.theme-green .ew-cascader-dropdown-list-item.active, +.theme-green .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #00A65A; +} + +/* tagsinput */ +.theme-green div.tagsinput span.tag { + background: #00A65A; +} + +/* xmSelect */ +.theme-green xm-select .xm-body .xm-option .xm-option-icon { + border-color: #00A65A !important; +} + +.theme-green xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-green xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-green .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #00A65A !important; +} + +.theme-green xm-select .xm-label .xm-label-block, +.theme-green xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #00A65A !important; +} + +/* city-select */ +.theme-green .city-select a.active { + color: #fff !important; + background-color: #00A65A !important; +} + +.theme-green .city-select a:hover, +.theme-green .city-select a:focus { + background-color: rgba(0, 166, 90, .1); + color: #00A65A; +} + +.theme-green .city-picker-span > .title > span:hover { + background-color: rgba(0, 166, 90, .1); +} + +.theme-green .city-select-tab > a.active { + color: #00A65A; +} + +/** ---------------------------绿色主题end----------------------------------- */ + +/** ---------------------------紫色主题start----------------------------------- */ +/* logo */ +.theme-purple .layui-layout-admin .layui-header .layui-logo { + color: #fff; + box-shadow: none; + background-color: transparent; +} + +/* header */ +.theme-purple .layui-layout-admin .layui-header { + background-color: #722ed1; +} + +.theme-purple .layui-layout-admin .layui-header a { + color: #fff; +} + +.theme-purple .layui-layout-admin .layui-header a:hover { + color: #fff; +} + +.theme-purple .layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; +} + +.theme-purple .layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #eee transparent transparent; +} + +.theme-purple .layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #eee; +} + +.theme-purple .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-purple .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #fff; +} + +/* side */ +.theme-purple .layui-layout-admin .layui-side { + background-color: #222D32; +} + +.theme-purple .layui-side .layui-nav .layui-nav-item a { + color: #b8c7ce; +} + +.theme-purple .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-purple .layui-nav-tree .layui-this > a, +.theme-purple .layui-nav-tree .layui-this > a:hover { + color: #fff; + background-color: #722ed1; +} + +.theme-purple .layui-nav-tree > .layui-nav-item > a:before { + background-color: #722ed1; +} + +.theme-purple .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #222D32 !important; +} + +/* body tab */ +.theme-purple .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #722ed1; + top: 38px; +} + +/* body title */ +.theme-purple .layui-body-header-title { + border-left-color: #722ed1; +} + +/* admin dialog */ +.theme-purple .layui-layer.layui-layer-admin .layui-layer-title { + background-color: #722ed1; +} + +.theme-purple .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #722ed1; + background-color: #722ed1; +} + +/* other */ +.theme-purple .more-theme-item:hover, +.theme-purple .more-theme-item.active { + border-color: #722ed1; +} + +.theme-purple .btn-circle { + background: #722ed1; +} + +.theme-purple .ball-loader > span, +.theme-purple .signal-loader > span { + background-color: #722ed1; +} + +.theme-purple .text-primary, +.theme-purple .layui-link { + color: #722ed1 !important; +} + +/* button */ +.theme-purple .layui-btn { + background-color: #722ed1; +} + +/* switch */ +.theme-purple .layui-form-onswitch { + border-color: #722ed1; + background-color: #722ed1; +} + +/* radio */ +.theme-purple .layui-form-radio > i:hover, +.theme-purple .layui-form-radioed > i, +.theme-purple .layui-form-checked i, +.theme-purple .layui-form-checked:hover i { + color: #722ed1; +} + +/* checkbox */ +.theme-purple .layui-form-checked[lay-skin=primary] i, +.theme-purple .layui-form-checked span, +.theme-purple .layui-form-checked:hover span { + border-color: #722ed1 !important; + background-color: #722ed1; +} + +.theme-purple .layui-form-checked[lay-skin=primary] i:hover, +.theme-purple .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #722ed1 !important; +} + +/* select */ +.theme-purple .layui-form-select dl dd.layui-this { + background-color: #722ed1; +} + +/* laypage */ +.theme-purple .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #722ed1; +} + +.theme-purple .layui-laypage input:focus, +.theme-purple .layui-laypage select:focus { + border-color: #722ed1 !important; +} + +.theme-purple .layui-laypage a:hover { + color: #722ed1; +} + +/* tab */ +.theme-purple .layui-tab-brief > .layui-tab-title .layui-this { + color: #722ed1; +} + +.theme-purple .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-purple .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #722ed1 !important; +} + +.theme-purple .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #722ed1; + color: #722ed1; +} + +/* breadcrumb */ +.theme-purple .layui-breadcrumb a:hover { + color: #722ed1 !important; +} + +/* laydate */ +.theme-purple .layui-laydate-footer span:hover, +.theme-purple .layui-laydate-header i:hover, +.theme-purple .layui-laydate-header span:hover { + color: #722ed1; +} + +.theme-purple .layui-laydate .layui-this { + background-color: #722ed1 !important; +} + +.theme-purple .layui-laydate-content td.laydate-selected { + background-color: rgba(114, 46, 209, .1); +} + +.theme-purple .laydate-selected:hover { + background-color: rgba(114, 46, 209, .1) !important; +} + +/* timeline */ +.theme-purple .layui-timeline-axis { + color: #722ed1; +} + +/* transfer */ +.theme-purple .layui-transfer-active .layui-btn { + background-color: #722ed1 !important; + border-color: #722ed1 !important; +} + +/* progress-bar */ +.theme-purple .layui-progress-bar { + background-color: #722ed1; +} + +/* slider */ +.theme-purple .layui-slider-bar { + background-color: #722ed1 !important; +} + +.theme-purple .layui-slider-wrap-btn { + border-color: #722ed1 !important; +} + +/* steps */ +.theme-purple .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #722ed1; +} + +.theme-purple .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-purple .layui-elem-quote { + border-color: #722ed1; +} + +.theme-purple .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-purple .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #722ed1; +} + +.theme-purple .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #B896E8; +} + +.theme-purple .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #722ed1; +} + +.theme-purple .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #B896E8 !important; +} + +.theme-purple .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #722ed1 !important; +} + +/* cascader */ +.theme-purple .ew-cascader-dropdown-list-item.active, +.theme-purple .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #722ed1; +} + +/* tagsinput */ +.theme-purple div.tagsinput span.tag { + background: #722ed1; +} + +/* xmSelect */ +.theme-purple xm-select .xm-body .xm-option .xm-option-icon { + border-color: #722ed1 !important; +} + +.theme-purple xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-purple xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-purple .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #722ed1 !important; +} + +.theme-purple xm-select .xm-label .xm-label-block, +.theme-purple xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #722ed1 !important; +} + +/* city-select */ +.theme-purple .city-select a.active { + color: #fff !important; + background-color: #722ed1 !important; +} + +.theme-purple .city-select a:hover, +.theme-purple .city-select a:focus { + background-color: rgba(114, 46, 209, .1); + color: #722ed1; +} + +.theme-purple .city-picker-span > .title > span:hover { + background-color: rgba(114, 46, 209, .1); +} + +.theme-purple .city-select-tab > a.active { + color: #722ed1; +} + +/** ---------------------------紫色主题end----------------------------------- */ + +/** ---------------------------红色主题start----------------------------------- */ +/* logo */ +.theme-red .layui-layout-admin .layui-header .layui-logo { + color: #fff; + box-shadow: none; + background-color: transparent; +} + +/* header */ +.theme-red .layui-layout-admin .layui-header { + background-color: #DD4B39; +} + +.theme-red .layui-layout-admin .layui-header a { + color: #fff; +} + +.theme-red .layui-layout-admin .layui-header a:hover { + color: #fff; +} + +.theme-red .layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; +} + +.theme-red .layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #eee transparent transparent; +} + +.theme-red .layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #eee; +} + +.theme-red .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-red .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #fff; +} + +/* side */ +.theme-red .layui-layout-admin .layui-side { + background-color: #28333E; +} + +.theme-red .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-red .layui-nav-tree .layui-this > a, +.theme-red .layui-nav-tree .layui-this > a:hover { + background-color: #DD4B39; +} + +.theme-red .layui-nav-tree > .layui-nav-item > a:before { + background-color: #DD4B39; +} + +.theme-red .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #28333E !important; +} + +/* body tab */ +.theme-red .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #DD4B39; + top: 38px; +} + +/* body title */ +.theme-red .layui-body-header-title { + border-left-color: #DD4B39; +} + +/* admin dialog */ +.theme-red .layui-layer.layui-layer-admin .layui-layer-title { + background-color: #DD4B39; +} + +.theme-red .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #DD4B39; + background-color: #DD4B39; +} + +/* other */ +.theme-red .more-theme-item:hover, +.theme-red .more-theme-item.active { + border-color: #DD4B39; +} + +.theme-red .btn-circle { + background: #DD4B39; +} + +.theme-red .ball-loader > span, +.theme-red .signal-loader > span { + background-color: #DD4B39; +} + +.theme-red .text-primary, +.theme-red .layui-link { + color: #DD4B39 !important; +} + +/* button */ +.theme-red .layui-btn { + background-color: #DD4B39; +} + +/* switch */ +.theme-red .layui-form-onswitch { + border-color: #DD4B39; + background-color: #DD4B39; +} + +/* radio */ +.theme-red .layui-form-radio > i:hover, +.theme-red .layui-form-radioed > i, +.theme-red .layui-form-checked i, +.theme-red .layui-form-checked:hover i { + color: #DD4B39; +} + +/* checkbox */ +.theme-red .layui-form-checked[lay-skin=primary] i, +.theme-red .layui-form-checked span, +.theme-red .layui-form-checked:hover span { + border-color: #DD4B39 !important; + background-color: #DD4B39; +} + +.theme-red .layui-form-checked[lay-skin=primary] i:hover, +.theme-red .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #DD4B39 !important; +} + +/* select */ +.theme-red .layui-form-select dl dd.layui-this { + background-color: #DD4B39; +} + +/* laypage */ +.theme-red .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #DD4B39; +} + +.theme-red .layui-laypage input:focus, +.theme-red .layui-laypage select:focus { + border-color: #DD4B39 !important; +} + +.theme-red .layui-laypage a:hover { + color: #DD4B39; +} + +/* tab */ +.theme-red .layui-tab-brief > .layui-tab-title .layui-this { + color: #DD4B39; +} + +.theme-red .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-red .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #DD4B39 !important; +} + +.theme-red .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #DD4B39; + color: #DD4B39; +} + +/* breadcrumb */ +.theme-red .layui-breadcrumb a:hover { + color: #DD4B39 !important; +} + +/* laydate */ +.theme-red .layui-laydate-footer span:hover, +.theme-red .layui-laydate-header i:hover, +.theme-red .layui-laydate-header span:hover { + color: #DD4B39; +} + +.theme-red .layui-laydate .layui-this { + background-color: #DD4B39 !important; +} + +.theme-red .layui-laydate-content td.laydate-selected { + background-color: rgba(221, 75, 57, .1); +} + +.theme-red .laydate-selected:hover { + background-color: rgba(221, 75, 57, .1) !important; +} + +/* timeline */ +.theme-red .layui-timeline-axis { + color: #DD4B39; +} + +/* transfer */ +.theme-red .layui-transfer-active .layui-btn { + background-color: #DD4B39 !important; + border-color: #DD4B39 !important; +} + +/* progress-bar */ +.theme-red .layui-progress-bar { + background-color: #DD4B39; +} + +/* slider */ +.theme-red .layui-slider-bar { + background-color: #DD4B39 !important; +} + +.theme-red .layui-slider-wrap-btn { + border-color: #DD4B39 !important; +} + +/* steps */ +.theme-red .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #DD4B39; +} + +.theme-red .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-red .layui-elem-quote { + border-color: #DD4B39; +} + +.theme-red .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-red .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #DD4B39; +} + +.theme-red .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #EEA39A; +} + +.theme-red .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #DD4B39; +} + +.theme-red .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #EEA39A !important; +} + +.theme-red .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #DD4B39 !important; +} + +/* cascader */ +.theme-red .ew-cascader-dropdown-list-item.active, +.theme-red .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #DD4B39; +} + +/* tagsinput */ +.theme-red div.tagsinput span.tag { + background: #DD4B39; +} + +/* xmSelect */ +.theme-red xm-select .xm-body .xm-option .xm-option-icon { + border-color: #DD4B39 !important; +} + +.theme-red xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-red xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-red .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #DD4B39 !important; +} + +.theme-red xm-select .xm-label .xm-label-block, +.theme-red xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #DD4B39 !important; +} + +/* city-select */ +.theme-red .city-select a.active { + color: #fff !important; + background-color: #DD4B39 !important; +} + +.theme-red .city-select a:hover, +.theme-red .city-select a:focus { + background-color: rgba(221, 75, 57, .1); + color: #DD4B39; +} + +.theme-red .city-picker-span > .title > span:hover { + background-color: rgba(221, 75, 57, .1); +} + +.theme-red .city-select-tab > a.active { + color: #DD4B39; +} + +/** ---------------------------红色主题end----------------------------------- */ + +/** ---------------------------藏青主题start----------------------------------- */ +/* logo */ +.theme-cyan .layui-layout-admin .layui-header .layui-logo { + background-color: #001529; +} + +/* header */ +.theme-cyan .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-cyan .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #001529; +} + +/* side */ +.theme-cyan .layui-layout-admin .layui-side { + background-color: #001529; +} + +.theme-cyan .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-cyan .layui-nav-tree .layui-this > a, +.theme-cyan .layui-nav-tree .layui-this > a:hover { + background-color: #1890ff; +} + +.theme-cyan .layui-nav-tree > .layui-nav-item > a:before { + background-color: #1890FF; +} + +.theme-cyan .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #001529 !important; +} + +/* body tab */ +.theme-cyan .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #001529; +} + +/* body title */ +.theme-cyan .layui-body-header-title { + border-left-color: #1890FF; +} + +/* admin dialog */ +.theme-cyan .layui-layer.layui-layer-admin { + border-radius: 4px; +} + +.theme-cyan .layui-layer.layui-layer-admin .layui-layer-title { + color: #333; + font-size: 16px; + padding-left: 23px; + background-color: #fff; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #f1f1f1; +} + +.theme-cyan .layui-layer.layui-layer-admin .layui-layer-setwin a { + color: #8c8c8c; + font-weight: 600; +} + +.theme-cyan .layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-min cite { + background-color: #8c8c8c; +} + +.theme-cyan .layui-layer.layui-layer-admin .layui-layer-btn a { + height: 32px; + line-height: 32px; + border-radius: 4px; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-cyan .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #1890FF; + background-color: #1890FF; +} + +/* other */ +.theme-cyan .more-theme-item:hover, +.theme-cyan .more-theme-item.active { + border-color: #1890FF; +} + +.theme-cyan .btn-circle { + background: #1890FF; +} + +.theme-cyan .ball-loader > span, +.theme-cyan .signal-loader > span { + background-color: #1890FF; +} + +.theme-cyan .text-primary, +.theme-cyan .layui-link { + color: #1890FF !important; +} + +/* button */ +.theme-cyan .layui-btn { + height: 36px; + line-height: 36px; + border-radius: 4px; + background-color: #1890FF; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-cyan .layui-btn-lg { + height: 42px; + line-height: 42px; +} + +.theme-cyan .layui-btn-sm { + height: 28px; + line-height: 28px; +} + +.theme-cyan .layui-btn-xs { + height: 22px; + line-height: 22px; +} + +/* input */ +.theme-cyan .layui-input, +.theme-cyan .layui-select, +.theme-cyan .layui-textarea, +.theme-cyan xm-select { + height: 36px; + border-radius: 4px; +} + +.theme-cyan .layui-input:focus, +.theme-cyan .layui-textarea:focus, +.theme-cyan xm-select:hover { + border-color: #40a9ff !important; +} + +/* form */ +.theme-cyan .layui-form-label, +.theme-cyan .layui-form-mid { + padding-top: 8px; + padding-bottom: 8px; +} + +.theme-cyan .layui-input-block { + min-height: 36px; +} + +.theme-cyan .layui-form-radio { + margin-top: 4px; +} + +/* switch */ +.theme-cyan .layui-form-onswitch { + border-color: #1890FF; + background-color: #1890FF; +} + +/* radio */ +.theme-cyan .layui-form-radio > i:hover, +.theme-cyan .layui-form-radioed > i, +.theme-cyan .layui-form-checked i, +.theme-cyan .layui-form-checked:hover i { + color: #1890FF; +} + +/* checkbox */ +.theme-cyan .layui-form-checked[lay-skin=primary] i, +.theme-cyan .layui-form-checked span, +.theme-cyan .layui-form-checked:hover span { + border-color: #1890FF !important; + background-color: #1890FF; +} + +.theme-cyan .layui-form-checked[lay-skin=primary] i:hover, +.theme-cyan .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #1890FF !important; +} + +/* select */ +.theme-cyan .layui-form-select dl dd.layui-this { + background-color: #1890FF; +} + +/* laypage */ +.theme-cyan .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #1890FF; +} + +.theme-cyan .layui-laypage input:focus, +.theme-cyan .layui-laypage select:focus { + border-color: #1890FF !important; +} + +.theme-cyan .layui-laypage a:hover { + color: #1890FF; +} + +/* tab */ +.theme-cyan .layui-tab-brief > .layui-tab-title .layui-this { + color: #1890FF; +} + +.theme-cyan .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-cyan .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #1890FF !important; +} + +.theme-cyan .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #2d8cf0; + color: #2d8cf0; +} + +/* breadcrumb */ +.theme-cyan .layui-breadcrumb a:hover { + color: #1890FF !important; +} + +/* laydate */ +.theme-cyan .layui-laydate-footer span:hover, +.theme-cyan .layui-laydate-header i:hover, +.theme-cyan .layui-laydate-header span:hover { + color: #1890FF; +} + +.theme-cyan .layui-laydate .layui-this { + background-color: #1890FF !important; +} + +.theme-cyan .layui-laydate-content td.laydate-selected { + background-color: rgba(24, 144, 255, .1); +} + +.theme-cyan .laydate-selected:hover { + background-color: rgba(24, 144, 255, .1) !important; +} + +/* timeline */ +.theme-cyan .layui-timeline-axis { + color: #1890FF; +} + +/* transfer */ +.theme-cyan .layui-transfer-active .layui-btn { + background-color: #1890FF !important; + border-color: #1890FF !important; +} + +/* progress-bar */ +.theme-cyan .layui-progress-bar { + background-color: #1890FF; +} + +/* slider */ +.theme-cyan .layui-slider-bar { + background-color: #1890FF !important; +} + +.theme-cyan .layui-slider-wrap-btn { + border-color: #1890FF !important; +} + +/* steps */ +.theme-cyan .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #1890FF; +} + +.theme-cyan .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-cyan .layui-elem-quote { + border-color: #1890FF; +} + +.theme-cyan .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-cyan .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #1890FF; +} + +.theme-cyan .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #89C6FF; +} + +.theme-cyan .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #1890FF; +} + +.theme-cyan .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #89C6FF !important; +} + +.theme-cyan .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #1890FF !important; +} + +/* cascader */ +.theme-cyan .ew-cascader-dropdown-list-item.active, +.theme-cyan .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #1890FF; +} + +/* tagsinput */ +.theme-cyan div.tagsinput span.tag { + background: #1890FF; +} + +/* xmSelect */ +.theme-cyan xm-select .xm-body .xm-option .xm-option-icon { + border-color: #1890FF !important; +} + +.theme-cyan xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-cyan xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-cyan .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #1890FF !important; +} + +.theme-cyan xm-select .xm-label .xm-label-block, +.theme-cyan xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #1890FF !important; +} + +/* city-select */ +.theme-cyan .city-select a.active { + color: #fff !important; + background-color: #1890FF !important; +} + +.theme-cyan .city-select a:hover, +.theme-cyan .city-select a:focus { + background-color: #f0faff; + color: #1890FF; +} + +.theme-cyan .city-picker-span > .title > span:hover { + background-color: #f0faff; +} + +.theme-cyan .city-select-tab > a.active { + color: #1890FF; +} + +/** ---------------------------藏青主题end----------------------------------- */ + +/** ---------------------------白色主题start----------------------------------- */ +/* logo */ +.theme-white .layui-layout-admin .layui-header .layui-logo { + color: #262626; + background-color: transparent; + box-shadow: 2px 8px 8px 0 rgba(29, 35, 41, .05); +} + +/* header */ +.theme-white .layui-layout-admin .layui-header { + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); +} + +.theme-white .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-white .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #2d8cf0; +} + +/* side */ +.theme-white .layui-layout-admin .layui-side { + background-color: #fff; + box-shadow: 2px 8px 8px 0 rgba(29, 35, 41, .05); +} + +.theme-white .layui-side .layui-nav .layui-nav-item a { + color: #595959; +} + +.theme-white .layui-side .layui-nav .layui-nav-item a:hover { + color: #2d8cf0; +} + +.theme-white .layui-side .layui-nav-itemed > a, +.theme-white .layui-side .layui-nav-tree .layui-nav-title a, +.theme-white .layui-side .layui-nav-tree .layui-nav-title a:hover { + color: #595959 !important; +} + +.theme-white .layui-side .layui-nav-itemed > a:hover { + color: #2d8cf0 !important; +} + +.theme-white .layui-side .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-white .layui-side .layui-nav-tree .layui-this > a, +.theme-white .layui-side .layui-nav-tree .layui-this > a:hover { + color: #2d8cf0; + background: #f0faff; + border-right: 2px solid #2d8cf0; +} + +.theme-white .layui-side .layui-nav-tree .layui-nav-item .layui-nav-child { + background-color: transparent !important; +} + +.theme-white .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #fff !important; +} + +@media screen and (min-width: 769px) { + .theme-white .layui-layout-admin.admin-nav-mini .layui-side .layui-nav li.layui-nav-itemed > a { + background: #f0faff; + color: #2d8cf0 !important; + } +} + +.theme-white .layui-nav-tree > .layui-nav-item > a:before { + display: none; +} + +/* side arrow */ +.theme-white .layui-side .layui-nav .layui-nav-more { + border-color: rgba(89, 89, 89, .7) transparent transparent; +} + +.theme-white .layui-side .layui-nav .layui-nav-mored, +.theme-white .layui-side .layui-nav-itemed > a .layui-nav-more { + border-color: transparent transparent rgba(89, 89, 89, .7); +} + +.theme-white .layui-side .layui-nav-tree.arrow3 .layui-nav-itemed > a > .layui-nav-more:before { + background-color: rgba(89, 89, 89, .7); +} + +@media screen and (min-width: 769px) { + .theme-white .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more { + border-color: transparent transparent transparent rgba(89, 89, 89, .7); + } +} + +/* body tab */ +.theme-white .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title { + top: 8px; + right: 8px; + height: 32px; + line-height: 32px; + box-sizing: border-box; + background-color: transparent; + box-shadow: -4px 4px 0 #f5f7f9; + padding-right: 70px; +} + +.theme-white .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li { + border: none; + margin-right: 6px; + border-radius: 4px; + background-color: #fff; + line-height: 32px; + height: 32px; +} + +.theme-white .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this { + color: #2d8cf0; + background-color: #fff; +} + +.theme-white .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li:hover { + background-color: #fff; +} + +.theme-white .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + display: none; +} + +.theme-white .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li .layui-tab-close, +.theme-white .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li .layui-tab-close:hover { + top: 8px; + color: #8c8c8c; + background-color: transparent; +} + +.theme-white .layui-layout-admin .layui-body .admin-tabs-control, +.theme-white .layui-layout-admin .layui-body .admin-tabs-control:hover { + top: 8px; + height: 32px; + line-height: 32px; + background-color: #f5f7f9; + border: none; +} + +.theme-white .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-down { + border-radius: 4px; + background-color: #fff; + width: 32px; + right: 8px; +} + +.theme-white .admin-tabs-control > .layui-nav .layui-nav-item { + line-height: 32px; +} + +.theme-white .admin-tabs-control > .layui-nav .layui-nav-item > a { + height: 32px; + width: 32px; + padding: 0; +} + +.theme-white .admin-tabs-control > .layui-nav .layui-nav-child { + top: 36px; + border: none; + border-radius: 4px; + box-shadow: 0 1px 6px rgba(0, 0, 0, .2); +} + +.theme-white .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-prev:before { + content: "\e603"; +} + +.theme-white .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-next:before { + content: "\e602"; +} + +/* body title */ +.theme-white .layui-body-header-title { + border-left-color: #2d8cf0; +} + +.theme-white .layui-body-header { + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); +} + +/* admin dialog */ +.theme-white .layui-layer.layui-layer-admin { + border-radius: 4px; +} + +.theme-white .layui-layer.layui-layer-admin .layui-layer-title { + color: #262626; + font-size: 16px; + padding-left: 23px; + background-color: #fff; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #f1f1f1; +} + +.theme-white .layui-layer.layui-layer-admin .layui-layer-setwin a { + color: #8c8c8c; + font-weight: 600; +} + +.theme-white .layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-min cite { + background-color: #8c8c8c; +} + +.theme-white .layui-layer.layui-layer-admin .layui-layer-btn a { + height: 32px; + line-height: 32px; + border-radius: 4px; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-white .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #2d8cf0; + background-color: #2d8cf0; +} + +/* other */ +.theme-white .more-theme-item:hover, +.theme-white .more-theme-item.active { + border-color: #2d8cf0; +} + +.theme-white .btn-circle { + background: #2d8cf0; +} + +.theme-white .ball-loader > span, +.theme-white .signal-loader > span { + background-color: #2d8cf0; +} + +.theme-white .text-primary, +.theme-white .layui-link { + color: #2d8cf0 !important;; +} + +.theme-white .layui-card { + border-radius: 4px; + box-shadow: none; +} + +/* button */ +.theme-white .layui-btn { + height: 36px; + line-height: 36px; + border-radius: 4px; + background-color: #2d8cf0; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-white .layui-btn-lg { + height: 42px; + line-height: 42px; +} + +.theme-white .layui-btn-sm { + height: 28px; + line-height: 28px; +} + +.theme-white .layui-btn-xs { + height: 22px; + line-height: 22px; +} + +/* input */ +.theme-white .layui-input, +.theme-white .layui-select, +.theme-white .layui-textarea, +.theme-white xm-select { + height: 36px; + border-radius: 4px; +} + +.theme-white .layui-input:focus, +.theme-white .layui-textarea:focus, +.theme-white xm-select:hover { + border-color: #2d8cf0 !important; +} + +/* form */ +.theme-white .layui-form-label, +.theme-white .layui-form-mid { + padding-top: 8px; + padding-bottom: 8px; +} + +.theme-white .layui-input-block { + min-height: 36px; +} + +.theme-white .layui-form-radio { + margin-top: 4px; +} + +/* switch */ +.theme-white .layui-form-onswitch { + border-color: #2d8cf0; + background-color: #2d8cf0; +} + +/* radio */ +.theme-white .layui-form-radio > i:hover, +.theme-white .layui-form-radioed > i, +.theme-white .layui-form-checked i, +.theme-white .layui-form-checked:hover i { + color: #2d8cf0; +} + +/* checkbox */ +.theme-white .layui-form-checked[lay-skin=primary] i, +.theme-white .layui-form-checked span, +.theme-white .layui-form-checked:hover span { + border-color: #2d8cf0 !important; + background-color: #2d8cf0; +} + +.theme-white .layui-form-checked[lay-skin=primary] i:hover, +.theme-white .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #2d8cf0 !important; +} + +/* select */ +.theme-white .layui-form-select dl dd.layui-this { + background-color: #2d8cf0; +} + +/* laypage */ +.theme-white .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #2d8cf0; +} + +.theme-white .layui-laypage input:focus, +.theme-white .layui-laypage select:focus { + border-color: #2d8cf0 !important; +} + +.theme-white .layui-laypage a:hover { + color: #2d8cf0; +} + +/* tab */ +.theme-white .layui-tab-brief > .layui-tab-title .layui-this { + color: #2d8cf0; +} + +.theme-white .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-white .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #2d8cf0 !important; +} + +.theme-white .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #2d8cf0; + color: #2d8cf0; +} + +/* breadcrumb */ +.theme-white .layui-breadcrumb a:hover { + color: #2d8cf0 !important; +} + +/* laydate */ +.theme-white .layui-laydate-footer span:hover, +.theme-white .layui-laydate-header i:hover, +.theme-white .layui-laydate-header span:hover { + color: #2d8cf0; +} + +.theme-white .layui-laydate .layui-this { + background-color: #2d8cf0 !important; +} + +.theme-white .layui-laydate-content td.laydate-selected { + background-color: rgba(45, 140, 240, .1); +} + +.theme-white .laydate-selected:hover { + background-color: rgba(45, 140, 240, .1) !important; +} + +/* timeline */ +.theme-white .layui-timeline-axis { + color: #2d8cf0; +} + +/* transfer */ +.theme-white .layui-transfer-active .layui-btn { + background-color: #2d8cf0 !important; + border-color: #2d8cf0 !important; +} + +/* progress-bar */ +.theme-white .layui-progress-bar { + background-color: #2d8cf0; +} + +/* slider */ +.theme-white .layui-slider-bar { + background-color: #2d8cf0 !important; +} + +.theme-white .layui-slider-wrap-btn { + border-color: #2d8cf0 !important; +} + +/* steps */ +.theme-white .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #2d8cf0; +} + +.theme-white .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-white .layui-elem-quote { + border-color: #2d8cf0; +} + +.theme-white .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-white .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #2d8cf0; +} + +.theme-white .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #95C5F7; +} + +.theme-white .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #2d8cf0; +} + +.theme-white .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #95C5F7 !important; +} + +.theme-white .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #2d8cf0 !important; +} + +/* cascader */ +.theme-white .ew-cascader-dropdown-list-item.active, +.theme-white .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #2d8cf0; +} + +/* tagsinput */ +.theme-white div.tagsinput span.tag { + background: #2d8cf0; +} + +/* xmSelect */ +.theme-white xm-select .xm-body .xm-option .xm-option-icon { + border-color: #2d8cf0 !important; +} + +.theme-white xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-white xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-white .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #2d8cf0 !important; +} + +.theme-white xm-select .xm-label .xm-label-block, +.theme-white xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #2d8cf0 !important; +} + +/* city-select */ +.theme-white .city-select a.active { + color: #fff !important; + background-color: #2d8cf0 !important; +} + +.theme-white .city-select a:hover, +.theme-white .city-select a:focus { + background-color: #f0faff; + color: #2d8cf0; +} + +.theme-white .city-picker-span > .title > span:hover { + background-color: #f0faff; +} + +.theme-white .city-select-tab > a.active { + color: #2d8cf0; +} + +/** ---------------------------白色主题end----------------------------------- */ + +/** ---------------------------粉色主题start----------------------------------- */ +/* logo */ +.theme-pink .layui-layout-admin .layui-header .layui-logo { + color: #262626; + background-color: transparent; + box-shadow: 2px 8px 8px 0 rgba(29, 35, 41, .05); +} + +/* header */ +.theme-pink .layui-layout-admin .layui-header { + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); +} + +.theme-pink .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-pink .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #FB7299; +} + +/* side */ +.theme-pink .layui-layout-admin .layui-side { + background-color: #fff; + box-shadow: 2px 8px 8px 0 rgba(29, 35, 41, .05); +} + +.theme-pink .layui-side .layui-nav .layui-nav-item a { + color: #595959; +} + +.theme-pink .layui-side .layui-nav .layui-nav-item a:hover { + color: #FB7299; +} + +.theme-pink .layui-side .layui-nav-itemed > a, +.theme-pink .layui-side .layui-nav-tree .layui-nav-title a, +.theme-pink .layui-side .layui-nav-tree .layui-nav-title a:hover { + color: #595959 !important; +} + +.theme-pink .layui-side .layui-nav-itemed > a:hover { + color: #FB7299 !important; +} + +.theme-pink .layui-side .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-pink .layui-side .layui-nav-tree .layui-this > a, +.theme-pink .layui-side .layui-nav-tree .layui-this > a:hover { + color: #FB7299; + background: #FFF7F9; + border-right: 2px solid #FB7299; +} + +.theme-pink .layui-side .layui-nav-tree .layui-nav-item .layui-nav-child { + background-color: transparent !important; +} + +.theme-pink .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #fff !important; +} + +@media screen and (min-width: 769px) { + .theme-pink .layui-layout-admin.admin-nav-mini .layui-side .layui-nav li.layui-nav-itemed > a { + background: #FFF1F5; + color: #FB7299 !important; + } +} + +.theme-pink .layui-nav-tree > .layui-nav-item > a:before { + display: none; +} + +/* side arrow */ +.theme-pink .layui-side .layui-nav .layui-nav-more { + border-color: rgba(89, 89, 89, .7) transparent transparent; +} + +.theme-pink .layui-side .layui-nav .layui-nav-mored, +.theme-pink .layui-side .layui-nav-itemed > a .layui-nav-more { + border-color: transparent transparent rgba(89, 89, 89, .7); +} + +.theme-pink .layui-side .layui-nav-tree.arrow3 .layui-nav-itemed > a > .layui-nav-more:before { + background-color: rgba(89, 89, 89, .7); +} + +@media screen and (min-width: 769px) { + .theme-pink .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more { + border-color: transparent transparent transparent rgba(89, 89, 89, .7); + } +} + +/* body tab */ +.theme-pink .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title { + top: 8px; + right: 8px; + height: 32px; + line-height: 32px; + box-sizing: border-box; + background-color: transparent; + box-shadow: -4px 4px 0 #f5f7f9; + padding-right: 70px; +} + +.theme-pink .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li { + border: none; + margin-right: 6px; + border-radius: 4px; + background-color: #fff; + line-height: 32px; + height: 32px; +} + +.theme-pink .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this { + color: #FB7299; + background-color: #fff; +} + +.theme-pink .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li:hover { + background-color: #fff; +} + +.theme-pink .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + display: none; +} + +.theme-pink .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li .layui-tab-close, +.theme-pink .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li .layui-tab-close:hover { + top: 8px; + color: #8c8c8c; + background-color: transparent; +} + +.theme-pink .layui-layout-admin .layui-body .admin-tabs-control, +.theme-pink .layui-layout-admin .layui-body .admin-tabs-control:hover { + top: 8px; + height: 32px; + line-height: 32px; + background-color: #f5f7f9; + border: none; +} + +.theme-pink .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-down { + border-radius: 4px; + background-color: #fff; + width: 32px; + right: 8px; +} + +.theme-pink .admin-tabs-control > .layui-nav .layui-nav-item { + line-height: 32px; +} + +.theme-pink .admin-tabs-control > .layui-nav .layui-nav-item > a { + height: 32px; + width: 32px; + padding: 0; +} + +.theme-pink .admin-tabs-control > .layui-nav .layui-nav-child { + top: 36px; + border: none; + border-radius: 4px; + box-shadow: 0 1px 6px rgba(0, 0, 0, .2); +} + +.theme-pink .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-prev:before { + content: "\e603"; +} + +.theme-pink .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-next:before { + content: "\e602"; +} + +/* body title */ +.theme-pink .layui-body-header-title { + border-left-color: #FB7299; +} + +.theme-pink .layui-body-header { + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); +} + +/* admin dialog */ +.theme-pink .layui-layer.layui-layer-admin { + border-radius: 4px; +} + +.theme-pink .layui-layer.layui-layer-admin .layui-layer-title { + color: #262626; + font-size: 16px; + padding-left: 23px; + background-color: #fff; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #f1f1f1; +} + +.theme-pink .layui-layer.layui-layer-admin .layui-layer-setwin a { + color: #8c8c8c; + font-weight: 600; +} + +.theme-pink .layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-min cite { + background-color: #8c8c8c; +} + +.theme-pink .layui-layer.layui-layer-admin .layui-layer-btn a { + height: 32px; + line-height: 32px; + border-radius: 4px; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-pink .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #FB7299; + background-color: #FB7299; +} + +/* other */ +.theme-pink .more-theme-item:hover, +.theme-pink .more-theme-item.active { + border-color: #FB7299; +} + +.theme-pink .btn-circle { + background: #FB7299; +} + +.theme-pink .ball-loader > span, +.theme-pink .signal-loader > span { + background-color: #FB7299; +} + +.theme-pink .text-primary, +.theme-pink .layui-link { + color: #FB7299 !important;; +} + +.theme-pink .layui-card { + border-radius: 4px; + box-shadow: none; +} + +/* button */ +.theme-pink .layui-btn { + height: 36px; + line-height: 36px; + border-radius: 4px; + background-color: #FB7299; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-pink .layui-btn-lg { + height: 42px; + line-height: 42px; +} + +.theme-pink .layui-btn-sm { + height: 28px; + line-height: 28px; +} + +.theme-pink .layui-btn-xs { + height: 22px; + line-height: 22px; +} + +/* input */ +.theme-pink .layui-input, +.theme-pink .layui-select, +.theme-pink .layui-textarea, +.theme-pink xm-select { + height: 36px; + border-radius: 4px; +} + +.theme-pink .layui-input:focus, +.theme-pink .layui-textarea:focus, +.theme-pink xm-select:hover { + border-color: #FB7299 !important; +} + +/* form */ +.theme-pink .layui-form-label, +.theme-pink .layui-form-mid { + padding-top: 8px; + padding-bottom: 8px; +} + +.theme-pink .layui-input-block { + min-height: 36px; +} + +.theme-pink .layui-form-radio { + margin-top: 4px; +} + +/* switch */ +.theme-pink .layui-form-onswitch { + border-color: #FB7299; + background-color: #FB7299; +} + +/* radio */ +.theme-pink .layui-form-radio > i:hover, +.theme-pink .layui-form-radioed > i, +.theme-pink .layui-form-checked i, +.theme-pink .layui-form-checked:hover i { + color: #FB7299; +} + +/* checkbox */ +.theme-pink .layui-form-checked[lay-skin=primary] i, +.theme-pink .layui-form-checked span, +.theme-pink .layui-form-checked:hover span { + border-color: #FB7299 !important; + background-color: #FB7299; +} + +.theme-pink .layui-form-checked[lay-skin=primary] i:hover, +.theme-pink .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #FB7299 !important; +} + +/* select */ +.theme-pink .layui-form-select dl dd.layui-this { + background-color: #FB7299; +} + +/* laypage */ +.theme-pink .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #FB7299; +} + +.theme-pink .layui-laypage input:focus, +.theme-pink .layui-laypage select:focus { + border-color: #FB7299 !important; +} + +.theme-pink .layui-laypage a:hover { + color: #FB7299; +} + +/* tab */ +.theme-pink .layui-tab-brief > .layui-tab-title .layui-this { + color: #FB7299; +} + +.theme-pink .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-pink .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #FB7299 !important; +} + +.theme-pink .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #FB7299; + color: #FB7299; +} + +/* breadcrumb */ +.theme-pink .layui-breadcrumb a:hover { + color: #FB7299 !important; +} + +/* laydate */ +.theme-pink .layui-laydate-footer span:hover, +.theme-pink .layui-laydate-header i:hover, +.theme-pink .layui-laydate-header span:hover { + color: #FB7299; +} + +.theme-pink .layui-laydate .layui-this { + background-color: #FB7299 !important; +} + +.theme-pink .layui-laydate-content td.laydate-selected { + background-color: #FFF1F5; +} + +.theme-pink .laydate-selected:hover { + background-color: #FFF1F5 !important; +} + +/* timeline */ +.theme-pink .layui-timeline-axis { + color: #FB7299; +} + +/* transfer */ +.theme-pink .layui-transfer-active .layui-btn { + background-color: #FB7299 !important; + border-color: #FB7299 !important; +} + +/* progress-bar */ +.theme-pink .layui-progress-bar { + background-color: #FB7299; +} + +/* slider */ +.theme-pink .layui-slider-bar { + background-color: #FB7299 !important; +} + +.theme-pink .layui-slider-wrap-btn { + border-color: #FB7299 !important; +} + +/* steps */ +.theme-pink .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #FB7299; +} + +.theme-pink .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-pink .layui-elem-quote { + border-color: #FB7299; +} + +.theme-pink .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-pink .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #FB7299; +} + +.theme-pink .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #FDB8CC; +} + +.theme-pink .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #FB7299; +} + +.theme-pink .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #FDB8CC !important; +} + +.theme-pink .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #FB7299 !important; +} + +/* cascader */ +.theme-pink .ew-cascader-dropdown-list-item.active, +.theme-pink .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #FB7299; +} + +/* tagsinput */ +.theme-pink div.tagsinput span.tag { + background: #FB7299; +} + +/* xmSelect */ +.theme-pink xm-select .xm-body .xm-option .xm-option-icon { + border-color: #FB7299 !important; +} + +.theme-pink xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-pink xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-pink .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #FB7299 !important; +} + +.theme-pink xm-select .xm-label .xm-label-block, +.theme-pink xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #FB7299 !important; +} + +/* city-select */ +.theme-pink .city-select a.active { + color: #fff !important; + background-color: #FB7299 !important; +} + +.theme-pink .city-select a:hover, +.theme-pink .city-select a:focus { + background-color: #FFF1F5; + color: #FB7299; +} + +.theme-pink .city-picker-span > .title > span:hover { + background-color: #FFF1F5; +} + +.theme-pink .city-select-tab > a.active { + color: #FB7299; +} + +/** ---------------------------粉色主题end----------------------------------- */ + +/** ---------------------------colorful主题start----------------------------------- */ +/* logo */ +.theme-colorful .layui-layout-admin .layui-header .layui-logo { + color: #262626; + background-color: transparent; + box-shadow: 2px 8px 8px 0 rgba(29, 35, 41, .05); +} + +/* header */ +.theme-colorful .layui-layout-admin .layui-header { + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); +} + +.theme-colorful .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-colorful .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #2d8cf0; +} + +/* side */ +.theme-colorful .layui-layout-admin .layui-side { + background-color: #fff; + box-shadow: 2px 8px 8px 0 rgba(29, 35, 41, .05); +} + +.theme-colorful .layui-side .layui-nav .layui-nav-item a { + color: #595959; +} + +.theme-colorful .layui-side .layui-nav .layui-nav-item a:hover { + color: #2d8cf0; +} + +.theme-colorful .layui-side .layui-nav-itemed > a, +.theme-colorful .layui-side .layui-nav-tree .layui-nav-title a, +.theme-colorful .layui-side .layui-nav-tree .layui-nav-title a:hover { + color: #595959 !important; +} + +.theme-colorful .layui-side .layui-nav-itemed > a:hover { + color: #2d8cf0 !important; +} + +.theme-colorful .layui-side .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-colorful .layui-side .layui-nav-tree .layui-this > a, +.theme-colorful .layui-side .layui-nav-tree .layui-this > a:hover { + color: #2d8cf0; + background: #f0faff; + border-right: 2px solid #2d8cf0; +} + +.theme-colorful .layui-side .layui-nav-tree .layui-nav-item .layui-nav-child { + background-color: transparent !important; +} + +.theme-colorful .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #fff !important; +} + +@media screen and (min-width: 769px) { + .theme-colorful .layui-layout-admin.admin-nav-mini .layui-side .layui-nav li.layui-nav-itemed > a { + background: #f0faff; + color: #2d8cf0 !important; + } +} + +.theme-colorful .layui-nav-tree > .layui-nav-item > a:before { + display: none; +} + +/* side arrow */ +.theme-colorful .layui-side .layui-nav .layui-nav-more { + border-color: rgba(89, 89, 89, .7) transparent transparent; +} + +.theme-colorful .layui-side .layui-nav .layui-nav-mored, +.theme-colorful .layui-side .layui-nav-itemed > a .layui-nav-more { + border-color: transparent transparent rgba(89, 89, 89, .7); +} + +.theme-colorful .layui-side .layui-nav-tree.arrow3 .layui-nav-itemed > a > .layui-nav-more:before { + background-color: rgba(89, 89, 89, .7); +} + +@media screen and (min-width: 769px) { + .theme-colorful .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child > dd > a .layui-nav-more { + border-color: transparent transparent transparent rgba(89, 89, 89, .7); + } +} + +.theme-colorful .layui-side .layui-nav .layui-nav-item a cite { + vertical-align: middle; +} + +/* side icon */ +.theme-colorful .layui-side .layui-nav-item > a > .layui-icon { + color: #fff; + width: 28px; + height: 28px; + font-size: 12px !important; + line-height: 28px; + text-align: center; + border-radius: 50%; + display: inline-block; + vertical-align: middle; + background-color: #61B2FC; +} + +.theme-colorful .layui-side .layui-nav-item:nth-child(even) > a > .layui-icon { + background-color: #7DD733; +} + +.theme-colorful .layui-side .layui-nav-item:nth-child(3) > a > .layui-icon { + background-color: #32A2D4; +} + +.theme-colorful .layui-side .layui-nav-item:nth-child(4) > a > .layui-icon { + background-color: #2BCCCE; +} + +.theme-colorful .layui-side .layui-nav-item:nth-child(5) > a > .layui-icon { + background-color: #7383CF; +} + +@media screen and (min-width: 768px) { + .theme-colorful .admin-nav-mini .layui-side .layui-nav-item > a { + padding-left: 16px; + } +} + +.theme-colorful .layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child a { + padding-left: 63px; +} + +.theme-colorful .layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child a { + padding-left: 83px; +} + +.theme-colorful .layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child .layui-nav-child a { + padding-left: 103px; +} + +.theme-colorful .layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child .layui-nav-child .layui-nav-child a { + padding-left: 123px; +} + +/* body tab */ +.theme-colorful .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title { + top: 8px; + right: 8px; + height: 32px; + line-height: 32px; + box-sizing: border-box; + background-color: transparent; + box-shadow: -4px 4px 0 #f5f7f9; + padding-right: 70px; +} + +.theme-colorful .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li { + border: none; + margin-right: 6px; + border-radius: 4px; + background-color: #fff; + line-height: 32px; + height: 32px; +} + +.theme-colorful .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this { + color: #2d8cf0; + background-color: #fff; +} + +.theme-colorful .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li:hover { + background-color: #fff; +} + +.theme-colorful .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + display: none; +} + +.theme-colorful .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li .layui-tab-close, +.theme-colorful .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li .layui-tab-close:hover { + top: 8px; + color: #8c8c8c; + background-color: transparent; +} + +.theme-colorful .layui-layout-admin .layui-body .admin-tabs-control, +.theme-colorful .layui-layout-admin .layui-body .admin-tabs-control:hover { + top: 8px; + height: 32px; + line-height: 32px; + background-color: #f5f7f9; + border: none; +} + +.theme-colorful .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-down { + border-radius: 4px; + background-color: #fff; + width: 32px; + right: 8px; +} + +.theme-colorful .admin-tabs-control > .layui-nav .layui-nav-item { + line-height: 32px; +} + +.theme-colorful .admin-tabs-control > .layui-nav .layui-nav-item > a { + height: 32px; + width: 32px; + padding: 0; +} + +.theme-colorful .admin-tabs-control > .layui-nav .layui-nav-child { + top: 36px; + border: none; + border-radius: 4px; + box-shadow: 0 1px 6px rgba(0, 0, 0, .2); +} + +.theme-colorful .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-prev:before { + content: "\e603"; +} + +.theme-colorful .layui-layout-admin .layui-body .admin-tabs-control.layui-icon-next:before { + content: "\e602"; +} + +/* body title */ +.theme-colorful .layui-body-header-title { + border-left-color: #2d8cf0; +} + +.theme-colorful .layui-body-header { + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); +} + +/* admin dialog */ +.theme-colorful .layui-layer.layui-layer-admin { + border-radius: 4px; +} + +.theme-colorful .layui-layer.layui-layer-admin .layui-layer-title { + color: #262626; + font-size: 16px; + padding-left: 23px; + background-color: #fff; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #f1f1f1; +} + +.theme-colorful .layui-layer.layui-layer-admin .layui-layer-setwin a { + color: #8c8c8c; + font-weight: 600; +} + +.theme-colorful .layui-layer.layui-layer-admin .layui-layer-setwin .layui-layer-min cite { + background-color: #8c8c8c; +} + +.theme-colorful .layui-layer.layui-layer-admin .layui-layer-btn a { + height: 32px; + line-height: 32px; + border-radius: 4px; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-colorful .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #2d8cf0; + background-color: #2d8cf0; +} + +/* other */ +.theme-colorful .more-theme-item:hover, +.theme-colorful .more-theme-item.active { + border-color: #2d8cf0; +} + +.theme-colorful .btn-circle { + background: #2d8cf0; +} + +.theme-colorful .ball-loader > span, +.theme-colorful .signal-loader > span { + background-color: #2d8cf0; +} + +.theme-colorful .text-primary, +.theme-colorful .layui-link { + color: #2d8cf0 !important;; +} + +.theme-colorful .layui-card { + border-radius: 4px; + box-shadow: none; +} + +/* button */ +.theme-colorful .layui-btn { + height: 36px; + line-height: 36px; + border-radius: 4px; + background-color: #2d8cf0; + box-shadow: 0 1px 0 rgba(0, 0, 0, .03); +} + +.theme-colorful .layui-btn-lg { + height: 42px; + line-height: 42px; +} + +.theme-colorful .layui-btn-sm { + height: 28px; + line-height: 28px; +} + +.theme-colorful .layui-btn-xs { + height: 22px; + line-height: 22px; +} + +/* input */ +.theme-colorful .layui-input, +.theme-colorful .layui-select, +.theme-colorful .layui-textarea, +.theme-colorful xm-select { + height: 36px; + border-radius: 4px; +} + +.theme-colorful .layui-input:focus, +.theme-colorful .layui-textarea:focus, +.theme-colorful xm-select:hover { + border-color: #2d8cf0 !important; +} + +/* form */ +.theme-colorful .layui-form-label, +.theme-colorful .layui-form-mid { + padding-top: 8px; + padding-bottom: 8px; +} + +.theme-colorful .layui-input-block { + min-height: 36px; +} + +.theme-colorful .layui-form-radio { + margin-top: 4px; +} + +/* switch */ +.theme-colorful .layui-form-onswitch { + border-color: #2d8cf0; + background-color: #2d8cf0; +} + +/* radio */ +.theme-colorful .layui-form-radio > i:hover, +.theme-colorful .layui-form-radioed > i, +.theme-colorful .layui-form-checked i, +.theme-colorful .layui-form-checked:hover i { + color: #2d8cf0; +} + +/* checkbox */ +.theme-colorful .layui-form-checked[lay-skin=primary] i, +.theme-colorful .layui-form-checked span, +.theme-colorful .layui-form-checked:hover span { + border-color: #2d8cf0 !important; + background-color: #2d8cf0; +} + +.theme-colorful .layui-form-checkbox[lay-skin=primary] i:hover, +.theme-colorful .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #2d8cf0; +} + +/* select */ +.theme-colorful .layui-form-select dl dd.layui-this { + background-color: #2d8cf0; +} + +/* laypage */ +.theme-colorful .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #2d8cf0; +} + +.theme-colorful .layui-laypage input:focus, +.theme-colorful .layui-laypage select:focus { + border-color: #2d8cf0 !important; +} + +.theme-colorful .layui-laypage a:hover { + color: #2d8cf0; +} + +/* tab */ +.theme-colorful .layui-tab-brief > .layui-tab-title .layui-this { + color: #2d8cf0; +} + +.theme-colorful .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-colorful .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #2d8cf0 !important; +} + +.theme-colorful .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #2d8cf0; + color: #2d8cf0; +} + +/* breadcrumb */ +.theme-colorful .layui-breadcrumb a:hover { + color: #2d8cf0 !important; +} + +/* laydate */ +.theme-colorful .layui-laydate-footer span:hover, +.theme-colorful .layui-laydate-header i:hover, +.theme-colorful .layui-laydate-header span:hover { + color: #2d8cf0; +} + +.theme-colorful .layui-laydate .layui-this { + background-color: #2d8cf0 !important; +} + +.theme-colorful .layui-laydate-content td.laydate-selected { + background-color: rgba(45, 140, 240, .1); +} + +.theme-colorful .laydate-selected:hover { + background-color: rgba(45, 140, 240, .1) !important; +} + +/* timeline */ +.theme-colorful .layui-timeline-axis { + color: #2d8cf0; +} + +/* transfer */ +.theme-colorful .layui-transfer-active .layui-btn { + background-color: #2d8cf0 !important; + border-color: #2d8cf0 !important; +} + +/* progress-bar */ +.theme-colorful .layui-progress-bar { + background-color: #2d8cf0; +} + +/* slider */ +.theme-colorful .layui-slider-bar { + background-color: #2d8cf0 !important; +} + +.theme-colorful .layui-slider-wrap-btn { + border-color: #2d8cf0 !important; +} + +/* steps */ +.theme-colorful .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #2d8cf0; +} + +.theme-colorful .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-colorful .layui-elem-quote { + border-color: #2d8cf0; +} + +.theme-colorful .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-colorful .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #2d8cf0; +} + +.theme-colorful .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: #96C6F8; +} + +.theme-colorful .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #2d8cf0; +} + +.theme-colorful .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: #96C6F8 !important; +} + +.theme-colorful .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #2d8cf0 !important; +} + +/* cascader */ +.theme-colorful .ew-cascader-dropdown-list-item.active, +.theme-colorful .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #2d8cf0; +} + +/* tagsinput */ +.theme-colorful div.tagsinput span.tag { + background: #2d8cf0; +} + +/* xmSelect */ +.theme-colorful xm-select .xm-body .xm-option .xm-option-icon { + border-color: #2d8cf0 !important; +} + +.theme-colorful xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-colorful xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-colorful .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #2d8cf0 !important; +} + +.theme-colorful xm-select .xm-label .xm-label-block, +.theme-colorful xm-select .xm-body .xm-option.hide-icon.selected { + background-color: #2d8cf0 !important; +} + +/* city-select */ +.theme-colorful .city-select a.active { + color: #fff !important; + background-color: #2d8cf0 !important; +} + +.theme-colorful .city-select a:hover, +.theme-colorful .city-select a:focus { + background-color: #f0faff; + color: #2d8cf0; +} + +.theme-colorful .city-picker-span > .title > span:hover { + background-color: #f0faff; +} + +.theme-colorful .city-select-tab > a.active { + color: #2d8cf0; +} + +/** ---------------------------colorful主题end----------------------------------- */ diff --git a/jun_pc_web/assets/css/gougu.css b/jun_pc_web/assets/css/gougu.css new file mode 100644 index 000000000..f9c03146f --- /dev/null +++ b/jun_pc_web/assets/css/gougu.css @@ -0,0 +1,383 @@ +@import url("../../assets/layui/css/layui.css"); +@import url("./icon/iconfont.css"); +@import url("../../assets/module/admin.css"); +/*reset layui*/ +.layui-card{margin-bottom:16px; box-shadow: 0 1px 3px 0 rgb(5 32 96 / 10%);} +.layui-card-header {position: relative; padding:0 12px;} +.layui-card-header .layui-icon,.layui-card-header .pull-right{line-height: initial; position: absolute;right: 12px;top: 50%; margin-top: -9px} +.layui-card-title {font-size: 18px;font-weight: 600;padding: 12px 12px 0;} +.layui-table td, .layui-table th{padding:8px;} +.picker-table{padding:8px;} +.picker-table .layui-table-cell {padding:4px; height: 32px;line-height: 24px;} +.layui-table-cell{padding:6px;} +.layui-table-box{background-color:#fff;} +.layui-table-page{background-color:#fff;border-bottom:1px solid #f1f1f1;} +.layui-table-tool{box-shadow: 0 0 0 rgb(0 0 0 / 1%);padding:10px 12px; background-color:#fff;} +.layui-input, .layui-select, .layui-textarea {height: 36px;line-height: 1.22;line-height: 36px\9;} +.layui-input, .layui-textarea {padding-left:6px;} +.layui-form-pane .layui-form-label{height: 36px;} + +.layui-btn {height: 36px;line-height: 36px; padding:0 16px;} +.layui-btn-sm {height: 30px; line-height: 30px; padding:0 8px;} +.layui-btn-xs {height: 22px; line-height: 22px; padding:0 4px;} +.layui-btn-reset {height: 36px;background-color: #fff; line-height: 36px; border: 1px solid transparent;padding: 0 8px; white-space: nowrap; color: #767a82;font-size: 14px;cursor: pointer;vertical-align: middle;} +.layui-btn-reset:hover{color: #323232;} + +.layui-tab-brief>.layui-tab-title .layui-this{color:#1A75FF} +.layui-tab-brief>.layui-tab-more li.layui-this:after, .layui-tab-brief>.layui-tab-title .layui-this:after{border-color:#1A75FF} +.layui-form-radio{padding-right:4px;} +.layui-form-radio>i{margin-right:4px;} +.layui-form-label{padding:9px; color:#909399} +.layui-form-label font{color:#FF6347; margin-right: 2px;} +.layui-input-block{margin-left:100px;} +.layui-form-2 .layui-form-label{width:112px;} +.layui-form-2 .layui-input-block{margin-left:130px;} + +.layui-table-view{margin:0;} +.layui-table-view .layui-table th{background-color:#f8f8f8;} +.layui-table-form{margin:0;} +.layui-table-form tbody tr:hover{background-color: #fff;} +.layui-td-gray,.layui-td-gray-2,.layui-td-gray-3,.layui-td-gray-4{color:#909399; width:68px; text-align:right; background-color:#fafafa;} +.layui-td-gray-2{width:96px;} +.layui-td-gray-3{width:126px;} +.layui-td-gray-4{width:152px;} +.layui-td-gray font,.layui-td-gray-2 font,.layui-td-gray-3 font,.layui-td-gray-4 font{color:#FF6347; margin-left: 2px;} +.layui-table-min th{font-size:13px; text-align:center; background-color:#f8f8f8;} +.layui-table-min td{font-size:13px; padding:6px;text-align:center;} + +.layui-select-tags{padding:10px 0;} +.layui-tags-span{padding:5px 8px; font-size:14px; border-radius:3px; margin-bottom:6px; margin-right:6px; border:1px solid #e6e6e6; display:inline-block;cursor:pointer;} +.layui-readonly{background-color: #f5f5f5; color:#999;} +.layui-tags-span:hover{border:1px solid #ddd; background-color:#f2f2f2;} +.layui-tags-span i{margin-left:5px; font-size:14px;} +.layui-tags-span i:hover{border-radius:2px;background-color:#FF6347;color:#fff} +.layui-letter-span{padding:10px 5px; font-size:15px; display:inline-block; cursor:pointer;} +.layui-letter-span.on{color:#FF6347; font-weight:800;} +.layui-letter-span:hover{color:#4285f4;} +.layui-tags-all{float: right; font-weight: 200; background-color:#4285f4; color:#fff; border-radius: 3px; padding: 2px 6px; cursor: pointer; display: none;} + +.layui-data-none{padding:12px 0; color:#969696; text-align:center; font-size:12px;} +.gougu-data-none{background:url(../images/data-none.png) no-repeat center center; background-size:auto 80%;} + +.click-edit{position: relative; display:inline-block; padding-right:24px; box-sizing:border-box;} +.click-edit::after{content: ""; width: 16px; height: 24px; display: block; position: absolute; right:0; bottom: 0; background:url(../images/edit.png) no-repeat center center; background-size:16px auto; opacity: 0; transition: opacity ease-in-out .2s; cursor:pointer;} +.click-edit:hover::after {opacity: 1;} + +html {background-color: #FAFAFA;} +html,body{height:100%;scrollbar-width: thin; color:#323232} +body.right-open{overflow:hidden;} +.bg-white{background-color:#fff;} +a.tab-a,a.open-a,a.link-a,a.right-a,a.side-a{color:#1A75FF; cursor:pointer;} +a.tab-a:hover,a:hover,a.open-a:hover,a.link-a:hover,a.right-a:hover{color:#1A75FF; opacity:0.8} +.left{float:left;} +.right{float:right;} +.h1,h1{font-size:24px; font-weight: 600;} +.h2,h2{font-size:20px; font-weight: 600;} +.h3,h3{font-size:18px; font-weight: 600;} +.h4,h4{font-size:16px; font-weight: 600;} + +.f12{font-size:12px;} +.f14{font-size:14px;} +.f16{font-size:16px;} +.f18{font-size:18px;} +.f20{font-size:20px;} +.f24{font-size:24px;} +.f28{font-size:28px;} +.f32{font-size:32px;} +.f36{font-size:36px;} + +.m-0{margin:0} +.m-1{margin:4px} +.m-2{margin:8px} +.m-3{margin:12px} +.m-4{margin:16px} +.m-5{margin:20px} +.my-1{margin-top:4px;margin-bottom:4px} +.my-2{margin-top:8px;margin-bottom:8px} +.my-3{margin-top:12px;margin-bottom:12px} +.my-4{margin-top:16px;margin-bottom:16px} +.my-5{margin-top:20px;margin-bottom:20px} +.mx-1{margin-left:4px;margin-right:4px} +.mx-2{margin-left:8px;margin-right:8px} +.mx-3{margin-left:12px;margin-right:12px} +.mx-4{margin-left:16px;margin-right:16px} +.mx-5{margin-left:20px;margin-right:20px} +.ml-1{margin-left:4px} +.ml-2{margin-left:8px} +.ml-3{margin-left:12px} +.ml-4{margin-left:16px} +.ml-5{margin-left:20px} +.mt-1{margin-top:4px} +.mt-2{margin-top:8px} +.mt-3{margin-top:12px} +.mt-4{margin-top:16px} +.mt-5{margin-top:20px} +.mr-1{margin-right:4px} +.mr-2{margin-right:8px} +.mr-3{margin-right:12px} +.mr-4{margin-right:16px} +.mr-5{margin-right:20px} +.mb-1{margin-bottom:4px} +.mb-2{margin-bottom:8px} +.mb-3{margin-bottom:12px} +.mb-4{margin-bottom:16px} +.mb-5{margin-bottom:20px} + +.p-0{padding:0} +.p-1{padding:4px} +.p-2{padding:8px} +.p-3{padding:12px} +.p-4{padding:16px} +.p-5{padding:20px} +.py-1{padding-top:4px;padding-bottom:4px} +.py-2{padding-top:8px;padding-bottom:8px} +.py-3{padding-top:12px;padding-bottom:12px} +.py-4{padding-top:16px;padding-bottom:16px} +.py-5{padding-top:20px;padding-bottom:20px} +.px-1{padding-left:4px;padding-right:4px} +.px-2{padding-left:8px;padding-right:8px} +.px-3{padding-left:12px;padding-right:12px} +.px-4{padding-left:16px;padding-right:16px} +.px-5{padding-left:20px;padding-right:20px} +.pl-1{padding-left:4px} +.pl-2{padding-left:8px} +.pl-3{padding-left:12px} +.pl-4{padding-left:16px} +.pt-1{padding-top:4px} +.pt-2{padding-top:8px} +.pt-3{padding-top:12px} +.pt-4{padding-top:16px} +.pt-5{padding-top:20px} +.pr-1{padding-right:4px} +.pr-2{padding-right:8px} +.pr-3{padding-right:12px} +.pr-4{padding-right:16px} +.pr-5{padding-right:20px} +.pb-1{padding-bottom:4px} +.pb-2{padding-bottom:8px} +.pb-3{padding-bottom:12px} +.pb-4{padding-bottom:16px} +.pb-5{padding-bottom:20px} +.p-page{padding:18px 15px 0} + +.border{border:1px solid #eee; box-sizing:border-box} +.border-y{border-top:1px solid #eee;border-bottom:1px solid #eee; box-sizing:border-box} +.border-x{border-left:1px solid #eee;border-right:1px solid #eee; box-sizing:border-box} +.border-t{border-top:1px solid #eee; box-sizing:border-box} +.border-b{border-bottom:1px solid #eee; box-sizing:border-box} +.border-l{border-left:1px solid #eee; box-sizing:border-box} +.border-r{border-right:1px solid #eee; box-sizing:border-box} + +.layui-bg-0{background-color:#648A8D !important;}/*灰青*/ +.layui-bg-1,.layui-bg-green{background-color:#16b777 !important;}/*亮绿*/ +.layui-bg-2{background-color:#1E9FFF !important;}/*亮蓝*/ +.layui-bg-3{background-color:#FEC939 !important;}/*亮黄*/ +.layui-bg-4{background-color:#FD6206 !important;}/*亮橙*/ +.layui-bg-5{background-color:#FF5823 !important;}/*亮红*/ +.layui-bg-6{background-color:#4AC8BE !important;}/*亮青*/ +.layui-bg-7{background-color:#7860C0 !important;}/*亮紫*/ +.layui-bg-8{background-color:#646464 !important;}/*黑*/ +.layui-bg-9{background-color:#969696 !important;}/*灰黑*/ + +.layui-color-0{color:#648A8D !important;}/*灰青*/ +.layui-color-1{color:#16b777 !important;}/*亮绿*/ +.layui-color-2{color:#1E9FFF !important;}/*亮蓝*/ +.layui-color-3{color:#FEC939 !important;}/*亮黄*/ +.layui-color-4{color:#FD6206 !important;}/*亮橙*/ +.layui-color-5{color:#FF5823 !important;}/*亮红*/ +.layui-color-6{color:#4AC8BE !important;}/*亮青*/ +.layui-color-7{color:#7860C0 !important;}/*亮紫*/ +.layui-color-8{color:#646464 !important;}/*黑*/ +.layui-color-9{color:#969696 !important;}/*灰黑*/ + +.black{color:#182b50} + +.blue{color:#1A75FF} +.blue-dark{color:#3c9cff;} +.blue-disabled{color:#9acafc;} +.blue-light{color:#ecf5ff;} + +.yellow{color:#f9ae3d;} +.yellow-dark{color:#f1a532;} +.yellow-disabled{color:#f9d39b;} +.yellow-light{color:#fdf6ec;} + +.green{color:#16b777;} +.green-dark{color:#53c21d;} +.green-disabled{color:#a9e08f;} +.green-light{color:#f5fff0;} + +.red{color:#f56c6c;} +.red-dark{color:#e45656;} +.red-disabled{color:#f7b2b2;} +.red-light{color:#fef0f0;} + +.gray{color:#969696;} +.gray-dark{color:#767676;} +.gray-disabled{color:#c6c6c6;} +.gray-light{color:#f1f1f1;} + +.layui-bg-gray { background-color: #f1f1f1!important; color: #686868!important;} +/* 滚动条 */ +::-webkit-scrollbar { + width: 8px; +} +::-webkit-scrollbar-thumb { + background-color:rgba(0,0,0,.15);background-clip:content-box;border:1px solid transparent;border-radius:8px +} + +::-webkit-scrollbar-track{background-color:transparent} +::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} +::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:1px solid transparent} +::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} + +::-moz-scrollbar { + width: 8px; + background-color: transparent; +} +::-moz-scrollbar-thumb { + background-color: #c1c1c1; + border-radius: 8px; +} +body.right-open{overflow-y:clip;} +div.layui-table-main::-webkit-scrollbar{width:12px;height:12px} +div.layui-table-main::-webkit-scrollbar-thumb{min-width:12px;min-height:12px;background-color:rgba(0,0,0,.15);background-clip:content-box;border:2px solid transparent;border-radius:12px} +div.layui-table-main::-webkit-scrollbar-track{background-color:transparent} +div.layui-table-main::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} +div.layui-table-main::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:2px solid transparent} +div.layui-table-main::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} +/*placeholder*/ +::-webkit-input-placeholder { /* WebKit, Blink, Edge */ + color: #aaa; +} +:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color:#aaa; +} +::-moz-placeholder { /* Mozilla Firefox 19+ */ + color:#aaa; +} + :-ms-input-placeholder { /* Internet Explorer 10-11 */ + color:#aaa; + } + /*text ellipsis*/ +.text-overflow1{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} +.text-overflow2{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.text-overflow3{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} + +/*gg-DIY*/ +.gg-form-bar{padding:10px 12px 0; background-color:#fff;} +.gg-form-bar .layui-input-inline{margin-bottom:10px;} +.gg-tab-bar{background-color:#fff;} +.gg-tab{text-align: left!important;} +.gg-tab-title{position: relative;left: 0; height: 40px; white-space: nowrap; font-size: 0;} +.gg-tab-title li{display: inline-block;*display: inline;*zoom: 1;vertical-align: middle; font-size: 16px; position: relative;line-height: 40px; min-width: 64px; padding: 0 12px;text-align: center;cursor: pointer;} +.gg-tab-title li:hover,.gougu-tab li.tab-this{ color:#1A75FF;} +.gg-tab-title li.tab-this:after{border-bottom: 2px solid #1A75FF;position: absolute;left: 0; top: 0; content: ""; width: 100%; height: 41px; box-sizing: border-box;pointer-events: none;} +.gg-tab-title.big{height: 46px;} +.gg-tab-title.big li{line-height: 46px;} +.gg-tab-title.big li{line-height: 46px;} +.gg-tab-title.big li.tab-this:after{height: 47px;} +.gg-img-center{display: table-cell;vertical-align: middle;} +.gg-img-center img{max-width: 100%; max-height: 100%; display: block; margin: auto;} +.gg-img-radius img{border-radius:4px;max-width: 100%; max-height: 100%;} +.gg-img-round img{border-radius:50%;max-width: 100%; max-height: 100%;} +.gg-img-cover { width: 100%; position: relative; padding-top: 0; border-radius: 3px; overflow: hidden; background-color: #f0f0f0;} +.gg-img-cover img { width: 100%;height: 100%; object-fit: cover; position: absolute; top: 0; left: 0; border-radius: 2px; max-width: 100%;} +.gg-img-cover.cover-2-1 { padding-top: 50%;} +.gg-img-cover.cover-4-3 { padding-top: 75%;} +.gg-img-cover.cover-16-9 { padding-top: 56.25%;} + +.sub-menu { overflow: hidden; position: absolute; height: 100%;top: 0;left: 0;} +.sub-menu ul{padding:0; line-height:2.7} +.sub-menu li.sub-menu-title{margin-top:10px;} +.sub-menu li.sub-menu-title i{font-size:18px; font-weight:800} +.sub-menu li.sub-menu-title span{padding-left:8px; font-size:15px;} +.sub-menu li.sub-menu-title cite{font-size:12px; margin-left:4px; color:#999} +.sub-menu li.sub-menu-title.active a{color:#4285F4;} +.sub-menu li.sub-menu-li a{padding-left:12px; font-size:14px; display:inline-block; width:100%; box-sizing:border-box;} +.sub-menu li.sub-menu-li a .iconfont{margin-right:8px; font-weight:600} +.sub-menu li.sub-menu-li.active a{color:#4285F4; background-color:#F2F8FF} +.sub-menu li.sub-menu-li span.num{margin-left:4px} + +/*附件*/ +.file-card {background: #fff;border: 1px solid #f1f1f1; border-radius: 2px; padding:0; margin:4px 6px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.file-card .file-icon{font-size:44px; color:#646464; margin-right: 4px;} +.file-card .file-info {width: calc(100% - 110px); line-height:1.5} +.file-card.file-view .file-info{width: calc(100% - 82px);} +.file-card .file-title {font-size: 14px; word-break:keep-all; overflow: hidden; text-overflow: ellipsis; display: width: 100%;} +.file-card .file-ops{font-size:12px; color:#aaa;} +.file-card .file-tool .iconfont{font-size:20px; font-weight:600; padding:4px; display:inline-block; cursor:pointer;} +.file-card.file-view .btn-delete{display:none} +.file-hasdelete{background:url(../images/delete_icon.png) no-repeat 99% 0; background-size: auto 58px; color:#aaa} +.file-hasdelete .file-icon{color:#aaa;} +.file-hasdelete .file-tool{display:none} +/*审批*/ +.check-items{overflow-x: auto; padding: 2px 0;} +.flow-flex-row {box-direction: row; + box-orient: horizontal; + -webkit-box-orient: horizontal; + -ms-flex-direction: row; + flex-direction: row; +} +.flow-flexbox { width: 100%;text-align: left; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + display: -webkit-flex; + box-align: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + flex-wrap: wrap; +} +.check-item{width: auto; -ms-flex-negative: 0; flex-shrink: 0; padding:4px 0} +.check-item i{margin-right:3px; color:#646464;} +.check-item span{color:#999;margin:0 3px;} +.check-item .layui-icon {font-size:18px;} +.check-item .layui-icon.layui-icon-right{font-size:12px;} +.layui-icon[data-ok]{color:#34a853} +.layui-icon[data-no]{color:#FF5722;} +.check-item-status{color:#999; font-size:12px; margin-left:3px;} + +.flow-tips{padding:6px 10px;} +.flow-tips li{padding:5px 0;} +.flow-tips li i{color:#4285f4;} +.flow-tips li span{color:#999; font-size:12px; margin-left:4px;} + +.flow-record{padding:4px 4px 0;} +.flow-record .layui-timeline-item{text-decoration:line-through; color:#acacac; padding-bottom:10px;} +.flow-record .layui-timeline-item.delete-0{text-decoration:none; color:#323232;} +.layui-timeline-content ul{font-size:12px;} +.check-status{color:#999; margin-left:5px;} +.check-remark{padding:6px; margin-top:6px; margin-bottom:10px; border-radius:4px; background-color:#f5f5f5;} +.check-record{line-height:1.5; padding:4px 0} +.flow-this{font-weight:800;} +.flow-this i{color:#4285f4} + + +.editormd,.editormd-toolbar,.editormd .CodeMirror,.CodeMirror-gutters{border-color:#eeeeee!important;} +.editormd{margin-bottom:0!important;} +.CodeMirror-gutters{background-color:#fafafa!important;} + +.layui-layer-gougu-admin {box-shadow: 1px 1px 10px rgba(0,0,0,.1); border-radius: 0!important;overflow:initial!important;} +.express-box { position: fixed; z-index:9999; height:100%; right: -100%; top:0;background-color: #fff;} +.express-box article{width:100%; height:100%; overflow:auto;} +.express-mask{ display: none; position: fixed; top: 0; left: 0; z-index: 9998; width: 100%; height: 100%; background-color: rgba(0,0,0,.6); } +.express-close{position: absolute;width:24px;height:60px; padding:20px 6px; line-height:30px;text-align:center; left: -38px;right:0; top: 16%;background-color:#FF5722;color:#fff;border-radius:6px 0 0 6px; cursor:pointer; border:2px solid #fff; border-right:none; font-weight:600; font-size:14px;} +.express-close:hover{opacity:0.9} \ No newline at end of file diff --git a/jun_pc_web/assets/css/gougu.css.bk b/jun_pc_web/assets/css/gougu.css.bk new file mode 100644 index 000000000..b0761f20d --- /dev/null +++ b/jun_pc_web/assets/css/gougu.css.bk @@ -0,0 +1,320 @@ +@import url("../../layui/css/layui.css"); +@import url("../../icon/bootstrap-icons.css"); + +/*reset layui*/ +.layui-card{margin-bottom:12px; box-shadow: 0 1px 3px 0 rgb(5 32 96 / 10%);} +.layui-card-header {position: relative; padding:0 12px;} +.layui-card-header .layui-icon,.layui-card-header .pull-right{line-height: initial; position: absolute;right: 12px;top: 50%; margin-top: -9px} +.layui-card-title {font-size: 18px;font-weight: 600;padding: 12px 12px 0;} +.layui-table, .layui-table-view{margin:0; background-color:#fff;} +.layui-table td, .layui-table th{padding:8px;} +.layui-table-cell{padding:6px;} +.layui-table-box{background-color:#fff;} +.layui-table-page{background-color:#fff;border-bottom:1px solid #f1f1f1;} +.layui-table-tool{box-shadow: 0 0 0 rgb(0 0 0 / 1%);} +.layui-btn{background-color: #47B347;} +.layui-btn-normal{background-color: #3c9cff;} +.layui-btn-warm{background-color: #ff9900;} +.layui-btn-danger{background-color: #FF5722;} +.layui-btn-primary{background-color: #f5f5fa;} +.layui-btn-primary:hover{border-color:#3c9cff;color:#3c9cff} +.layui-btn-group .layui-btn-primary:hover{color:#3c9cff} +.layui-btn-reset {height: 38px;background-color: #fff; line-height: 38px; border: 1px solid transparent;padding: 0 12px; white-space: nowrap; color: #767a82;font-size: 14px;cursor: pointer;vertical-align: middle;} +.layui-laypage .layui-laypage-curr .layui-laypage-em{background-color: #47B347;} + +.layui-tab-brief>.layui-tab-title .layui-this{color:#187FDD} +.layui-tab-brief>.layui-tab-more li.layui-this:after, .layui-tab-brief>.layui-tab-title .layui-this:after{border-color:#187FDD} +.layui-form-radio{padding-right:4px;} +.layui-form-radio>i{margin-right:4px;} +.layui-form-label{padding:9px; color:#909399} +.layui-form-label font{color:#FF6347; margin-right: 2px;} +.layui-input-block{margin-left:100px;} +.layui-form-2 .layui-form-label{width:112px;} +.layui-form-2 .layui-input-block{margin-left:130px;} + +.layui-table-form tbody tr:hover{background-color: #fff;} +.layui-td-gray,.layui-td-gray-2,.layui-td-gray-3,.layui-td-gray-4{color:#909399; width:68px; text-align:right; background-color:#f7f7f7;} +.layui-td-gray-2{width:96px;} +.layui-td-gray-3{width:126px;} +.layui-td-gray-4{width:152px;} +.layui-td-gray font,.layui-td-gray-2 font,.layui-td-gray-3 font,.layui-td-gray-4 font{color:#FF6347; margin-left: 2px;} + +.layui-select-tags{padding:10px 0;} +.layui-tags-span{padding:5px 8px; font-size:14px; border-radius:3px; margin-bottom:6px; margin-right:6px; border:1px solid #e6e6e6; display:inline-block;cursor:pointer;} +.layui-readonly{background-color: #f5f5f5; color:#999;} +.layui-tags-span:hover{border:1px solid #ddd; background-color:#f2f2f2;} +.layui-tags-span i{margin-left:5px; font-size:14px;} +.layui-tags-span i:hover{border-radius:2px;background-color:#FF6347;color:#fff} +.layui-letter-span{padding:10px 5px; font-size:15px; display:inline-block; cursor:pointer;} +.layui-letter-span.on{color:#FF6347; font-weight:800;} +.layui-letter-span:hover{color:#4285f4;} +.layui-tags-all{float: right; font-weight: 200; background-color:#4285f4; color:#fff; border-radius: 3px; padding: 2px 6px; cursor: pointer; display: none;} + +.layui-data-none{padding:12px 0; color:#969696; text-align:center; font-size:12px;} +.gougu-data-none{background:url(../images/data-none.png) no-repeat center center; background-size:auto 80%;} + +html {background-color: #FAFAFA; color: #162a48} +html,body{height:100%;} +body.right-open{overflow:hidden;} +.bg-white{background-color:#fff;} +a.tab-a,a.open-a,a.link-a,a.right-a,a.side-a{color:#187FDD; cursor:pointer;} +a.tab-a:hover,a:hover,a.open-a:hover,a.link-a:hover,a.right-a:hover{color:#187FDD; opacity:0.8} +.left{float:left;} +.right{float:right;} +.h1,h1{font-size:24px; font-weight: 600;} +.h2,h2{font-size:20px; font-weight: 600;} +.h3,h3{font-size:18px; font-weight: 600;} +.h4,h4{font-size:16px; font-weight: 600;} + +.f12{font-size:12px;} +.f14{font-size:14px;} +.f16{font-size:16px;} +.f18{font-size:18px;} +.f20{font-size:20px;} +.f24{font-size:24px;} +.f28{font-size:28px;} +.f32{font-size:32px;} +.f36{font-size:36px;} + +.m-0{margin:0} +.m-1{margin:4px} +.m-2{margin:8px} +.m-3{margin:12px} +.m-4{margin:16px} +.m-5{margin:20px} +.my-1{margin-top:4px;margin-bottom:4px} +.my-2{margin-top:8px;margin-bottom:8px} +.my-3{margin-top:12px;margin-bottom:12px} +.my-4{margin-top:16px;margin-bottom:16px} +.my-5{margin-top:20px;margin-bottom:20px} +.mx-1{margin-left:4px;margin-right:4px} +.mx-2{margin-left:8px;margin-right:8px} +.mx-3{margin-left:12px;margin-right:12px} +.mx-4{margin-left:16px;margin-right:16px} +.mx-5{margin-left:20px;margin-right:20px} +.ml-1{margin-left:4px} +.ml-2{margin-left:8px} +.ml-3{margin-left:12px} +.ml-4{margin-left:16px} +.ml-5{margin-left:20px} +.mt-1{margin-top:4px} +.mt-2{margin-top:8px} +.mt-3{margin-top:12px} +.mt-4{margin-top:16px} +.mt-5{margin-top:20px} +.mr-1{margin-right:4px} +.mr-2{margin-right:8px} +.mr-3{margin-right:12px} +.mr-4{margin-right:16px} +.mr-5{margin-right:20px} +.mb-1{margin-bottom:4px} +.mb-2{margin-bottom:8px} +.mb-3{margin-bottom:12px} +.mb-4{margin-bottom:16px} +.mb-5{margin-bottom:20px} + +.p-0{padding:0} +.p-1{padding:4px} +.p-2{padding:8px} +.p-3{padding:12px} +.p-4{padding:16px} +.p-5{padding:20px} +.py-1{padding-top:4px;padding-bottom:4px} +.py-2{padding-top:8px;padding-bottom:8px} +.py-3{padding-top:12px;padding-bottom:12px} +.py-4{padding-top:16px;padding-bottom:16px} +.py-5{padding-top:20px;padding-bottom:20px} +.px-1{padding-left:4px;padding-right:4px} +.px-2{padding-left:8px;padding-right:8px} +.px-3{padding-left:12px;padding-right:12px} +.px-4{padding-left:16px;padding-right:16px} +.px-5{padding-left:20px;padding-right:20px} +.pl-1{padding-left:4px} +.pl-2{padding-left:8px} +.pl-3{padding-left:12px} +.pl-4{padding-left:16px} +.pt-1{padding-top:4px} +.pt-2{padding-top:8px} +.pt-3{padding-top:12px} +.pt-4{padding-top:16px} +.pt-5{padding-top:20px} +.pr-1{padding-right:4px} +.pr-2{padding-right:8px} +.pr-3{padding-right:12px} +.pr-4{padding-right:16px} +.pr-5{padding-right:20px} +.pb-1{padding-bottom:4px} +.pb-2{padding-bottom:8px} +.pb-3{padding-bottom:12px} +.pb-4{padding-bottom:16px} +.pb-5{padding-bottom:20px} + +.border{border:1px solid #eee; box-sizing:border-box} +.border-y{border-top:1px solid #eee;border-bottom:1px solid #eee; box-sizing:border-box} +.border-x{border-left:1px solid #eee;border-right:1px solid #eee; box-sizing:border-box} +.border-t{border-top:1px solid #eee; box-sizing:border-box} +.border-b{border-bottom:1px solid #eee; box-sizing:border-box} +.border-l{border-left:1px solid #eee; box-sizing:border-box} +.border-r{border-right:1px solid #eee; box-sizing:border-box} + +.layui-bg-0{background-color:#648A8D !important;}/*灰青*/ +.layui-bg-1,.layui-bg-green{background-color:#47B347 !important;}/*亮绿*/ +.layui-bg-2{background-color:#187FDD !important;}/*亮蓝*/ +.layui-bg-3{background-color:#FEC939 !important;}/*亮黄*/ +.layui-bg-4{background-color:#FD6206 !important;}/*亮橙*/ +.layui-bg-5{background-color:#FF5823 !important;}/*亮红*/ +.layui-bg-6{background-color:#4AC8BE !important;}/*亮青*/ +.layui-bg-7{background-color:#7860C0 !important;}/*亮紫*/ +.layui-bg-8{background-color:#646464 !important;}/*黑*/ +.layui-bg-9{background-color:#969696 !important;}/*灰黑*/ + +.layui-color-0{color:#648A8D !important;}/*灰青*/ +.layui-color-1{color:#47B347 !important;}/*亮绿*/ +.layui-color-2{color:#187FDD !important;}/*亮蓝*/ +.layui-color-3{color:#FEC939 !important;}/*亮黄*/ +.layui-color-4{color:#FD6206 !important;}/*亮橙*/ +.layui-color-5{color:#FF5823 !important;}/*亮红*/ +.layui-color-6{color:#4AC8BE !important;}/*亮青*/ +.layui-color-7{color:#7860C0 !important;}/*亮紫*/ +.layui-color-8{color:#646464 !important;}/*黑*/ +.layui-color-9{color:#969696 !important;}/*灰黑*/ + +.black{color:#182b50} + +.blue{color:#187FDD} +.blue-dark{color:#3c9cff;} +.blue-disabled{color:#9acafc;} +.blue-light{color:#ecf5ff;} + +.yellow{color:#f9ae3d;} +.yellow-dark{color:#f1a532;} +.yellow-disabled{color:#f9d39b;} +.yellow-light{color:#fdf6ec;} + +.green{color:#47B347;} +.green-dark{color:#53c21d;} +.green-disabled{color:#a9e08f;} +.green-light{color:#f5fff0;} + +.red{color:#f56c6c;} +.red-dark{color:#e45656;} +.red-disabled{color:#f7b2b2;} +.red-light{color:#fef0f0;} + +.gray{color:#969696;} +.gray-dark{color:#767676;} +.gray-disabled{color:#c6c6c6;} +.gray-light{color:#f1f1f1;} + +/* 滚动条 */ +::-webkit-scrollbar { + width: 8px; +} +::-webkit-scrollbar-thumb { + background-color:rgba(0,0,0,.15);background-clip:content-box;border:1px solid transparent;border-radius:8px +} + +::-webkit-scrollbar-track{background-color:transparent} +::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} +::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:1px solid transparent} +::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} + +::-moz-scrollbar { + width: 8px; + background-color: transparent; +} +::-moz-scrollbar-thumb { + background-color: #c1c1c1; + border-radius: 8px; +} +body.right-open{overflow-y:clip;} +div.layui-table-main::-webkit-scrollbar{width:12px;height:12px} +div.layui-table-main::-webkit-scrollbar-thumb{min-width:12px;min-height:12px;background-color:rgba(0,0,0,.15);background-clip:content-box;border:2px solid transparent;border-radius:12px} +div.layui-table-main::-webkit-scrollbar-track{background-color:transparent} +div.layui-table-main::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} +div.layui-table-main::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:2px solid transparent} +div.layui-table-main::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} +/*placeholder*/ +::-webkit-input-placeholder { /* WebKit, Blink, Edge */ + color: #aaa; +} +:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color:#aaa; +} +::-moz-placeholder { /* Mozilla Firefox 19+ */ + color:#aaa; +} + :-ms-input-placeholder { /* Internet Explorer 10-11 */ + color:#aaa; + } + /*text ellipsis*/ +.text-overflow1{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} +.text-overflow2{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.text-overflow3{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} + +/*gg-DIY*/ +.gg-form-bar{padding:12px; background-color:#fff;} +.gg-tab-bar{background-color:#fff;} +.gg-tab{text-align: left!important;} +.gg-tab-title{position: relative;left: 0; height: 40px; white-space: nowrap; font-size: 0;} +.gg-tab-title li{display: inline-block;*display: inline;*zoom: 1;vertical-align: middle; font-size: 16px; position: relative;line-height: 40px; min-width: 64px; padding: 0 12px;text-align: center;cursor: pointer;} +.gg-tab-title li:hover,.gougu-tab li.tab-this{ color:#187FDD;} +.gg-tab-title li.tab-this:after{border-bottom: 2px solid #187FDD;position: absolute;left: 0; top: 0; content: ""; width: 100%; height: 41px; box-sizing: border-box;pointer-events: none;} +.gg-tab-title.big{height: 46px;} +.gg-tab-title.big li{line-height: 46px;} +.gg-tab-title.big li{line-height: 46px;} +.gg-tab-title.big li.tab-this:after{height: 47px;} +.gg-img-center{display: table-cell;vertical-align: middle;} +.gg-img-center img{max-width: 100%; max-height: 100%; display: block; margin: auto;} +.gg-img-radius img{border-radius:4px;max-width: 100%; max-height: 100%;} +.gg-img-round img{border-radius:50%;max-width: 100%; max-height: 100%;} +.gg-img-cover { width: 100%; position: relative; padding-top: 0; border-radius: 3px; overflow: hidden; background-color: #f0f0f0;} +.gg-img-cover img { width: 100%;height: 100%; object-fit: cover; position: absolute; top: 0; left: 0; border-radius: 2px; max-width: 100%;} +.gg-img-cover.cover-2-1 { padding-top: 50%;} +.gg-img-cover.cover-4-3 { padding-top: 75%;} +.gg-img-cover.cover-16-9 { padding-top: 56.25%;} + +.sub-menu { overflow: hidden; position: absolute; height: 100%;top: 0;left: 0;} +.sub-menu ul{padding:0; line-height:2.7} +.sub-menu li.sub-menu-title{margin-top:10px;} +.sub-menu li.sub-menu-title i{font-size:18px; font-weight:800} +.sub-menu li.sub-menu-title span{padding-left:8px; font-size:15px;} +.sub-menu li.sub-menu-title cite{font-size:12px; margin-left:4px; color:#999} +.sub-menu li.sub-menu-title.active a{color:#4285F4;} +.sub-menu li.sub-menu-li a{padding-left:12px; font-size:14px; display:inline-block; width:100%; box-sizing:border-box;} +.sub-menu li.sub-menu-li a .iconfont{margin-right:8px; font-weight:600} +.sub-menu li.sub-menu-li.active a{color:#4285F4; background-color:#F2F8FF} +.sub-menu li.sub-menu-li span.num{margin-left:4px} + +.file-card {background: #fff;border: 1px solid #f1f1f1;border-radius: 2px; padding:0; margin:4px 6px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.file-card .file-icon{font-size:36px; color:#646464; margin-right: 4px;} +.file-card .file-title {font-size: 12px; letter-spacing: 0; margin-right: 8px; line-height: 16px; word-break: break-all; overflow: hidden; text-overflow: ellipsis; display: -webkit-box;-webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical;width: calc(100% - 108px);} +.file-card .file-title-view{width: calc(100% - 80px);} +.file-card .file-tool .iconfont{font-size:18px; font-weight:600; padding:3px; cursor:pointer;} + +.editormd,.editormd-toolbar,.editormd .CodeMirror,.CodeMirror-gutters{border-color:#eeeeee!important;} +.editormd{margin-bottom:0!important;} +.CodeMirror-gutters{background-color:#fafafa!important;} + +.layui-layer-gougu-admin {box-shadow: 1px 1px 10px rgba(0,0,0,.1); border-radius: 0!important;overflow:initial!important;} +.express-box { position: fixed; z-index:9999; height:100%; right: -100%; top:0;background-color: #fff;} +.express-box article{width:100%; height:100%; overflow:auto;} +.express-mask{ display: none; position: fixed; top: 0; left: 0; z-index: 9998; width: 100%; height: 100%; background-color: rgba(0,0,0,.6); } +.express-close{position: absolute;width:24px;height:60px; padding:20px 6px; line-height:30px;text-align:center; left: -38px;right:0; top: 16%;background-color:#FF5722;color:#fff;border-radius:6px 0 0 6px; cursor:pointer; border:2px solid #fff; border-right:none; font-weight:600; font-size:14px;} +.express-close:hover{opacity:0.9} \ No newline at end of file diff --git a/jun_pc_web/assets/css/icon/bootstrap-icons.css b/jun_pc_web/assets/css/icon/bootstrap-icons.css new file mode 100644 index 000000000..4fb8787fe --- /dev/null +++ b/jun_pc_web/assets/css/icon/bootstrap-icons.css @@ -0,0 +1,1705 @@ +@font-face { + font-family: "bootstrap-icons"; + src: url("./fonts/bootstrap-icons.woff2?08efbba7c53d8c5413793eecb19b20bb") format("woff2"), +url("./fonts/bootstrap-icons.woff?08efbba7c53d8c5413793eecb19b20bb") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-display: block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-1::before { content: "\f2a5"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-1::before { content: "\f68a"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-1::before { content: "\f68d"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-1::before { content: "\f690"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-1::before { content: "\f695"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-1::before { content: "\f698"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-mortorboard-fill::before { content: "\f6a2"; } +.bi-mortorboard::before { content: "\f6a3"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-1::before { content: "\f6b6"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash-1::before { content: "\f6c2"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport-1::before { content: "\f6e0"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-ssd-fill::before { content: "\f6ed"; } +.bi-ssd::before { content: "\f6ee"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt-1::before { content: "\f759"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls-1::before { content: "\f769"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/jun_pc_web/assets/css/icon/fonts/bootstrap-icons.woff b/jun_pc_web/assets/css/icon/fonts/bootstrap-icons.woff new file mode 100644 index 000000000..4cd66b71a Binary files /dev/null and b/jun_pc_web/assets/css/icon/fonts/bootstrap-icons.woff differ diff --git a/jun_pc_web/assets/css/icon/fonts/bootstrap-icons.woff2 b/jun_pc_web/assets/css/icon/fonts/bootstrap-icons.woff2 new file mode 100644 index 000000000..de01cad9d Binary files /dev/null and b/jun_pc_web/assets/css/icon/fonts/bootstrap-icons.woff2 differ diff --git a/jun_pc_web/assets/css/icon/iconfont.css b/jun_pc_web/assets/css/icon/iconfont.css new file mode 100644 index 000000000..02aea319a --- /dev/null +++ b/jun_pc_web/assets/css/icon/iconfont.css @@ -0,0 +1,944 @@ +@font-face { + font-family: "iconfont"; /* Project id 2936988 */ + src: url('iconfont.woff2?t=1701747381700') format('woff2'), + url('iconfont.woff?t=1701747381700') format('woff'), + url('iconfont.ttf?t=1701747381700') format('truetype'), + url('iconfont.svg?t=1701747381700#iconfont') format('svg'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-gengduo1:before { + content: "\e624"; +} + +.icon-gengduo3:before { + content: "\e608"; +} + +.icon-gengduo:before { + content: "\e638"; +} + +.icon-kaoshimoshi-:before { + content: "\e639"; +} + +.icon-daochu:before { + content: "\e60a"; +} + +.icon-daoru:before { + content: "\e60b"; +} + +.icon-shangchuan:before { + content: "\e658"; +} + +.icon-xiazai:before { + content: "\e659"; +} + +.icon-weixin:before { + content: "\e62b"; +} + +.icon-QQ:before { + content: "\e651"; +} + +.icon-suozhu:before { + content: "\e65f"; +} + +.icon-jiesuo:before { + content: "\e660"; +} + +.icon-quanxian:before { + content: "\e610"; +} + +.icon-cuowu:before { + content: "\e642"; +} + +.icon-charulianjie-:before { + content: "\e67b"; +} + +.icon-shanchu:before { + content: "\e607"; +} + +.icon-chakanxiangqing:before { + content: "\e603"; +} + +.icon-xueshengyidong:before { + content: "\e6e9"; +} + +.icon-baokao:before { + content: "\e6ea"; +} + +.icon-chengji:before { + content: "\e6eb"; +} + +.icon-yuejuan:before { + content: "\e6ec"; +} + +.icon-kaoheshezhi:before { + content: "\e6ed"; +} + +.icon-lunwenguanli:before { + content: "\e6ee"; +} + +.icon-shenbao:before { + content: "\e6ef"; +} + +.icon-kecheng:before { + content: "\e6f0"; +} + +.icon-tiku:before { + content: "\e6f1"; +} + +.icon-jiaowushezhi:before { + content: "\e6f2"; +} + +.icon-zidingyishezhi:before { + content: "\e6f3"; +} + +.icon-chaojitongji:before { + content: "\e6f4"; +} + +.icon-zhaoshengtongji:before { + content: "\e6f5"; +} + +.icon-tuiguangtongji:before { + content: "\e6f6"; +} + +.icon-xuexitongji:before { + content: "\e6f7"; +} + +.icon-diqushujutongji:before { + content: "\e6f8"; +} + +.icon-shujudaoru:before { + content: "\e6f9"; +} + +.icon-chengkaoguanli:before { + content: "\e6fb"; +} + +.icon-yuanchengguanli:before { + content: "\e6fe"; +} + +.icon-shujiguanli:before { + content: "\e6ff"; +} + +.icon-guochengxingkaohe:before { + content: "\e700"; +} + +.icon-xuefenrending:before { + content: "\e701"; +} + +.icon-kechengdingdan:before { + content: "\e702"; +} + +.icon-wentifankui:before { + content: "\e703"; +} + +.icon-zichan:before { + content: "\e704"; +} + +.icon-KPIguanli:before { + content: "\e705"; +} + +.icon-xiangmuguanli:before { + content: "\e706"; +} + +.icon-weixingongzhonghao:before { + content: "\e707"; +} + +.icon-anquanshezhi:before { + content: "\e708"; +} + +.icon-fuwuzhongxin:before { + content: "\e709"; +} + +.icon-qiyefuwu:before { + content: "\e70a"; +} + +.icon-wangkefuwu:before { + content: "\e70b"; +} + +.icon-shoufeiguanli:before { + content: "\e70c"; +} + +.icon-quanxianshezhi:before { + content: "\e70d"; +} + +.icon-jiaowutongji:before { + content: "\e70f"; +} + +.icon-jiaoxuetongji:before { + content: "\e710"; +} + +.icon-shoufeitongji:before { + content: "\e711"; +} + +.icon-fuwutongji:before { + content: "\e713"; +} + +.icon-tongzhitongji:before { + content: "\e714"; +} + +.icon-kaohetongji:before { + content: "\e715"; +} + +.icon-yonghuhuoyuedu:before { + content: "\e716"; +} + +.icon-xueshengbaoming:before { + content: "\e717"; +} + +.icon-xueshengluqu:before { + content: "\e718"; +} + +.icon-xueshengzhuce:before { + content: "\e719"; +} + +.icon-zaijixuesheng:before { + content: "\e71a"; +} + +.icon-huamingce:before { + content: "\e71b"; +} + +.icon-fenleiguanli:before { + content: "\e71c"; +} + +.icon-fuwuliebiao:before { + content: "\e71d"; +} + +.icon-fenleiliebiao:before { + content: "\e71e"; +} + +.icon-tongzhiliebiao:before { + content: "\e71f"; +} + +.icon-jiaoxuejihua:before { + content: "\e720"; +} + +.icon-jiaoxueanpai:before { + content: "\e721"; +} + +.icon-chengjiguanli:before { + content: "\e722"; +} + +.icon-tupianguanli:before { + content: "\e723"; +} + +.icon-kaoshijihua:before { + content: "\e724"; +} + +.icon-kaoshipeizhi:before { + content: "\e725"; +} + +.icon-xuexizhongxinguanli:before { + content: "\e726"; +} + +.icon-kaoheguanli:before { + content: "\e728"; +} + +.icon-jiaoshiguanli:before { + content: "\e729"; +} + +.icon-wangkeguanli:before { + content: "\e72a"; +} + +.icon-bulujiesuan:before { + content: "\e72b"; +} + +.icon-biyeguanli:before { + content: "\e72c"; +} + +.icon-kaohezhibiao:before { + content: "\e72d"; +} + +.icon-qiyeguanli:before { + content: "\e77e"; +} + +.icon-chubuguanli:before { + content: "\e77f"; +} + +.icon-hujiaobaobiao:before { + content: "\e780"; +} + +.icon-saomiaodianjing:before { + content: "\e781"; +} + +.icon-jiezhang:before { + content: "\e782"; +} + +.icon-xiaoshoubaobiao:before { + content: "\e783"; +} + +.icon-pingzheng:before { + content: "\e784"; +} + +.icon-hetongyidong:before { + content: "\e785"; +} + +.icon-xiaoshoupin:before { + content: "\e787"; +} + +.icon-xueshuguanli:before { + content: "\e788"; +} + +.icon-yihaopin:before { + content: "\e789"; +} + +.icon-renwuguanli:before { + content: "\e78a"; +} + +.icon-dianshang:before { + content: "\e78b"; +} + +.icon-gudingzichan:before { + content: "\e78d"; +} + +.icon-dongtaiguanli:before { + content: "\e78e"; +} + +.icon-jichupeizhi:before { + content: "\e78f"; +} + +.icon-dashuju:before { + content: "\e792"; +} + +.icon-hujiaoshezhi:before { + content: "\e794"; +} + +.icon-fenxiaoshichang:before { + content: "\e795"; +} + +.icon-chengjitongji:before { + content: "\e796"; +} + +.icon-tuiguangshezhi:before { + content: "\e797"; +} + +.icon-kechengzhongxin:before { + content: "\e798"; +} + +.icon-hetongshezhi:before { + content: "\e799"; +} + +.icon-kechengbaoguanli:before { + content: "\e79a"; +} + +.icon-yonghuguanli:before { + content: "\e79b"; +} + +.icon-yonghuhuaxiang:before { + content: "\e79c"; +} + +.icon-zhanghaoguanli:before { + content: "\e79d"; +} + +.icon-SEMguanli:before { + content: "\e79e"; +} + +.icon-yusuan:before { + content: "\e79f"; +} + +.icon-mingpianbaobiao:before { + content: "\e7a0"; +} + +.icon-dingdanguanli:before { + content: "\e7a1"; +} + +.icon-tuiguangguanli:before { + content: "\e7a2"; +} + +.icon-zhuantiguanli:before { + content: "\e7a3"; +} + +.icon-xiaoshoushezhi:before { + content: "\e7a5"; +} + +.icon-sucaiguanli:before { + content: "\e7a9"; +} + +.icon-xueshengdaoru:before { + content: "\e7aa"; +} + +.icon-shangpinguanli:before { + content: "\e7ab"; +} + +.icon-paikeguanli:before { + content: "\e7ac"; +} + +.icon-xinxidaoru:before { + content: "\e7ad"; +} + +.icon-shoufeipeizhi:before { + content: "\e7ae"; +} + +.icon-yonghuquanxian:before { + content: "\e7af"; +} + +.icon-zaijixueshengguanli:before { + content: "\e7b0"; +} + +.icon-xuehaoguanli:before { + content: "\e7b1"; +} + +.icon-kechengziyuanguanli:before { + content: "\e7b2"; +} + +.icon-mianshoujiaoxueanpai:before { + content: "\e7b3"; +} + +.icon-zhangfang:before { + content: "\e7b4"; +} + +.icon-kaikeguanli:before { + content: "\e7b5"; +} + +.icon-biyetongji:before { + content: "\e7b6"; +} + +.icon-zhaoshengzhunbei:before { + content: "\e7b8"; +} + +.icon-paikeshezhi:before { + content: "\e7b9"; +} + +.icon-banjiguanli:before { + content: "\e7ba"; +} + +.icon-jingpinketang:before { + content: "\e7bb"; +} + +.icon-yuangongtidian:before { + content: "\e7bc"; +} + +.icon-kaoshianpai:before { + content: "\e7bd"; +} + +.icon-wangluojiaoxueanpai:before { + content: "\e7bf"; +} + +.icon-ruxuechengji:before { + content: "\e7c3"; +} + +.icon-mianshoujiaoxue:before { + content: "\e7c6"; +} + +.icon-jiaoshijiaoshiguanli:before { + content: "\e7c7"; +} + +.icon-luquguanli:before { + content: "\e7c8"; +} + +.icon-luquchengji:before { + content: "\e7c9"; +} + +.icon-ziyuan:before { + content: "\e7ca"; +} + +.icon-kejian:before { + content: "\e7cc"; +} + +.icon-waibukejian:before { + content: "\e7cd"; +} + +.icon-rizhiguanli:before { + content: "\e7ce"; +} + +.icon-mobanguanli:before { + content: "\e7cf"; +} + +.icon-yiyichuli:before { + content: "\e7d2"; +} + +.icon-lunwenshenbao:before { + content: "\e7d3"; +} + +.icon-lunwenshezhi:before { + content: "\e7d4"; +} + +.icon-jiaoxuedianshezhi:before { + content: "\e7d5"; +} + +.icon-buluchenjiang:before { + content: "\e7d6"; +} + +.icon-mokuaishezhi:before { + content: "\e7d7"; +} + +.icon-ziliaoguanli:before { + content: "\e7d8"; +} + +.icon-jituanguanli:before { + content: "\e7d9"; +} + +.icon-yingyongguanli:before { + content: "\e7da"; +} + +.icon-guanwangshijuan:before { + content: "\e7db"; +} + +.icon-wodewangke:before { + content: "\e7dc"; +} + +.icon-jiaobenguanli:before { + content: "\e7dd"; +} + +.icon-zhuanyeguanliyuan:before { + content: "\e7de"; +} + +.icon-xueshengchengji:before { + content: "\e7df"; +} + +.icon-fuwuguanli:before { + content: "\e7e2"; +} + +.icon-daijinquan:before { + content: "\e7e3"; +} + +.icon-yinjinshoufei:before { + content: "\e7e5"; +} + +.icon-yingjiaoqingdan:before { + content: "\e7e6"; +} + +.icon-duizhangdan:before { + content: "\e7e7"; +} + +.icon-shangjiguanli:before { + content: "\e7e8"; +} + +.icon-qiyehuihuacundang:before { + content: "\e7e9"; +} + +.icon-yonghushezhi:before { + content: "\e7ea"; +} + +.icon-xiaoxishezhi:before { + content: "\e7ec"; +} + +.icon-yingxiaoshezhi:before { + content: "\e7ed"; +} + +.icon-fuwushichang:before { + content: "\e7ee"; +} + +.icon-sucaiziyuan:before { + content: "\e7ef"; +} + +.icon-yingxiaowanfa:before { + content: "\e7f0"; +} + +.icon-tuiguang:before { + content: "\e7f1"; +} + +.icon-yonghuliebiao:before { + content: "\e7f2"; +} + +.icon-ziyuanguanli:before { + content: "\e692"; +} + +.icon-kechengguanli:before { + content: "\e693"; +} + +.icon-kechengbao:before { + content: "\e694"; +} + +.icon-tikuguanli:before { + content: "\e695"; +} + +.icon-wangkeshichang:before { + content: "\e696"; +} + +.icon-gongdan:before { + content: "\e697"; +} + +.icon-fangkeguanli:before { + content: "\e698"; +} + +.icon-xiansuoguanli:before { + content: "\e699"; +} + +.icon-kehuguanli:before { + content: "\e69a"; +} + +.icon-jituankehu:before { + content: "\e69b"; +} + +.icon-genjinjilu:before { + content: "\e69c"; +} + +.icon-hujiaoguanli:before { + content: "\e69d"; +} + +.icon-gongzuotai:before { + content: "\e69e"; +} + +.icon-shujubaobiao:before { + content: "\e69f"; +} + +.icon-fangkebaobiao:before { + content: "\e6a0"; +} + +.icon-zhangbuguanli:before { + content: "\e6a1"; +} + +.icon-zhangbuguanli_zi:before { + content: "\e6a2"; +} + +.icon-zhangbuguanli_zixitong_A:before { + content: "\e6a3"; +} + +.icon-hetongguanli:before { + content: "\e6a4"; +} + +.icon-yunyingzheguanli:before { + content: "\e6a5"; +} + +.icon-zhaopinguanli:before { + content: "\e6a6"; +} + +.icon-gongziguanli:before { + content: "\e6a7"; +} + +.icon-wodeshenpi:before { + content: "\e6a8"; +} + +.icon-biaozhunmobanshezhi:before { + content: "\e6a9"; +} + +.icon-jichushezhi:before { + content: "\e6aa"; +} + +.icon-caiwushezhi:before { + content: "\e6ab"; +} + +.icon-chanpinshezhi:before { + content: "\e6ac"; +} + +.icon-shenpishezhi:before { + content: "\e6ad"; +} + +.icon-mubiaoguanli:before { + content: "\e6ae"; +} + +.icon-zhandianshezhi:before { + content: "\e6af"; +} + +.icon-renshishezhi:before { + content: "\e6b0"; +} + +.icon-CRMshezhi:before { + content: "\e6b1"; +} + +.icon-mingpianshezhi:before { + content: "\e6b2"; +} + +.icon-wangxiaoshezhi:before { + content: "\e6b3"; +} + +.icon-wodedianping:before { + content: "\e6b4"; +} + +.icon-wodexuesheng:before { + content: "\e6b5"; +} + +.icon-lianxijilu:before { + content: "\e6b8"; +} + +.icon-tousutiwen:before { + content: "\e6b9"; +} + +.icon-peixunjihua:before { + content: "\e6ba"; +} + +.icon-feiyongchaxun:before { + content: "\e6bb"; +} + +.icon-jiaofei:before { + content: "\e6bc"; +} + +.icon-jizhang:before { + content: "\e6bd"; +} + +.icon-chaxun:before { + content: "\e6be"; +} + +.icon-chazhang:before { + content: "\e6bf"; +} + +.icon-baobiao:before { + content: "\e6c0"; +} + +.icon-shezhi:before { + content: "\e6c2"; +} + +.icon-daqiajilu:before { + content: "\e6ce"; +} + +.icon-wangluobanji:before { + content: "\e6d3"; +} + +.icon-wangxiaoshezhi1:before { + content: "\e6d6"; +} + +.icon-houtaishezhi:before { + content: "\e6d8"; +} + +.icon-zhaoshengshezhi:before { + content: "\e6db"; +} + +.icon-xiaoxizhongxin:before { + content: "\e6df"; +} + +.icon-zhaoshengbaobiao:before { + content: "\e6e1"; +} + +.icon-caidanguanli:before { + content: "\e6e2"; +} + +.icon-chuangjianxitong:before { + content: "\e6e5"; +} + +.icon-gongdanguanli:before { + content: "\e6e6"; +} + +.icon-duanxin:before { + content: "\e6e7"; +} + +.icon-bangzhuzhongxin:before { + content: "\e6e8"; +} + diff --git a/jun_pc_web/assets/css/icon/iconfont.woff2 b/jun_pc_web/assets/css/icon/iconfont.woff2 new file mode 100644 index 000000000..4eff2b5d5 Binary files /dev/null and b/jun_pc_web/assets/css/icon/iconfont.woff2 differ diff --git a/jun_pc_web/assets/css/icon/index.html b/jun_pc_web/assets/css/icon/index.html new file mode 100644 index 000000000..755c7606f --- /dev/null +++ b/jun_pc_web/assets/css/icon/index.html @@ -0,0 +1,6714 @@ + + + + + bootstrap-icons + + + + + + +

    bootstrap-icons

    + +
    +
    + +
    bi-123
    +
    +
    + +
    bi-activity
    +
    +
    + +
    bi-alarm-fill
    +
    +
    + +
    bi-alarm
    +
    +
    + +
    bi-align-bottom
    +
    +
    + +
    bi-align-center
    +
    +
    + +
    bi-align-end
    +
    +
    + +
    bi-align-middle
    +
    +
    + +
    bi-align-start
    +
    +
    + +
    bi-align-top
    +
    +
    + +
    bi-alt
    +
    +
    + +
    bi-app-indicator
    +
    +
    + +
    bi-app
    +
    +
    + +
    bi-apple
    +
    +
    + +
    bi-archive-fill
    +
    +
    + +
    bi-archive
    +
    +
    + +
    bi-arrow-90deg-down
    +
    +
    + +
    bi-arrow-90deg-left
    +
    +
    + +
    bi-arrow-90deg-right
    +
    +
    + +
    bi-arrow-90deg-up
    +
    +
    + +
    bi-arrow-bar-down
    +
    +
    + +
    bi-arrow-bar-left
    +
    +
    + +
    bi-arrow-bar-right
    +
    +
    + +
    bi-arrow-bar-up
    +
    +
    + +
    bi-arrow-clockwise
    +
    +
    + +
    bi-arrow-counterclockwise
    +
    +
    + +
    bi-arrow-down-circle-fill
    +
    +
    + +
    bi-arrow-down-circle
    +
    +
    + +
    bi-arrow-down-left-circle-fill
    +
    +
    + +
    bi-arrow-down-left-circle
    +
    +
    + +
    bi-arrow-down-left-square-fill
    +
    +
    + +
    bi-arrow-down-left-square
    +
    +
    + +
    bi-arrow-down-left
    +
    +
    + +
    bi-arrow-down-right-circle-fill
    +
    +
    + +
    bi-arrow-down-right-circle
    +
    +
    + +
    bi-arrow-down-right-square-fill
    +
    +
    + +
    bi-arrow-down-right-square
    +
    +
    + +
    bi-arrow-down-right
    +
    +
    + +
    bi-arrow-down-short
    +
    +
    + +
    bi-arrow-down-square-fill
    +
    +
    + +
    bi-arrow-down-square
    +
    +
    + +
    bi-arrow-down-up
    +
    +
    + +
    bi-arrow-down
    +
    +
    + +
    bi-arrow-left-circle-fill
    +
    +
    + +
    bi-arrow-left-circle
    +
    +
    + +
    bi-arrow-left-right
    +
    +
    + +
    bi-arrow-left-short
    +
    +
    + +
    bi-arrow-left-square-fill
    +
    +
    + +
    bi-arrow-left-square
    +
    +
    + +
    bi-arrow-left
    +
    +
    + +
    bi-arrow-repeat
    +
    +
    + +
    bi-arrow-return-left
    +
    +
    + +
    bi-arrow-return-right
    +
    +
    + +
    bi-arrow-right-circle-fill
    +
    +
    + +
    bi-arrow-right-circle
    +
    +
    + +
    bi-arrow-right-short
    +
    +
    + +
    bi-arrow-right-square-fill
    +
    +
    + +
    bi-arrow-right-square
    +
    +
    + +
    bi-arrow-right
    +
    +
    + +
    bi-arrow-through-heart-fill
    +
    +
    + +
    bi-arrow-through-heart
    +
    +
    + +
    bi-arrow-up-circle-fill
    +
    +
    + +
    bi-arrow-up-circle
    +
    +
    + +
    bi-arrow-up-left-circle-fill
    +
    +
    + +
    bi-arrow-up-left-circle
    +
    +
    + +
    bi-arrow-up-left-square-fill
    +
    +
    + +
    bi-arrow-up-left-square
    +
    +
    + +
    bi-arrow-up-left
    +
    +
    + +
    bi-arrow-up-right-circle-fill
    +
    +
    + +
    bi-arrow-up-right-circle
    +
    +
    + +
    bi-arrow-up-right-square-fill
    +
    +
    + +
    bi-arrow-up-right-square
    +
    +
    + +
    bi-arrow-up-right
    +
    +
    + +
    bi-arrow-up-short
    +
    +
    + +
    bi-arrow-up-square-fill
    +
    +
    + +
    bi-arrow-up-square
    +
    +
    + +
    bi-arrow-up
    +
    +
    + +
    bi-arrows-angle-contract
    +
    +
    + +
    bi-arrows-angle-expand
    +
    +
    + +
    bi-arrows-collapse
    +
    +
    + +
    bi-arrows-expand
    +
    +
    + +
    bi-arrows-fullscreen
    +
    +
    + +
    bi-arrows-move
    +
    +
    + +
    bi-aspect-ratio-fill
    +
    +
    + +
    bi-aspect-ratio
    +
    +
    + +
    bi-asterisk
    +
    +
    + +
    bi-at
    +
    +
    + +
    bi-award-fill
    +
    +
    + +
    bi-award
    +
    +
    + +
    bi-back
    +
    +
    + +
    bi-backspace-fill
    +
    +
    + +
    bi-backspace-reverse-fill
    +
    +
    + +
    bi-backspace-reverse
    +
    +
    + +
    bi-backspace
    +
    +
    + +
    bi-badge-3d-fill
    +
    +
    + +
    bi-badge-3d
    +
    +
    + +
    bi-badge-4k-fill
    +
    +
    + +
    bi-badge-4k
    +
    +
    + +
    bi-badge-8k-fill
    +
    +
    + +
    bi-badge-8k
    +
    +
    + +
    bi-badge-ad-fill
    +
    +
    + +
    bi-badge-ad
    +
    +
    + +
    bi-badge-ar-fill
    +
    +
    + +
    bi-badge-ar
    +
    +
    + +
    bi-badge-cc-fill
    +
    +
    + +
    bi-badge-cc
    +
    +
    + +
    bi-badge-hd-fill
    +
    +
    + +
    bi-badge-hd
    +
    +
    + +
    bi-badge-sd-fill
    +
    +
    + +
    bi-badge-sd
    +
    +
    + +
    bi-badge-tm-fill
    +
    +
    + +
    bi-badge-tm
    +
    +
    + +
    bi-badge-vo-fill
    +
    +
    + +
    bi-badge-vo
    +
    +
    + +
    bi-badge-vr-fill
    +
    +
    + +
    bi-badge-vr
    +
    +
    + +
    bi-badge-wc-fill
    +
    +
    + +
    bi-badge-wc
    +
    +
    + +
    bi-bag-check-fill
    +
    +
    + +
    bi-bag-check
    +
    +
    + +
    bi-bag-dash-fill
    +
    +
    + +
    bi-bag-dash
    +
    +
    + +
    bi-bag-fill
    +
    +
    + +
    bi-bag-heart-fill
    +
    +
    + +
    bi-bag-heart
    +
    +
    + +
    bi-bag-plus-fill
    +
    +
    + +
    bi-bag-plus
    +
    +
    + +
    bi-bag-x-fill
    +
    +
    + +
    bi-bag-x
    +
    +
    + +
    bi-bag
    +
    +
    + +
    bi-balloon-fill
    +
    +
    + +
    bi-balloon-heart-fill
    +
    +
    + +
    bi-balloon-heart
    +
    +
    + +
    bi-balloon
    +
    +
    + +
    bi-bandaid-fill
    +
    +
    + +
    bi-bandaid
    +
    +
    + +
    bi-bank
    +
    +
    + +
    bi-bank2
    +
    +
    + +
    bi-bar-chart-fill
    +
    +
    + +
    bi-bar-chart-line-fill
    +
    +
    + +
    bi-bar-chart-line
    +
    +
    + +
    bi-bar-chart-steps
    +
    +
    + +
    bi-bar-chart
    +
    +
    + +
    bi-basket-fill
    +
    +
    + +
    bi-basket
    +
    +
    + +
    bi-basket2-fill
    +
    +
    + +
    bi-basket2
    +
    +
    + +
    bi-basket3-fill
    +
    +
    + +
    bi-basket3
    +
    +
    + +
    bi-battery-charging
    +
    +
    + +
    bi-battery-full
    +
    +
    + +
    bi-battery-half
    +
    +
    + +
    bi-battery
    +
    +
    + +
    bi-behance
    +
    +
    + +
    bi-bell-fill
    +
    +
    + +
    bi-bell-slash-fill
    +
    +
    + +
    bi-bell-slash
    +
    +
    + +
    bi-bell
    +
    +
    + +
    bi-bezier
    +
    +
    + +
    bi-bezier2
    +
    +
    + +
    bi-bicycle
    +
    +
    + +
    bi-binoculars-fill
    +
    +
    + +
    bi-binoculars
    +
    +
    + +
    bi-blockquote-left
    +
    +
    + +
    bi-blockquote-right
    +
    +
    + +
    bi-bluetooth
    +
    +
    + +
    bi-body-text
    +
    +
    + +
    bi-book-fill
    +
    +
    + +
    bi-book-half
    +
    +
    + +
    bi-book
    +
    +
    + +
    bi-bookmark-check-fill
    +
    +
    + +
    bi-bookmark-check
    +
    +
    + +
    bi-bookmark-dash-fill
    +
    +
    + +
    bi-bookmark-dash
    +
    +
    + +
    bi-bookmark-fill
    +
    +
    + +
    bi-bookmark-heart-fill
    +
    +
    + +
    bi-bookmark-heart
    +
    +
    + +
    bi-bookmark-plus-fill
    +
    +
    + +
    bi-bookmark-plus
    +
    +
    + +
    bi-bookmark-star-fill
    +
    +
    + +
    bi-bookmark-star
    +
    +
    + +
    bi-bookmark-x-fill
    +
    +
    + +
    bi-bookmark-x
    +
    +
    + +
    bi-bookmark
    +
    +
    + +
    bi-bookmarks-fill
    +
    +
    + +
    bi-bookmarks
    +
    +
    + +
    bi-bookshelf
    +
    +
    + +
    bi-boombox-fill
    +
    +
    + +
    bi-boombox
    +
    +
    + +
    bi-bootstrap-fill
    +
    +
    + +
    bi-bootstrap-reboot
    +
    +
    + +
    bi-bootstrap
    +
    +
    + +
    bi-border-all
    +
    +
    + +
    bi-border-bottom
    +
    +
    + +
    bi-border-center
    +
    +
    + +
    bi-border-inner
    +
    +
    + +
    bi-border-left
    +
    +
    + +
    bi-border-middle
    +
    +
    + +
    bi-border-outer
    +
    +
    + +
    bi-border-right
    +
    +
    + +
    bi-border-style
    +
    +
    + +
    bi-border-top
    +
    +
    + +
    bi-border-width
    +
    +
    + +
    bi-border
    +
    +
    + +
    bi-bounding-box-circles
    +
    +
    + +
    bi-bounding-box
    +
    +
    + +
    bi-box-arrow-down-left
    +
    +
    + +
    bi-box-arrow-down-right
    +
    +
    + +
    bi-box-arrow-down
    +
    +
    + +
    bi-box-arrow-in-down-left
    +
    +
    + +
    bi-box-arrow-in-down-right
    +
    +
    + +
    bi-box-arrow-in-down
    +
    +
    + +
    bi-box-arrow-in-left
    +
    +
    + +
    bi-box-arrow-in-right
    +
    +
    + +
    bi-box-arrow-in-up-left
    +
    +
    + +
    bi-box-arrow-in-up-right
    +
    +
    + +
    bi-box-arrow-in-up
    +
    +
    + +
    bi-box-arrow-left
    +
    +
    + +
    bi-box-arrow-right
    +
    +
    + +
    bi-box-arrow-up-left
    +
    +
    + +
    bi-box-arrow-up-right
    +
    +
    + +
    bi-box-arrow-up
    +
    +
    + +
    bi-box-seam
    +
    +
    + +
    bi-box
    +
    +
    + +
    bi-box2-fill
    +
    +
    + +
    bi-box2-heart-fill
    +
    +
    + +
    bi-box2-heart
    +
    +
    + +
    bi-box2
    +
    +
    + +
    bi-boxes
    +
    +
    + +
    bi-braces-asterisk
    +
    +
    + +
    bi-braces
    +
    +
    + +
    bi-bricks
    +
    +
    + +
    bi-briefcase-fill
    +
    +
    + +
    bi-briefcase
    +
    +
    + +
    bi-brightness-alt-high-fill
    +
    +
    + +
    bi-brightness-alt-high
    +
    +
    + +
    bi-brightness-alt-low-fill
    +
    +
    + +
    bi-brightness-alt-low
    +
    +
    + +
    bi-brightness-high-fill
    +
    +
    + +
    bi-brightness-high
    +
    +
    + +
    bi-brightness-low-fill
    +
    +
    + +
    bi-brightness-low
    +
    +
    + +
    bi-broadcast-pin
    +
    +
    + +
    bi-broadcast
    +
    +
    + +
    bi-brush-fill
    +
    +
    + +
    bi-brush
    +
    +
    + +
    bi-bucket-fill
    +
    +
    + +
    bi-bucket
    +
    +
    + +
    bi-bug-fill
    +
    +
    + +
    bi-bug
    +
    +
    + +
    bi-building
    +
    +
    + +
    bi-bullseye
    +
    +
    + +
    bi-calculator-fill
    +
    +
    + +
    bi-calculator
    +
    +
    + +
    bi-calendar-check-fill
    +
    +
    + +
    bi-calendar-check
    +
    +
    + +
    bi-calendar-date-fill
    +
    +
    + +
    bi-calendar-date
    +
    +
    + +
    bi-calendar-day-fill
    +
    +
    + +
    bi-calendar-day
    +
    +
    + +
    bi-calendar-event-fill
    +
    +
    + +
    bi-calendar-event
    +
    +
    + +
    bi-calendar-fill
    +
    +
    + +
    bi-calendar-heart-fill
    +
    +
    + +
    bi-calendar-heart
    +
    +
    + +
    bi-calendar-minus-fill
    +
    +
    + +
    bi-calendar-minus
    +
    +
    + +
    bi-calendar-month-fill
    +
    +
    + +
    bi-calendar-month
    +
    +
    + +
    bi-calendar-plus-fill
    +
    +
    + +
    bi-calendar-plus
    +
    +
    + +
    bi-calendar-range-fill
    +
    +
    + +
    bi-calendar-range
    +
    +
    + +
    bi-calendar-week-fill
    +
    +
    + +
    bi-calendar-week
    +
    +
    + +
    bi-calendar-x-fill
    +
    +
    + +
    bi-calendar-x
    +
    +
    + +
    bi-calendar
    +
    +
    + +
    bi-calendar2-check-fill
    +
    +
    + +
    bi-calendar2-check
    +
    +
    + +
    bi-calendar2-date-fill
    +
    +
    + +
    bi-calendar2-date
    +
    +
    + +
    bi-calendar2-day-fill
    +
    +
    + +
    bi-calendar2-day
    +
    +
    + +
    bi-calendar2-event-fill
    +
    +
    + +
    bi-calendar2-event
    +
    +
    + +
    bi-calendar2-fill
    +
    +
    + +
    bi-calendar2-heart-fill
    +
    +
    + +
    bi-calendar2-heart
    +
    +
    + +
    bi-calendar2-minus-fill
    +
    +
    + +
    bi-calendar2-minus
    +
    +
    + +
    bi-calendar2-month-fill
    +
    +
    + +
    bi-calendar2-month
    +
    +
    + +
    bi-calendar2-plus-fill
    +
    +
    + +
    bi-calendar2-plus
    +
    +
    + +
    bi-calendar2-range-fill
    +
    +
    + +
    bi-calendar2-range
    +
    +
    + +
    bi-calendar2-week-fill
    +
    +
    + +
    bi-calendar2-week
    +
    +
    + +
    bi-calendar2-x-fill
    +
    +
    + +
    bi-calendar2-x
    +
    +
    + +
    bi-calendar2
    +
    +
    + +
    bi-calendar3-event-fill
    +
    +
    + +
    bi-calendar3-event
    +
    +
    + +
    bi-calendar3-fill
    +
    +
    + +
    bi-calendar3-range-fill
    +
    +
    + +
    bi-calendar3-range
    +
    +
    + +
    bi-calendar3-week-fill
    +
    +
    + +
    bi-calendar3-week
    +
    +
    + +
    bi-calendar3
    +
    +
    + +
    bi-calendar4-event
    +
    +
    + +
    bi-calendar4-range
    +
    +
    + +
    bi-calendar4-week
    +
    +
    + +
    bi-calendar4
    +
    +
    + +
    bi-camera-fill
    +
    +
    + +
    bi-camera-reels-fill
    +
    +
    + +
    bi-camera-reels
    +
    +
    + +
    bi-camera-video-fill
    +
    +
    + +
    bi-camera-video-off-fill
    +
    +
    + +
    bi-camera-video-off
    +
    +
    + +
    bi-camera-video
    +
    +
    + +
    bi-camera
    +
    +
    + +
    bi-camera2
    +
    +
    + +
    bi-capslock-fill
    +
    +
    + +
    bi-capslock
    +
    +
    + +
    bi-card-checklist
    +
    +
    + +
    bi-card-heading
    +
    +
    + +
    bi-card-image
    +
    +
    + +
    bi-card-list
    +
    +
    + +
    bi-card-text
    +
    +
    + +
    bi-caret-down-fill
    +
    +
    + +
    bi-caret-down-square-fill
    +
    +
    + +
    bi-caret-down-square
    +
    +
    + +
    bi-caret-down
    +
    +
    + +
    bi-caret-left-fill
    +
    +
    + +
    bi-caret-left-square-fill
    +
    +
    + +
    bi-caret-left-square
    +
    +
    + +
    bi-caret-left
    +
    +
    + +
    bi-caret-right-fill
    +
    +
    + +
    bi-caret-right-square-fill
    +
    +
    + +
    bi-caret-right-square
    +
    +
    + +
    bi-caret-right
    +
    +
    + +
    bi-caret-up-fill
    +
    +
    + +
    bi-caret-up-square-fill
    +
    +
    + +
    bi-caret-up-square
    +
    +
    + +
    bi-caret-up
    +
    +
    + +
    bi-cart-check-fill
    +
    +
    + +
    bi-cart-check
    +
    +
    + +
    bi-cart-dash-fill
    +
    +
    + +
    bi-cart-dash
    +
    +
    + +
    bi-cart-fill
    +
    +
    + +
    bi-cart-plus-fill
    +
    +
    + +
    bi-cart-plus
    +
    +
    + +
    bi-cart-x-fill
    +
    +
    + +
    bi-cart-x
    +
    +
    + +
    bi-cart
    +
    +
    + +
    bi-cart2
    +
    +
    + +
    bi-cart3
    +
    +
    + +
    bi-cart4
    +
    +
    + +
    bi-cash-coin
    +
    +
    + +
    bi-cash-stack
    +
    +
    + +
    bi-cash
    +
    +
    + +
    bi-cast
    +
    +
    + +
    bi-chat-dots-fill
    +
    +
    + +
    bi-chat-dots
    +
    +
    + +
    bi-chat-fill
    +
    +
    + +
    bi-chat-heart-fill
    +
    +
    + +
    bi-chat-heart
    +
    +
    + +
    bi-chat-left-dots-fill
    +
    +
    + +
    bi-chat-left-dots
    +
    +
    + +
    bi-chat-left-fill
    +
    +
    + +
    bi-chat-left-heart-fill
    +
    +
    + +
    bi-chat-left-heart
    +
    +
    + +
    bi-chat-left-quote-fill
    +
    +
    + +
    bi-chat-left-quote
    +
    +
    + +
    bi-chat-left-text-fill
    +
    +
    + +
    bi-chat-left-text
    +
    +
    + +
    bi-chat-left
    +
    +
    + +
    bi-chat-quote-fill
    +
    +
    + +
    bi-chat-quote
    +
    +
    + +
    bi-chat-right-dots-fill
    +
    +
    + +
    bi-chat-right-dots
    +
    +
    + +
    bi-chat-right-fill
    +
    +
    + +
    bi-chat-right-heart-fill
    +
    +
    + +
    bi-chat-right-heart
    +
    +
    + +
    bi-chat-right-quote-fill
    +
    +
    + +
    bi-chat-right-quote
    +
    +
    + +
    bi-chat-right-text-fill
    +
    +
    + +
    bi-chat-right-text
    +
    +
    + +
    bi-chat-right
    +
    +
    + +
    bi-chat-square-dots-fill
    +
    +
    + +
    bi-chat-square-dots
    +
    +
    + +
    bi-chat-square-fill
    +
    +
    + +
    bi-chat-square-heart-fill
    +
    +
    + +
    bi-chat-square-heart
    +
    +
    + +
    bi-chat-square-quote-fill
    +
    +
    + +
    bi-chat-square-quote
    +
    +
    + +
    bi-chat-square-text-fill
    +
    +
    + +
    bi-chat-square-text
    +
    +
    + +
    bi-chat-square
    +
    +
    + +
    bi-chat-text-fill
    +
    +
    + +
    bi-chat-text
    +
    +
    + +
    bi-chat
    +
    +
    + +
    bi-check-all
    +
    +
    + +
    bi-check-circle-fill
    +
    +
    + +
    bi-check-circle
    +
    +
    + +
    bi-check-lg
    +
    +
    + +
    bi-check-square-fill
    +
    +
    + +
    bi-check-square
    +
    +
    + +
    bi-check
    +
    +
    + +
    bi-check2-all
    +
    +
    + +
    bi-check2-circle
    +
    +
    + +
    bi-check2-square
    +
    +
    + +
    bi-check2
    +
    +
    + +
    bi-chevron-bar-contract
    +
    +
    + +
    bi-chevron-bar-down
    +
    +
    + +
    bi-chevron-bar-expand
    +
    +
    + +
    bi-chevron-bar-left
    +
    +
    + +
    bi-chevron-bar-right
    +
    +
    + +
    bi-chevron-bar-up
    +
    +
    + +
    bi-chevron-compact-down
    +
    +
    + +
    bi-chevron-compact-left
    +
    +
    + +
    bi-chevron-compact-right
    +
    +
    + +
    bi-chevron-compact-up
    +
    +
    + +
    bi-chevron-contract
    +
    +
    + +
    bi-chevron-double-down
    +
    +
    + +
    bi-chevron-double-left
    +
    +
    + +
    bi-chevron-double-right
    +
    +
    + +
    bi-chevron-double-up
    +
    +
    + +
    bi-chevron-down
    +
    +
    + +
    bi-chevron-expand
    +
    +
    + +
    bi-chevron-left
    +
    +
    + +
    bi-chevron-right
    +
    +
    + +
    bi-chevron-up
    +
    +
    + +
    bi-circle-fill
    +
    +
    + +
    bi-circle-half
    +
    +
    + +
    bi-circle-square
    +
    +
    + +
    bi-circle
    +
    +
    + +
    bi-clipboard-check-fill
    +
    +
    + +
    bi-clipboard-check
    +
    +
    + +
    bi-clipboard-data-fill
    +
    +
    + +
    bi-clipboard-data
    +
    +
    + +
    bi-clipboard-fill
    +
    +
    + +
    bi-clipboard-heart-fill
    +
    +
    + +
    bi-clipboard-heart
    +
    +
    + +
    bi-clipboard-minus-fill
    +
    +
    + +
    bi-clipboard-minus
    +
    +
    + +
    bi-clipboard-plus-fill
    +
    +
    + +
    bi-clipboard-plus
    +
    +
    + +
    bi-clipboard-pulse
    +
    +
    + +
    bi-clipboard-x-fill
    +
    +
    + +
    bi-clipboard-x
    +
    +
    + +
    bi-clipboard
    +
    +
    + +
    bi-clipboard2-check-fill
    +
    +
    + +
    bi-clipboard2-check
    +
    +
    + +
    bi-clipboard2-data-fill
    +
    +
    + +
    bi-clipboard2-data
    +
    +
    + +
    bi-clipboard2-fill
    +
    +
    + +
    bi-clipboard2-heart-fill
    +
    +
    + +
    bi-clipboard2-heart
    +
    +
    + +
    bi-clipboard2-minus-fill
    +
    +
    + +
    bi-clipboard2-minus
    +
    +
    + +
    bi-clipboard2-plus-fill
    +
    +
    + +
    bi-clipboard2-plus
    +
    +
    + +
    bi-clipboard2-pulse-fill
    +
    +
    + +
    bi-clipboard2-pulse
    +
    +
    + +
    bi-clipboard2-x-fill
    +
    +
    + +
    bi-clipboard2-x
    +
    +
    + +
    bi-clipboard2
    +
    +
    + +
    bi-clock-fill
    +
    +
    + +
    bi-clock-history
    +
    +
    + +
    bi-clock
    +
    +
    + +
    bi-cloud-arrow-down-fill
    +
    +
    + +
    bi-cloud-arrow-down
    +
    +
    + +
    bi-cloud-arrow-up-fill
    +
    +
    + +
    bi-cloud-arrow-up
    +
    +
    + +
    bi-cloud-check-fill
    +
    +
    + +
    bi-cloud-check
    +
    +
    + +
    bi-cloud-download-fill
    +
    +
    + +
    bi-cloud-download
    +
    +
    + +
    bi-cloud-drizzle-fill
    +
    +
    + +
    bi-cloud-drizzle
    +
    +
    + +
    bi-cloud-fill
    +
    +
    + +
    bi-cloud-fog-fill
    +
    +
    + +
    bi-cloud-fog
    +
    +
    + +
    bi-cloud-fog2-fill
    +
    +
    + +
    bi-cloud-fog2
    +
    +
    + +
    bi-cloud-hail-fill
    +
    +
    + +
    bi-cloud-hail
    +
    +
    + +
    bi-cloud-haze-fill
    +
    +
    + +
    bi-cloud-haze
    +
    +
    + +
    bi-cloud-haze2-fill
    +
    +
    + +
    bi-cloud-haze2
    +
    +
    + +
    bi-cloud-lightning-fill
    +
    +
    + +
    bi-cloud-lightning-rain-fill
    +
    +
    + +
    bi-cloud-lightning-rain
    +
    +
    + +
    bi-cloud-lightning
    +
    +
    + +
    bi-cloud-minus-fill
    +
    +
    + +
    bi-cloud-minus
    +
    +
    + +
    bi-cloud-moon-fill
    +
    +
    + +
    bi-cloud-moon
    +
    +
    + +
    bi-cloud-plus-fill
    +
    +
    + +
    bi-cloud-plus
    +
    +
    + +
    bi-cloud-rain-fill
    +
    +
    + +
    bi-cloud-rain-heavy-fill
    +
    +
    + +
    bi-cloud-rain-heavy
    +
    +
    + +
    bi-cloud-rain
    +
    +
    + +
    bi-cloud-slash-fill
    +
    +
    + +
    bi-cloud-slash
    +
    +
    + +
    bi-cloud-sleet-fill
    +
    +
    + +
    bi-cloud-sleet
    +
    +
    + +
    bi-cloud-snow-fill
    +
    +
    + +
    bi-cloud-snow
    +
    +
    + +
    bi-cloud-sun-fill
    +
    +
    + +
    bi-cloud-sun
    +
    +
    + +
    bi-cloud-upload-fill
    +
    +
    + +
    bi-cloud-upload
    +
    +
    + +
    bi-cloud
    +
    +
    + +
    bi-clouds-fill
    +
    +
    + +
    bi-clouds
    +
    +
    + +
    bi-cloudy-fill
    +
    +
    + +
    bi-cloudy
    +
    +
    + +
    bi-code-slash
    +
    +
    + +
    bi-code-square
    +
    +
    + +
    bi-code
    +
    +
    + +
    bi-coin
    +
    +
    + +
    bi-collection-fill
    +
    +
    + +
    bi-collection-play-fill
    +
    +
    + +
    bi-collection-play
    +
    +
    + +
    bi-collection
    +
    +
    + +
    bi-columns-gap
    +
    +
    + +
    bi-columns
    +
    +
    + +
    bi-command
    +
    +
    + +
    bi-compass-fill
    +
    +
    + +
    bi-compass
    +
    +
    + +
    bi-cone-striped
    +
    +
    + +
    bi-cone
    +
    +
    + +
    bi-controller
    +
    +
    + +
    bi-cpu-fill
    +
    +
    + +
    bi-cpu
    +
    +
    + +
    bi-credit-card-2-back-fill
    +
    +
    + +
    bi-credit-card-2-back
    +
    +
    + +
    bi-credit-card-2-front-fill
    +
    +
    + +
    bi-credit-card-2-front
    +
    +
    + +
    bi-credit-card-fill
    +
    +
    + +
    bi-credit-card
    +
    +
    + +
    bi-crop
    +
    +
    + +
    bi-cup-fill
    +
    +
    + +
    bi-cup-straw
    +
    +
    + +
    bi-cup
    +
    +
    + +
    bi-currency-bitcoin
    +
    +
    + +
    bi-currency-dollar
    +
    +
    + +
    bi-currency-euro
    +
    +
    + +
    bi-currency-exchange
    +
    +
    + +
    bi-currency-pound
    +
    +
    + +
    bi-currency-yen
    +
    +
    + +
    bi-cursor-fill
    +
    +
    + +
    bi-cursor-text
    +
    +
    + +
    bi-cursor
    +
    +
    + +
    bi-dash-circle-dotted
    +
    +
    + +
    bi-dash-circle-fill
    +
    +
    + +
    bi-dash-circle
    +
    +
    + +
    bi-dash-lg
    +
    +
    + +
    bi-dash-square-dotted
    +
    +
    + +
    bi-dash-square-fill
    +
    +
    + +
    bi-dash-square
    +
    +
    + +
    bi-dash
    +
    +
    + +
    bi-device-hdd-fill
    +
    +
    + +
    bi-device-hdd
    +
    +
    + +
    bi-device-ssd-fill
    +
    +
    + +
    bi-device-ssd
    +
    +
    + +
    bi-diagram-2-fill
    +
    +
    + +
    bi-diagram-2
    +
    +
    + +
    bi-diagram-3-fill
    +
    +
    + +
    bi-diagram-3
    +
    +
    + +
    bi-diamond-fill
    +
    +
    + +
    bi-diamond-half
    +
    +
    + +
    bi-diamond
    +
    +
    + +
    bi-dice-1-fill
    +
    +
    + +
    bi-dice-1
    +
    +
    + +
    bi-dice-2-fill
    +
    +
    + +
    bi-dice-2
    +
    +
    + +
    bi-dice-3-fill
    +
    +
    + +
    bi-dice-3
    +
    +
    + +
    bi-dice-4-fill
    +
    +
    + +
    bi-dice-4
    +
    +
    + +
    bi-dice-5-fill
    +
    +
    + +
    bi-dice-5
    +
    +
    + +
    bi-dice-6-fill
    +
    +
    + +
    bi-dice-6
    +
    +
    + +
    bi-disc-fill
    +
    +
    + +
    bi-disc
    +
    +
    + +
    bi-discord
    +
    +
    + +
    bi-display-fill
    +
    +
    + +
    bi-display
    +
    +
    + +
    bi-displayport-fill
    +
    +
    + +
    bi-displayport
    +
    +
    + +
    bi-distribute-horizontal
    +
    +
    + +
    bi-distribute-vertical
    +
    +
    + +
    bi-door-closed-fill
    +
    +
    + +
    bi-door-closed
    +
    +
    + +
    bi-door-open-fill
    +
    +
    + +
    bi-door-open
    +
    +
    + +
    bi-dot
    +
    +
    + +
    bi-download
    +
    +
    + +
    bi-dpad-fill
    +
    +
    + +
    bi-dpad
    +
    +
    + +
    bi-dribbble
    +
    +
    + +
    bi-droplet-fill
    +
    +
    + +
    bi-droplet-half
    +
    +
    + +
    bi-droplet
    +
    +
    + +
    bi-ear-fill
    +
    +
    + +
    bi-ear
    +
    +
    + +
    bi-earbuds
    +
    +
    + +
    bi-easel-fill
    +
    +
    + +
    bi-easel
    +
    +
    + +
    bi-easel2-fill
    +
    +
    + +
    bi-easel2
    +
    +
    + +
    bi-easel3-fill
    +
    +
    + +
    bi-easel3
    +
    +
    + +
    bi-egg-fill
    +
    +
    + +
    bi-egg-fried
    +
    +
    + +
    bi-egg
    +
    +
    + +
    bi-eject-fill
    +
    +
    + +
    bi-eject
    +
    +
    + +
    bi-emoji-angry-fill
    +
    +
    + +
    bi-emoji-angry
    +
    +
    + +
    bi-emoji-dizzy-fill
    +
    +
    + +
    bi-emoji-dizzy
    +
    +
    + +
    bi-emoji-expressionless-fill
    +
    +
    + +
    bi-emoji-expressionless
    +
    +
    + +
    bi-emoji-frown-fill
    +
    +
    + +
    bi-emoji-frown
    +
    +
    + +
    bi-emoji-heart-eyes-fill
    +
    +
    + +
    bi-emoji-heart-eyes
    +
    +
    + +
    bi-emoji-kiss-fill
    +
    +
    + +
    bi-emoji-kiss
    +
    +
    + +
    bi-emoji-laughing-fill
    +
    +
    + +
    bi-emoji-laughing
    +
    +
    + +
    bi-emoji-neutral-fill
    +
    +
    + +
    bi-emoji-neutral
    +
    +
    + +
    bi-emoji-smile-fill
    +
    +
    + +
    bi-emoji-smile-upside-down-fill
    +
    +
    + +
    bi-emoji-smile-upside-down
    +
    +
    + +
    bi-emoji-smile
    +
    +
    + +
    bi-emoji-sunglasses-fill
    +
    +
    + +
    bi-emoji-sunglasses
    +
    +
    + +
    bi-emoji-wink-fill
    +
    +
    + +
    bi-emoji-wink
    +
    +
    + +
    bi-envelope-check-fill
    +
    +
    + +
    bi-envelope-check
    +
    +
    + +
    bi-envelope-dash-fill
    +
    +
    + +
    bi-envelope-dash
    +
    +
    + +
    bi-envelope-exclamation-fill
    +
    +
    + +
    bi-envelope-exclamation
    +
    +
    + +
    bi-envelope-fill
    +
    +
    + +
    bi-envelope-heart-fill
    +
    +
    + +
    bi-envelope-heart
    +
    +
    + +
    bi-envelope-open-fill
    +
    +
    + +
    bi-envelope-open-heart-fill
    +
    +
    + +
    bi-envelope-open-heart
    +
    +
    + +
    bi-envelope-open
    +
    +
    + +
    bi-envelope-paper-fill
    +
    +
    + +
    bi-envelope-paper-heart-fill
    +
    +
    + +
    bi-envelope-paper-heart
    +
    +
    + +
    bi-envelope-paper
    +
    +
    + +
    bi-envelope-plus-fill
    +
    +
    + +
    bi-envelope-plus
    +
    +
    + +
    bi-envelope-slash-fill
    +
    +
    + +
    bi-envelope-slash
    +
    +
    + +
    bi-envelope-x-fill
    +
    +
    + +
    bi-envelope-x
    +
    +
    + +
    bi-envelope
    +
    +
    + +
    bi-eraser-fill
    +
    +
    + +
    bi-eraser
    +
    +
    + +
    bi-ethernet
    +
    +
    + +
    bi-exclamation-circle-fill
    +
    +
    + +
    bi-exclamation-circle
    +
    +
    + +
    bi-exclamation-diamond-fill
    +
    +
    + +
    bi-exclamation-diamond
    +
    +
    + +
    bi-exclamation-lg
    +
    +
    + +
    bi-exclamation-octagon-fill
    +
    +
    + +
    bi-exclamation-octagon
    +
    +
    + +
    bi-exclamation-square-fill
    +
    +
    + +
    bi-exclamation-square
    +
    +
    + +
    bi-exclamation-triangle-fill
    +
    +
    + +
    bi-exclamation-triangle
    +
    +
    + +
    bi-exclamation
    +
    +
    + +
    bi-exclude
    +
    +
    + +
    bi-explicit-fill
    +
    +
    + +
    bi-explicit
    +
    +
    + +
    bi-eye-fill
    +
    +
    + +
    bi-eye-slash-fill
    +
    +
    + +
    bi-eye-slash
    +
    +
    + +
    bi-eye
    +
    +
    + +
    bi-eyedropper
    +
    +
    + +
    bi-eyeglasses
    +
    +
    + +
    bi-facebook
    +
    +
    + +
    bi-fan
    +
    +
    + +
    bi-file-arrow-down-fill
    +
    +
    + +
    bi-file-arrow-down
    +
    +
    + +
    bi-file-arrow-up-fill
    +
    +
    + +
    bi-file-arrow-up
    +
    +
    + +
    bi-file-bar-graph-fill
    +
    +
    + +
    bi-file-bar-graph
    +
    +
    + +
    bi-file-binary-fill
    +
    +
    + +
    bi-file-binary
    +
    +
    + +
    bi-file-break-fill
    +
    +
    + +
    bi-file-break
    +
    +
    + +
    bi-file-check-fill
    +
    +
    + +
    bi-file-check
    +
    +
    + +
    bi-file-code-fill
    +
    +
    + +
    bi-file-code
    +
    +
    + +
    bi-file-diff-fill
    +
    +
    + +
    bi-file-diff
    +
    +
    + +
    bi-file-earmark-arrow-down-fill
    +
    +
    + +
    bi-file-earmark-arrow-down
    +
    +
    + +
    bi-file-earmark-arrow-up-fill
    +
    +
    + +
    bi-file-earmark-arrow-up
    +
    +
    + +
    bi-file-earmark-bar-graph-fill
    +
    +
    + +
    bi-file-earmark-bar-graph
    +
    +
    + +
    bi-file-earmark-binary-fill
    +
    +
    + +
    bi-file-earmark-binary
    +
    +
    + +
    bi-file-earmark-break-fill
    +
    +
    + +
    bi-file-earmark-break
    +
    +
    + +
    bi-file-earmark-check-fill
    +
    +
    + +
    bi-file-earmark-check
    +
    +
    + +
    bi-file-earmark-code-fill
    +
    +
    + +
    bi-file-earmark-code
    +
    +
    + +
    bi-file-earmark-diff-fill
    +
    +
    + +
    bi-file-earmark-diff
    +
    +
    + +
    bi-file-earmark-easel-fill
    +
    +
    + +
    bi-file-earmark-easel
    +
    +
    + +
    bi-file-earmark-excel-fill
    +
    +
    + +
    bi-file-earmark-excel
    +
    +
    + +
    bi-file-earmark-fill
    +
    +
    + +
    bi-file-earmark-font-fill
    +
    +
    + +
    bi-file-earmark-font
    +
    +
    + +
    bi-file-earmark-image-fill
    +
    +
    + +
    bi-file-earmark-image
    +
    +
    + +
    bi-file-earmark-lock-fill
    +
    +
    + +
    bi-file-earmark-lock
    +
    +
    + +
    bi-file-earmark-lock2-fill
    +
    +
    + +
    bi-file-earmark-lock2
    +
    +
    + +
    bi-file-earmark-medical-fill
    +
    +
    + +
    bi-file-earmark-medical
    +
    +
    + +
    bi-file-earmark-minus-fill
    +
    +
    + +
    bi-file-earmark-minus
    +
    +
    + +
    bi-file-earmark-music-fill
    +
    +
    + +
    bi-file-earmark-music
    +
    +
    + +
    bi-file-earmark-pdf-fill
    +
    +
    + +
    bi-file-earmark-pdf
    +
    +
    + +
    bi-file-earmark-person-fill
    +
    +
    + +
    bi-file-earmark-person
    +
    +
    + +
    bi-file-earmark-play-fill
    +
    +
    + +
    bi-file-earmark-play
    +
    +
    + +
    bi-file-earmark-plus-fill
    +
    +
    + +
    bi-file-earmark-plus
    +
    +
    + +
    bi-file-earmark-post-fill
    +
    +
    + +
    bi-file-earmark-post
    +
    +
    + +
    bi-file-earmark-ppt-fill
    +
    +
    + +
    bi-file-earmark-ppt
    +
    +
    + +
    bi-file-earmark-richtext-fill
    +
    +
    + +
    bi-file-earmark-richtext
    +
    +
    + +
    bi-file-earmark-ruled-fill
    +
    +
    + +
    bi-file-earmark-ruled
    +
    +
    + +
    bi-file-earmark-slides-fill
    +
    +
    + +
    bi-file-earmark-slides
    +
    +
    + +
    bi-file-earmark-spreadsheet-fill
    +
    +
    + +
    bi-file-earmark-spreadsheet
    +
    +
    + +
    bi-file-earmark-text-fill
    +
    +
    + +
    bi-file-earmark-text
    +
    +
    + +
    bi-file-earmark-word-fill
    +
    +
    + +
    bi-file-earmark-word
    +
    +
    + +
    bi-file-earmark-x-fill
    +
    +
    + +
    bi-file-earmark-x
    +
    +
    + +
    bi-file-earmark-zip-fill
    +
    +
    + +
    bi-file-earmark-zip
    +
    +
    + +
    bi-file-earmark
    +
    +
    + +
    bi-file-easel-fill
    +
    +
    + +
    bi-file-easel
    +
    +
    + +
    bi-file-excel-fill
    +
    +
    + +
    bi-file-excel
    +
    +
    + +
    bi-file-fill
    +
    +
    + +
    bi-file-font-fill
    +
    +
    + +
    bi-file-font
    +
    +
    + +
    bi-file-image-fill
    +
    +
    + +
    bi-file-image
    +
    +
    + +
    bi-file-lock-fill
    +
    +
    + +
    bi-file-lock
    +
    +
    + +
    bi-file-lock2-fill
    +
    +
    + +
    bi-file-lock2
    +
    +
    + +
    bi-file-medical-fill
    +
    +
    + +
    bi-file-medical
    +
    +
    + +
    bi-file-minus-fill
    +
    +
    + +
    bi-file-minus
    +
    +
    + +
    bi-file-music-fill
    +
    +
    + +
    bi-file-music
    +
    +
    + +
    bi-file-pdf-fill
    +
    +
    + +
    bi-file-pdf
    +
    +
    + +
    bi-file-person-fill
    +
    +
    + +
    bi-file-person
    +
    +
    + +
    bi-file-play-fill
    +
    +
    + +
    bi-file-play
    +
    +
    + +
    bi-file-plus-fill
    +
    +
    + +
    bi-file-plus
    +
    +
    + +
    bi-file-post-fill
    +
    +
    + +
    bi-file-post
    +
    +
    + +
    bi-file-ppt-fill
    +
    +
    + +
    bi-file-ppt
    +
    +
    + +
    bi-file-richtext-fill
    +
    +
    + +
    bi-file-richtext
    +
    +
    + +
    bi-file-ruled-fill
    +
    +
    + +
    bi-file-ruled
    +
    +
    + +
    bi-file-slides-fill
    +
    +
    + +
    bi-file-slides
    +
    +
    + +
    bi-file-spreadsheet-fill
    +
    +
    + +
    bi-file-spreadsheet
    +
    +
    + +
    bi-file-text-fill
    +
    +
    + +
    bi-file-text
    +
    +
    + +
    bi-file-word-fill
    +
    +
    + +
    bi-file-word
    +
    +
    + +
    bi-file-x-fill
    +
    +
    + +
    bi-file-x
    +
    +
    + +
    bi-file-zip-fill
    +
    +
    + +
    bi-file-zip
    +
    +
    + +
    bi-file
    +
    +
    + +
    bi-files-alt
    +
    +
    + +
    bi-files
    +
    +
    + +
    bi-filetype-aac
    +
    +
    + +
    bi-filetype-ai
    +
    +
    + +
    bi-filetype-bmp
    +
    +
    + +
    bi-filetype-cs
    +
    +
    + +
    bi-filetype-css
    +
    +
    + +
    bi-filetype-csv
    +
    +
    + +
    bi-filetype-doc
    +
    +
    + +
    bi-filetype-docx
    +
    +
    + +
    bi-filetype-exe
    +
    +
    + +
    bi-filetype-gif
    +
    +
    + +
    bi-filetype-heic
    +
    +
    + +
    bi-filetype-html
    +
    +
    + +
    bi-filetype-java
    +
    +
    + +
    bi-filetype-jpg
    +
    +
    + +
    bi-filetype-js
    +
    +
    + +
    bi-filetype-json
    +
    +
    + +
    bi-filetype-jsx
    +
    +
    + +
    bi-filetype-key
    +
    +
    + +
    bi-filetype-m4p
    +
    +
    + +
    bi-filetype-md
    +
    +
    + +
    bi-filetype-mdx
    +
    +
    + +
    bi-filetype-mov
    +
    +
    + +
    bi-filetype-mp3
    +
    +
    + +
    bi-filetype-mp4
    +
    +
    + +
    bi-filetype-otf
    +
    +
    + +
    bi-filetype-pdf
    +
    +
    + +
    bi-filetype-php
    +
    +
    + +
    bi-filetype-png
    +
    +
    + +
    bi-filetype-ppt
    +
    +
    + +
    bi-filetype-pptx
    +
    +
    + +
    bi-filetype-psd
    +
    +
    + +
    bi-filetype-py
    +
    +
    + +
    bi-filetype-raw
    +
    +
    + +
    bi-filetype-rb
    +
    +
    + +
    bi-filetype-sass
    +
    +
    + +
    bi-filetype-scss
    +
    +
    + +
    bi-filetype-sh
    +
    +
    + +
    bi-filetype-svg
    +
    +
    + +
    bi-filetype-tiff
    +
    +
    + +
    bi-filetype-tsx
    +
    +
    + +
    bi-filetype-ttf
    +
    +
    + +
    bi-filetype-txt
    +
    +
    + +
    bi-filetype-wav
    +
    +
    + +
    bi-filetype-woff
    +
    +
    + +
    bi-filetype-xls
    +
    +
    + +
    bi-filetype-xlsx
    +
    +
    + +
    bi-filetype-xml
    +
    +
    + +
    bi-filetype-yml
    +
    +
    + +
    bi-film
    +
    +
    + +
    bi-filter-circle-fill
    +
    +
    + +
    bi-filter-circle
    +
    +
    + +
    bi-filter-left
    +
    +
    + +
    bi-filter-right
    +
    +
    + +
    bi-filter-square-fill
    +
    +
    + +
    bi-filter-square
    +
    +
    + +
    bi-filter
    +
    +
    + +
    bi-fingerprint
    +
    +
    + +
    bi-flag-fill
    +
    +
    + +
    bi-flag
    +
    +
    + +
    bi-flower1
    +
    +
    + +
    bi-flower2
    +
    +
    + +
    bi-flower3
    +
    +
    + +
    bi-folder-check
    +
    +
    + +
    bi-folder-fill
    +
    +
    + +
    bi-folder-minus
    +
    +
    + +
    bi-folder-plus
    +
    +
    + +
    bi-folder-symlink-fill
    +
    +
    + +
    bi-folder-symlink
    +
    +
    + +
    bi-folder-x
    +
    +
    + +
    bi-folder
    +
    +
    + +
    bi-folder2-open
    +
    +
    + +
    bi-folder2
    +
    +
    + +
    bi-fonts
    +
    +
    + +
    bi-forward-fill
    +
    +
    + +
    bi-forward
    +
    +
    + +
    bi-front
    +
    +
    + +
    bi-fullscreen-exit
    +
    +
    + +
    bi-fullscreen
    +
    +
    + +
    bi-funnel-fill
    +
    +
    + +
    bi-funnel
    +
    +
    + +
    bi-gear-fill
    +
    +
    + +
    bi-gear-wide-connected
    +
    +
    + +
    bi-gear-wide
    +
    +
    + +
    bi-gear
    +
    +
    + +
    bi-gem
    +
    +
    + +
    bi-gender-ambiguous
    +
    +
    + +
    bi-gender-female
    +
    +
    + +
    bi-gender-male
    +
    +
    + +
    bi-gender-trans
    +
    +
    + +
    bi-geo-alt-fill
    +
    +
    + +
    bi-geo-alt
    +
    +
    + +
    bi-geo-fill
    +
    +
    + +
    bi-geo
    +
    +
    + +
    bi-gift-fill
    +
    +
    + +
    bi-gift
    +
    +
    + +
    bi-git
    +
    +
    + +
    bi-github
    +
    +
    + +
    bi-globe
    +
    +
    + +
    bi-globe2
    +
    +
    + +
    bi-google
    +
    +
    + +
    bi-gpu-card
    +
    +
    + +
    bi-graph-down-arrow
    +
    +
    + +
    bi-graph-down
    +
    +
    + +
    bi-graph-up-arrow
    +
    +
    + +
    bi-graph-up
    +
    +
    + +
    bi-grid-1x2-fill
    +
    +
    + +
    bi-grid-1x2
    +
    +
    + +
    bi-grid-3x2-gap-fill
    +
    +
    + +
    bi-grid-3x2-gap
    +
    +
    + +
    bi-grid-3x2
    +
    +
    + +
    bi-grid-3x3-gap-fill
    +
    +
    + +
    bi-grid-3x3-gap
    +
    +
    + +
    bi-grid-3x3
    +
    +
    + +
    bi-grid-fill
    +
    +
    + +
    bi-grid
    +
    +
    + +
    bi-grip-horizontal
    +
    +
    + +
    bi-grip-vertical
    +
    +
    + +
    bi-hammer
    +
    +
    + +
    bi-hand-index-fill
    +
    +
    + +
    bi-hand-index-thumb-fill
    +
    +
    + +
    bi-hand-index-thumb
    +
    +
    + +
    bi-hand-index
    +
    +
    + +
    bi-hand-thumbs-down-fill
    +
    +
    + +
    bi-hand-thumbs-down
    +
    +
    + +
    bi-hand-thumbs-up-fill
    +
    +
    + +
    bi-hand-thumbs-up
    +
    +
    + +
    bi-handbag-fill
    +
    +
    + +
    bi-handbag
    +
    +
    + +
    bi-hash
    +
    +
    + +
    bi-hdd-fill
    +
    +
    + +
    bi-hdd-network-fill
    +
    +
    + +
    bi-hdd-network
    +
    +
    + +
    bi-hdd-rack-fill
    +
    +
    + +
    bi-hdd-rack
    +
    +
    + +
    bi-hdd-stack-fill
    +
    +
    + +
    bi-hdd-stack
    +
    +
    + +
    bi-hdd
    +
    +
    + +
    bi-hdmi-fill
    +
    +
    + +
    bi-hdmi
    +
    +
    + +
    bi-headphones
    +
    +
    + +
    bi-headset-vr
    +
    +
    + +
    bi-headset
    +
    +
    + +
    bi-heart-arrow
    +
    +
    + +
    bi-heart-fill
    +
    +
    + +
    bi-heart-half
    +
    +
    + +
    bi-heart-pulse-fill
    +
    +
    + +
    bi-heart-pulse
    +
    +
    + +
    bi-heart
    +
    +
    + +
    bi-heartbreak-fill
    +
    +
    + +
    bi-heartbreak
    +
    +
    + +
    bi-hearts
    +
    +
    + +
    bi-heptagon-fill
    +
    +
    + +
    bi-heptagon-half
    +
    +
    + +
    bi-heptagon
    +
    +
    + +
    bi-hexagon-fill
    +
    +
    + +
    bi-hexagon-half
    +
    +
    + +
    bi-hexagon
    +
    +
    + +
    bi-hospital-fill
    +
    +
    + +
    bi-hospital
    +
    +
    + +
    bi-hourglass-bottom
    +
    +
    + +
    bi-hourglass-split
    +
    +
    + +
    bi-hourglass-top
    +
    +
    + +
    bi-hourglass
    +
    +
    + +
    bi-house-door-fill
    +
    +
    + +
    bi-house-door
    +
    +
    + +
    bi-house-fill
    +
    +
    + +
    bi-house-heart-fill
    +
    +
    + +
    bi-house-heart
    +
    +
    + +
    bi-house
    +
    +
    + +
    bi-hr
    +
    +
    + +
    bi-hurricane
    +
    +
    + +
    bi-hypnotize
    +
    +
    + +
    bi-image-alt
    +
    +
    + +
    bi-image-fill
    +
    +
    + +
    bi-image
    +
    +
    + +
    bi-images
    +
    +
    + +
    bi-inbox-fill
    +
    +
    + +
    bi-inbox
    +
    +
    + +
    bi-inboxes-fill
    +
    +
    + +
    bi-inboxes
    +
    +
    + +
    bi-incognito
    +
    +
    + +
    bi-infinity
    +
    +
    + +
    bi-info-circle-fill
    +
    +
    + +
    bi-info-circle
    +
    +
    + +
    bi-info-lg
    +
    +
    + +
    bi-info-square-fill
    +
    +
    + +
    bi-info-square
    +
    +
    + +
    bi-info
    +
    +
    + +
    bi-input-cursor-text
    +
    +
    + +
    bi-input-cursor
    +
    +
    + +
    bi-instagram
    +
    +
    + +
    bi-intersect
    +
    +
    + +
    bi-journal-album
    +
    +
    + +
    bi-journal-arrow-down
    +
    +
    + +
    bi-journal-arrow-up
    +
    +
    + +
    bi-journal-bookmark-fill
    +
    +
    + +
    bi-journal-bookmark
    +
    +
    + +
    bi-journal-check
    +
    +
    + +
    bi-journal-code
    +
    +
    + +
    bi-journal-medical
    +
    +
    + +
    bi-journal-minus
    +
    +
    + +
    bi-journal-plus
    +
    +
    + +
    bi-journal-richtext
    +
    +
    + +
    bi-journal-text
    +
    +
    + +
    bi-journal-x
    +
    +
    + +
    bi-journal
    +
    +
    + +
    bi-journals
    +
    +
    + +
    bi-joystick
    +
    +
    + +
    bi-justify-left
    +
    +
    + +
    bi-justify-right
    +
    +
    + +
    bi-justify
    +
    +
    + +
    bi-kanban-fill
    +
    +
    + +
    bi-kanban
    +
    +
    + +
    bi-key-fill
    +
    +
    + +
    bi-key
    +
    +
    + +
    bi-keyboard-fill
    +
    +
    + +
    bi-keyboard
    +
    +
    + +
    bi-ladder
    +
    +
    + +
    bi-lamp-fill
    +
    +
    + +
    bi-lamp
    +
    +
    + +
    bi-laptop-fill
    +
    +
    + +
    bi-laptop
    +
    +
    + +
    bi-layer-backward
    +
    +
    + +
    bi-layer-forward
    +
    +
    + +
    bi-layers-fill
    +
    +
    + +
    bi-layers-half
    +
    +
    + +
    bi-layers
    +
    +
    + +
    bi-layout-sidebar-inset-reverse
    +
    +
    + +
    bi-layout-sidebar-inset
    +
    +
    + +
    bi-layout-sidebar-reverse
    +
    +
    + +
    bi-layout-sidebar
    +
    +
    + +
    bi-layout-split
    +
    +
    + +
    bi-layout-text-sidebar-reverse
    +
    +
    + +
    bi-layout-text-sidebar
    +
    +
    + +
    bi-layout-text-window-reverse
    +
    +
    + +
    bi-layout-text-window
    +
    +
    + +
    bi-layout-three-columns
    +
    +
    + +
    bi-layout-wtf
    +
    +
    + +
    bi-life-preserver
    +
    +
    + +
    bi-lightbulb-fill
    +
    +
    + +
    bi-lightbulb-off-fill
    +
    +
    + +
    bi-lightbulb-off
    +
    +
    + +
    bi-lightbulb
    +
    +
    + +
    bi-lightning-charge-fill
    +
    +
    + +
    bi-lightning-charge
    +
    +
    + +
    bi-lightning-fill
    +
    +
    + +
    bi-lightning
    +
    +
    + +
    bi-line
    +
    +
    + +
    bi-link-45deg
    +
    +
    + +
    bi-link
    +
    +
    + +
    bi-linkedin
    +
    +
    + +
    bi-list-check
    +
    +
    + +
    bi-list-columns-reverse
    +
    +
    + +
    bi-list-columns
    +
    +
    + +
    bi-list-nested
    +
    +
    + +
    bi-list-ol
    +
    +
    + +
    bi-list-stars
    +
    +
    + +
    bi-list-task
    +
    +
    + +
    bi-list-ul
    +
    +
    + +
    bi-list
    +
    +
    + +
    bi-lock-fill
    +
    +
    + +
    bi-lock
    +
    +
    + +
    bi-magic
    +
    +
    + +
    bi-magnet-fill
    +
    +
    + +
    bi-magnet
    +
    +
    + +
    bi-mailbox
    +
    +
    + +
    bi-mailbox2
    +
    +
    + +
    bi-map-fill
    +
    +
    + +
    bi-map
    +
    +
    + +
    bi-markdown-fill
    +
    +
    + +
    bi-markdown
    +
    +
    + +
    bi-mask
    +
    +
    + +
    bi-mastodon
    +
    +
    + +
    bi-medium
    +
    +
    + +
    bi-megaphone-fill
    +
    +
    + +
    bi-megaphone
    +
    +
    + +
    bi-memory
    +
    +
    + +
    bi-menu-app-fill
    +
    +
    + +
    bi-menu-app
    +
    +
    + +
    bi-menu-button-fill
    +
    +
    + +
    bi-menu-button-wide-fill
    +
    +
    + +
    bi-menu-button-wide
    +
    +
    + +
    bi-menu-button
    +
    +
    + +
    bi-menu-down
    +
    +
    + +
    bi-menu-up
    +
    +
    + +
    bi-messenger
    +
    +
    + +
    bi-meta
    +
    +
    + +
    bi-mic-fill
    +
    +
    + +
    bi-mic-mute-fill
    +
    +
    + +
    bi-mic-mute
    +
    +
    + +
    bi-mic
    +
    +
    + +
    bi-microsoft
    +
    +
    + +
    bi-minecart-loaded
    +
    +
    + +
    bi-minecart
    +
    +
    + +
    bi-modem-fill
    +
    +
    + +
    bi-modem
    +
    +
    + +
    bi-moisture
    +
    +
    + +
    bi-moon-fill
    +
    +
    + +
    bi-moon-stars-fill
    +
    +
    + +
    bi-moon-stars
    +
    +
    + +
    bi-moon
    +
    +
    + +
    bi-mortarboard-fill
    +
    +
    + +
    bi-mortarboard
    +
    +
    + +
    bi-motherboard-fill
    +
    +
    + +
    bi-motherboard
    +
    +
    + +
    bi-mouse-fill
    +
    +
    + +
    bi-mouse
    +
    +
    + +
    bi-mouse2-fill
    +
    +
    + +
    bi-mouse2
    +
    +
    + +
    bi-mouse3-fill
    +
    +
    + +
    bi-mouse3
    +
    +
    + +
    bi-music-note-beamed
    +
    +
    + +
    bi-music-note-list
    +
    +
    + +
    bi-music-note
    +
    +
    + +
    bi-music-player-fill
    +
    +
    + +
    bi-music-player
    +
    +
    + +
    bi-newspaper
    +
    +
    + +
    bi-nintendo-switch
    +
    +
    + +
    bi-node-minus-fill
    +
    +
    + +
    bi-node-minus
    +
    +
    + +
    bi-node-plus-fill
    +
    +
    + +
    bi-node-plus
    +
    +
    + +
    bi-nut-fill
    +
    +
    + +
    bi-nut
    +
    +
    + +
    bi-octagon-fill
    +
    +
    + +
    bi-octagon-half
    +
    +
    + +
    bi-octagon
    +
    +
    + +
    bi-optical-audio-fill
    +
    +
    + +
    bi-optical-audio
    +
    +
    + +
    bi-option
    +
    +
    + +
    bi-outlet
    +
    +
    + +
    bi-paint-bucket
    +
    +
    + +
    bi-palette-fill
    +
    +
    + +
    bi-palette
    +
    +
    + +
    bi-palette2
    +
    +
    + +
    bi-paperclip
    +
    +
    + +
    bi-paragraph
    +
    +
    + +
    bi-patch-check-fill
    +
    +
    + +
    bi-patch-check
    +
    +
    + +
    bi-patch-exclamation-fill
    +
    +
    + +
    bi-patch-exclamation
    +
    +
    + +
    bi-patch-minus-fill
    +
    +
    + +
    bi-patch-minus
    +
    +
    + +
    bi-patch-plus-fill
    +
    +
    + +
    bi-patch-plus
    +
    +
    + +
    bi-patch-question-fill
    +
    +
    + +
    bi-patch-question
    +
    +
    + +
    bi-pause-btn-fill
    +
    +
    + +
    bi-pause-btn
    +
    +
    + +
    bi-pause-circle-fill
    +
    +
    + +
    bi-pause-circle
    +
    +
    + +
    bi-pause-fill
    +
    +
    + +
    bi-pause
    +
    +
    + +
    bi-paypal
    +
    +
    + +
    bi-pc-display-horizontal
    +
    +
    + +
    bi-pc-display
    +
    +
    + +
    bi-pc-horizontal
    +
    +
    + +
    bi-pc
    +
    +
    + +
    bi-pci-card
    +
    +
    + +
    bi-peace-fill
    +
    +
    + +
    bi-peace
    +
    +
    + +
    bi-pen-fill
    +
    +
    + +
    bi-pen
    +
    +
    + +
    bi-pencil-fill
    +
    +
    + +
    bi-pencil-square
    +
    +
    + +
    bi-pencil
    +
    +
    + +
    bi-pentagon-fill
    +
    +
    + +
    bi-pentagon-half
    +
    +
    + +
    bi-pentagon
    +
    +
    + +
    bi-people-fill
    +
    +
    + +
    bi-people
    +
    +
    + +
    bi-percent
    +
    +
    + +
    bi-person-badge-fill
    +
    +
    + +
    bi-person-badge
    +
    +
    + +
    bi-person-bounding-box
    +
    +
    + +
    bi-person-check-fill
    +
    +
    + +
    bi-person-check
    +
    +
    + +
    bi-person-circle
    +
    +
    + +
    bi-person-dash-fill
    +
    +
    + +
    bi-person-dash
    +
    +
    + +
    bi-person-fill
    +
    +
    + +
    bi-person-heart
    +
    +
    + +
    bi-person-hearts
    +
    +
    + +
    bi-person-lines-fill
    +
    +
    + +
    bi-person-plus-fill
    +
    +
    + +
    bi-person-plus
    +
    +
    + +
    bi-person-rolodex
    +
    +
    + +
    bi-person-square
    +
    +
    + +
    bi-person-video
    +
    +
    + +
    bi-person-video2
    +
    +
    + +
    bi-person-video3
    +
    +
    + +
    bi-person-workspace
    +
    +
    + +
    bi-person-x-fill
    +
    +
    + +
    bi-person-x
    +
    +
    + +
    bi-person
    +
    +
    + +
    bi-phone-fill
    +
    +
    + +
    bi-phone-flip
    +
    +
    + +
    bi-phone-landscape-fill
    +
    +
    + +
    bi-phone-landscape
    +
    +
    + +
    bi-phone-vibrate-fill
    +
    +
    + +
    bi-phone-vibrate
    +
    +
    + +
    bi-phone
    +
    +
    + +
    bi-pie-chart-fill
    +
    +
    + +
    bi-pie-chart
    +
    +
    + +
    bi-piggy-bank-fill
    +
    +
    + +
    bi-piggy-bank
    +
    +
    + +
    bi-pin-angle-fill
    +
    +
    + +
    bi-pin-angle
    +
    +
    + +
    bi-pin-fill
    +
    +
    + +
    bi-pin-map-fill
    +
    +
    + +
    bi-pin-map
    +
    +
    + +
    bi-pin
    +
    +
    + +
    bi-pinterest
    +
    +
    + +
    bi-pip-fill
    +
    +
    + +
    bi-pip
    +
    +
    + +
    bi-play-btn-fill
    +
    +
    + +
    bi-play-btn
    +
    +
    + +
    bi-play-circle-fill
    +
    +
    + +
    bi-play-circle
    +
    +
    + +
    bi-play-fill
    +
    +
    + +
    bi-play
    +
    +
    + +
    bi-playstation
    +
    +
    + +
    bi-plug-fill
    +
    +
    + +
    bi-plug
    +
    +
    + +
    bi-plugin
    +
    +
    + +
    bi-plus-circle-dotted
    +
    +
    + +
    bi-plus-circle-fill
    +
    +
    + +
    bi-plus-circle
    +
    +
    + +
    bi-plus-lg
    +
    +
    + +
    bi-plus-slash-minus
    +
    +
    + +
    bi-plus-square-dotted
    +
    +
    + +
    bi-plus-square-fill
    +
    +
    + +
    bi-plus-square
    +
    +
    + +
    bi-plus
    +
    +
    + +
    bi-postage-fill
    +
    +
    + +
    bi-postage-heart-fill
    +
    +
    + +
    bi-postage-heart
    +
    +
    + +
    bi-postage
    +
    +
    + +
    bi-postcard-fill
    +
    +
    + +
    bi-postcard-heart-fill
    +
    +
    + +
    bi-postcard-heart
    +
    +
    + +
    bi-postcard
    +
    +
    + +
    bi-power
    +
    +
    + +
    bi-printer-fill
    +
    +
    + +
    bi-printer
    +
    +
    + +
    bi-projector-fill
    +
    +
    + +
    bi-projector
    +
    +
    + +
    bi-puzzle-fill
    +
    +
    + +
    bi-puzzle
    +
    +
    + +
    bi-qr-code-scan
    +
    +
    + +
    bi-qr-code
    +
    +
    + +
    bi-question-circle-fill
    +
    +
    + +
    bi-question-circle
    +
    +
    + +
    bi-question-diamond-fill
    +
    +
    + +
    bi-question-diamond
    +
    +
    + +
    bi-question-lg
    +
    +
    + +
    bi-question-octagon-fill
    +
    +
    + +
    bi-question-octagon
    +
    +
    + +
    bi-question-square-fill
    +
    +
    + +
    bi-question-square
    +
    +
    + +
    bi-question
    +
    +
    + +
    bi-quora
    +
    +
    + +
    bi-quote
    +
    +
    + +
    bi-radioactive
    +
    +
    + +
    bi-rainbow
    +
    +
    + +
    bi-receipt-cutoff
    +
    +
    + +
    bi-receipt
    +
    +
    + +
    bi-reception-0
    +
    +
    + +
    bi-reception-1
    +
    +
    + +
    bi-reception-2
    +
    +
    + +
    bi-reception-3
    +
    +
    + +
    bi-reception-4
    +
    +
    + +
    bi-record-btn-fill
    +
    +
    + +
    bi-record-btn
    +
    +
    + +
    bi-record-circle-fill
    +
    +
    + +
    bi-record-circle
    +
    +
    + +
    bi-record-fill
    +
    +
    + +
    bi-record
    +
    +
    + +
    bi-record2-fill
    +
    +
    + +
    bi-record2
    +
    +
    + +
    bi-recycle
    +
    +
    + +
    bi-reddit
    +
    +
    + +
    bi-reply-all-fill
    +
    +
    + +
    bi-reply-all
    +
    +
    + +
    bi-reply-fill
    +
    +
    + +
    bi-reply
    +
    +
    + +
    bi-robot
    +
    +
    + +
    bi-router-fill
    +
    +
    + +
    bi-router
    +
    +
    + +
    bi-rss-fill
    +
    +
    + +
    bi-rss
    +
    +
    + +
    bi-rulers
    +
    +
    + +
    bi-safe-fill
    +
    +
    + +
    bi-safe
    +
    +
    + +
    bi-safe2-fill
    +
    +
    + +
    bi-safe2
    +
    +
    + +
    bi-save-fill
    +
    +
    + +
    bi-save
    +
    +
    + +
    bi-save2-fill
    +
    +
    + +
    bi-save2
    +
    +
    + +
    bi-scissors
    +
    +
    + +
    bi-screwdriver
    +
    +
    + +
    bi-sd-card-fill
    +
    +
    + +
    bi-sd-card
    +
    +
    + +
    bi-search-heart-fill
    +
    +
    + +
    bi-search-heart
    +
    +
    + +
    bi-search
    +
    +
    + +
    bi-segmented-nav
    +
    +
    + +
    bi-send-check-fill
    +
    +
    + +
    bi-send-check
    +
    +
    + +
    bi-send-dash-fill
    +
    +
    + +
    bi-send-dash
    +
    +
    + +
    bi-send-exclamation-fill
    +
    +
    + +
    bi-send-exclamation
    +
    +
    + +
    bi-send-fill
    +
    +
    + +
    bi-send-plus-fill
    +
    +
    + +
    bi-send-plus
    +
    +
    + +
    bi-send-slash-fill
    +
    +
    + +
    bi-send-slash
    +
    +
    + +
    bi-send-x-fill
    +
    +
    + +
    bi-send-x
    +
    +
    + +
    bi-send
    +
    +
    + +
    bi-server
    +
    +
    + +
    bi-share-fill
    +
    +
    + +
    bi-share
    +
    +
    + +
    bi-shield-check
    +
    +
    + +
    bi-shield-exclamation
    +
    +
    + +
    bi-shield-fill-check
    +
    +
    + +
    bi-shield-fill-exclamation
    +
    +
    + +
    bi-shield-fill-minus
    +
    +
    + +
    bi-shield-fill-plus
    +
    +
    + +
    bi-shield-fill-x
    +
    +
    + +
    bi-shield-fill
    +
    +
    + +
    bi-shield-lock-fill
    +
    +
    + +
    bi-shield-lock
    +
    +
    + +
    bi-shield-minus
    +
    +
    + +
    bi-shield-plus
    +
    +
    + +
    bi-shield-shaded
    +
    +
    + +
    bi-shield-slash-fill
    +
    +
    + +
    bi-shield-slash
    +
    +
    + +
    bi-shield-x
    +
    +
    + +
    bi-shield
    +
    +
    + +
    bi-shift-fill
    +
    +
    + +
    bi-shift
    +
    +
    + +
    bi-shop-window
    +
    +
    + +
    bi-shop
    +
    +
    + +
    bi-shuffle
    +
    +
    + +
    bi-signal
    +
    +
    + +
    bi-signpost-2-fill
    +
    +
    + +
    bi-signpost-2
    +
    +
    + +
    bi-signpost-fill
    +
    +
    + +
    bi-signpost-split-fill
    +
    +
    + +
    bi-signpost-split
    +
    +
    + +
    bi-signpost
    +
    +
    + +
    bi-sim-fill
    +
    +
    + +
    bi-sim
    +
    +
    + +
    bi-skip-backward-btn-fill
    +
    +
    + +
    bi-skip-backward-btn
    +
    +
    + +
    bi-skip-backward-circle-fill
    +
    +
    + +
    bi-skip-backward-circle
    +
    +
    + +
    bi-skip-backward-fill
    +
    +
    + +
    bi-skip-backward
    +
    +
    + +
    bi-skip-end-btn-fill
    +
    +
    + +
    bi-skip-end-btn
    +
    +
    + +
    bi-skip-end-circle-fill
    +
    +
    + +
    bi-skip-end-circle
    +
    +
    + +
    bi-skip-end-fill
    +
    +
    + +
    bi-skip-end
    +
    +
    + +
    bi-skip-forward-btn-fill
    +
    +
    + +
    bi-skip-forward-btn
    +
    +
    + +
    bi-skip-forward-circle-fill
    +
    +
    + +
    bi-skip-forward-circle
    +
    +
    + +
    bi-skip-forward-fill
    +
    +
    + +
    bi-skip-forward
    +
    +
    + +
    bi-skip-start-btn-fill
    +
    +
    + +
    bi-skip-start-btn
    +
    +
    + +
    bi-skip-start-circle-fill
    +
    +
    + +
    bi-skip-start-circle
    +
    +
    + +
    bi-skip-start-fill
    +
    +
    + +
    bi-skip-start
    +
    +
    + +
    bi-skype
    +
    +
    + +
    bi-slack
    +
    +
    + +
    bi-slash-circle-fill
    +
    +
    + +
    bi-slash-circle
    +
    +
    + +
    bi-slash-lg
    +
    +
    + +
    bi-slash-square-fill
    +
    +
    + +
    bi-slash-square
    +
    +
    + +
    bi-slash
    +
    +
    + +
    bi-sliders
    +
    +
    + +
    bi-sliders2-vertical
    +
    +
    + +
    bi-sliders2
    +
    +
    + +
    bi-smartwatch
    +
    +
    + +
    bi-snapchat
    +
    +
    + +
    bi-snow
    +
    +
    + +
    bi-snow2
    +
    +
    + +
    bi-snow3
    +
    +
    + +
    bi-sort-alpha-down-alt
    +
    +
    + +
    bi-sort-alpha-down
    +
    +
    + +
    bi-sort-alpha-up-alt
    +
    +
    + +
    bi-sort-alpha-up
    +
    +
    + +
    bi-sort-down-alt
    +
    +
    + +
    bi-sort-down
    +
    +
    + +
    bi-sort-numeric-down-alt
    +
    +
    + +
    bi-sort-numeric-down
    +
    +
    + +
    bi-sort-numeric-up-alt
    +
    +
    + +
    bi-sort-numeric-up
    +
    +
    + +
    bi-sort-up-alt
    +
    +
    + +
    bi-sort-up
    +
    +
    + +
    bi-soundwave
    +
    +
    + +
    bi-speaker-fill
    +
    +
    + +
    bi-speaker
    +
    +
    + +
    bi-speedometer
    +
    +
    + +
    bi-speedometer2
    +
    +
    + +
    bi-spellcheck
    +
    +
    + +
    bi-spotify
    +
    +
    + +
    bi-square-fill
    +
    +
    + +
    bi-square-half
    +
    +
    + +
    bi-square
    +
    +
    + +
    bi-stack-overflow
    +
    +
    + +
    bi-stack
    +
    +
    + +
    bi-star-fill
    +
    +
    + +
    bi-star-half
    +
    +
    + +
    bi-star
    +
    +
    + +
    bi-stars
    +
    +
    + +
    bi-steam
    +
    +
    + +
    bi-stickies-fill
    +
    +
    + +
    bi-stickies
    +
    +
    + +
    bi-sticky-fill
    +
    +
    + +
    bi-sticky
    +
    +
    + +
    bi-stop-btn-fill
    +
    +
    + +
    bi-stop-btn
    +
    +
    + +
    bi-stop-circle-fill
    +
    +
    + +
    bi-stop-circle
    +
    +
    + +
    bi-stop-fill
    +
    +
    + +
    bi-stop
    +
    +
    + +
    bi-stoplights-fill
    +
    +
    + +
    bi-stoplights
    +
    +
    + +
    bi-stopwatch-fill
    +
    +
    + +
    bi-stopwatch
    +
    +
    + +
    bi-strava
    +
    +
    + +
    bi-subtract
    +
    +
    + +
    bi-suit-club-fill
    +
    +
    + +
    bi-suit-club
    +
    +
    + +
    bi-suit-diamond-fill
    +
    +
    + +
    bi-suit-diamond
    +
    +
    + +
    bi-suit-heart-fill
    +
    +
    + +
    bi-suit-heart
    +
    +
    + +
    bi-suit-spade-fill
    +
    +
    + +
    bi-suit-spade
    +
    +
    + +
    bi-sun-fill
    +
    +
    + +
    bi-sun
    +
    +
    + +
    bi-sunglasses
    +
    +
    + +
    bi-sunrise-fill
    +
    +
    + +
    bi-sunrise
    +
    +
    + +
    bi-sunset-fill
    +
    +
    + +
    bi-sunset
    +
    +
    + +
    bi-symmetry-horizontal
    +
    +
    + +
    bi-symmetry-vertical
    +
    +
    + +
    bi-table
    +
    +
    + +
    bi-tablet-fill
    +
    +
    + +
    bi-tablet-landscape-fill
    +
    +
    + +
    bi-tablet-landscape
    +
    +
    + +
    bi-tablet
    +
    +
    + +
    bi-tag-fill
    +
    +
    + +
    bi-tag
    +
    +
    + +
    bi-tags-fill
    +
    +
    + +
    bi-tags
    +
    +
    + +
    bi-telegram
    +
    +
    + +
    bi-telephone-fill
    +
    +
    + +
    bi-telephone-forward-fill
    +
    +
    + +
    bi-telephone-forward
    +
    +
    + +
    bi-telephone-inbound-fill
    +
    +
    + +
    bi-telephone-inbound
    +
    +
    + +
    bi-telephone-minus-fill
    +
    +
    + +
    bi-telephone-minus
    +
    +
    + +
    bi-telephone-outbound-fill
    +
    +
    + +
    bi-telephone-outbound
    +
    +
    + +
    bi-telephone-plus-fill
    +
    +
    + +
    bi-telephone-plus
    +
    +
    + +
    bi-telephone-x-fill
    +
    +
    + +
    bi-telephone-x
    +
    +
    + +
    bi-telephone
    +
    +
    + +
    bi-terminal-dash
    +
    +
    + +
    bi-terminal-fill
    +
    +
    + +
    bi-terminal-plus
    +
    +
    + +
    bi-terminal-split
    +
    +
    + +
    bi-terminal-x
    +
    +
    + +
    bi-terminal
    +
    +
    + +
    bi-text-center
    +
    +
    + +
    bi-text-indent-left
    +
    +
    + +
    bi-text-indent-right
    +
    +
    + +
    bi-text-left
    +
    +
    + +
    bi-text-paragraph
    +
    +
    + +
    bi-text-right
    +
    +
    + +
    bi-textarea-resize
    +
    +
    + +
    bi-textarea-t
    +
    +
    + +
    bi-textarea
    +
    +
    + +
    bi-thermometer-half
    +
    +
    + +
    bi-thermometer-high
    +
    +
    + +
    bi-thermometer-low
    +
    +
    + +
    bi-thermometer-snow
    +
    +
    + +
    bi-thermometer-sun
    +
    +
    + +
    bi-thermometer
    +
    +
    + +
    bi-three-dots-vertical
    +
    +
    + +
    bi-three-dots
    +
    +
    + +
    bi-thunderbolt-fill
    +
    +
    + +
    bi-thunderbolt
    +
    +
    + +
    bi-ticket-detailed-fill
    +
    +
    + +
    bi-ticket-detailed
    +
    +
    + +
    bi-ticket-fill
    +
    +
    + +
    bi-ticket-perforated-fill
    +
    +
    + +
    bi-ticket-perforated
    +
    +
    + +
    bi-ticket
    +
    +
    + +
    bi-tiktok
    +
    +
    + +
    bi-toggle-off
    +
    +
    + +
    bi-toggle-on
    +
    +
    + +
    bi-toggle2-off
    +
    +
    + +
    bi-toggle2-on
    +
    +
    + +
    bi-toggles
    +
    +
    + +
    bi-toggles2
    +
    +
    + +
    bi-tools
    +
    +
    + +
    bi-tornado
    +
    +
    + +
    bi-translate
    +
    +
    + +
    bi-trash-fill
    +
    +
    + +
    bi-trash
    +
    +
    + +
    bi-trash2-fill
    +
    +
    + +
    bi-trash2
    +
    +
    + +
    bi-trash3-fill
    +
    +
    + +
    bi-trash3
    +
    +
    + +
    bi-tree-fill
    +
    +
    + +
    bi-tree
    +
    +
    + +
    bi-triangle-fill
    +
    +
    + +
    bi-triangle-half
    +
    +
    + +
    bi-triangle
    +
    +
    + +
    bi-trophy-fill
    +
    +
    + +
    bi-trophy
    +
    +
    + +
    bi-tropical-storm
    +
    +
    + +
    bi-truck-flatbed
    +
    +
    + +
    bi-truck
    +
    +
    + +
    bi-tsunami
    +
    +
    + +
    bi-tv-fill
    +
    +
    + +
    bi-tv
    +
    +
    + +
    bi-twitch
    +
    +
    + +
    bi-twitter
    +
    +
    + +
    bi-type-bold
    +
    +
    + +
    bi-type-h1
    +
    +
    + +
    bi-type-h2
    +
    +
    + +
    bi-type-h3
    +
    +
    + +
    bi-type-italic
    +
    +
    + +
    bi-type-strikethrough
    +
    +
    + +
    bi-type-underline
    +
    +
    + +
    bi-type
    +
    +
    + +
    bi-ui-checks-grid
    +
    +
    + +
    bi-ui-checks
    +
    +
    + +
    bi-ui-radios-grid
    +
    +
    + +
    bi-ui-radios
    +
    +
    + +
    bi-umbrella-fill
    +
    +
    + +
    bi-umbrella
    +
    +
    + +
    bi-union
    +
    +
    + +
    bi-unlock-fill
    +
    +
    + +
    bi-unlock
    +
    +
    + +
    bi-upc-scan
    +
    +
    + +
    bi-upc
    +
    +
    + +
    bi-upload
    +
    +
    + +
    bi-usb-c-fill
    +
    +
    + +
    bi-usb-c
    +
    +
    + +
    bi-usb-drive-fill
    +
    +
    + +
    bi-usb-drive
    +
    +
    + +
    bi-usb-fill
    +
    +
    + +
    bi-usb-micro-fill
    +
    +
    + +
    bi-usb-micro
    +
    +
    + +
    bi-usb-mini-fill
    +
    +
    + +
    bi-usb-mini
    +
    +
    + +
    bi-usb-plug-fill
    +
    +
    + +
    bi-usb-plug
    +
    +
    + +
    bi-usb-symbol
    +
    +
    + +
    bi-usb
    +
    +
    + +
    bi-valentine
    +
    +
    + +
    bi-valentine2
    +
    +
    + +
    bi-vector-pen
    +
    +
    + +
    bi-view-list
    +
    +
    + +
    bi-view-stacked
    +
    +
    + +
    bi-vimeo
    +
    +
    + +
    bi-vinyl-fill
    +
    +
    + +
    bi-vinyl
    +
    +
    + +
    bi-voicemail
    +
    +
    + +
    bi-volume-down-fill
    +
    +
    + +
    bi-volume-down
    +
    +
    + +
    bi-volume-mute-fill
    +
    +
    + +
    bi-volume-mute
    +
    +
    + +
    bi-volume-off-fill
    +
    +
    + +
    bi-volume-off
    +
    +
    + +
    bi-volume-up-fill
    +
    +
    + +
    bi-volume-up
    +
    +
    + +
    bi-vr
    +
    +
    + +
    bi-wallet-fill
    +
    +
    + +
    bi-wallet
    +
    +
    + +
    bi-wallet2
    +
    +
    + +
    bi-watch
    +
    +
    + +
    bi-water
    +
    +
    + +
    bi-webcam-fill
    +
    +
    + +
    bi-webcam
    +
    +
    + +
    bi-whatsapp
    +
    +
    + +
    bi-wifi-1
    +
    +
    + +
    bi-wifi-2
    +
    +
    + +
    bi-wifi-off
    +
    +
    + +
    bi-wifi
    +
    +
    + +
    bi-wind
    +
    +
    + +
    bi-window-dash
    +
    +
    + +
    bi-window-desktop
    +
    +
    + +
    bi-window-dock
    +
    +
    + +
    bi-window-fullscreen
    +
    +
    + +
    bi-window-plus
    +
    +
    + +
    bi-window-sidebar
    +
    +
    + +
    bi-window-split
    +
    +
    + +
    bi-window-stack
    +
    +
    + +
    bi-window-x
    +
    +
    + +
    bi-window
    +
    +
    + +
    bi-windows
    +
    +
    + +
    bi-wordpress
    +
    +
    + +
    bi-wrench-adjustable-circle-fill
    +
    +
    + +
    bi-wrench-adjustable-circle
    +
    +
    + +
    bi-wrench-adjustable
    +
    +
    + +
    bi-wrench
    +
    +
    + +
    bi-x-circle-fill
    +
    +
    + +
    bi-x-circle
    +
    +
    + +
    bi-x-diamond-fill
    +
    +
    + +
    bi-x-diamond
    +
    +
    + +
    bi-x-lg
    +
    +
    + +
    bi-x-octagon-fill
    +
    +
    + +
    bi-x-octagon
    +
    +
    + +
    bi-x-square-fill
    +
    +
    + +
    bi-x-square
    +
    +
    + +
    bi-x
    +
    +
    + +
    bi-xbox
    +
    +
    + +
    bi-yin-yang
    +
    +
    + +
    bi-youtube
    +
    +
    + +
    bi-zoom-in
    +
    +
    + +
    bi-zoom-out
    +
    +
    + + + diff --git a/jun_pc_web/assets/css/layout.css b/jun_pc_web/assets/css/layout.css new file mode 100644 index 000000000..a2e3fbde5 --- /dev/null +++ b/jun_pc_web/assets/css/layout.css @@ -0,0 +1,199 @@ +.gg-layout .layui-header {position: fixed; top: 0;left: 0; width: 100%; height: 50px; border-bottom: 1px solid #eeeeee;box-sizing: border-box;background-color: #fff} +.gg-layout .layui-header a, +.gg-layout .layui-header a cite {color: #162a48} +.gg-layout .layui-header a:hover {color: #000} +.gg-head-item{display:block; padding:0 16px; height:50px; line-height:50px; float:left;} +.gg-head-item i.layui-icon{font-size:20px;} +.gg-head-item .layui-nav{background:0 0;padding:0;} +.gg-head-item .layui-nav .layui-nav-item a{padding:0;} +.layui-layout-right .gg-head-item{border-left:1px solid #eeeeee;} +.layui-layout-right .gg-head-item i.layui-icon{font-weight:600} + +.layui-layout-right .gg-head-message{position:relative;} +.layui-layout-right .gg-message-num{height: 18px;position: absolute; top: -12px;margin-left: -4px;left: 50%;} +.layui-layout-right .gg-message-num span {min-width: 18px; height: 18px; margin: 0;padding: 0 4px; display: inline-block; font-size: 11px; line-height: 18px; text-align: center;background-color: #FF5722; color: #fff; border-radius: 12px;cursor: pointer;} +.gg-head-avatar img{width:28px; height:28px; border-radius:50%; margin-right:3px;} +.gg-head-avatar i.layui-icon{font-size:14px;position: relative;} +.layui-layout-right .layui-nav .layui-nav-item{height: 50px;line-height: 50px} +.gg-head-item .layui-nav .layui-this:after{display:none;} + +.gg-layout .layui-side {width: 200px;top: 0;z-index: 1001} +.gg-layout .layui-logo {position: fixed;left: 0; top: 0; z-index: 1001; width: 200px; height: 49px; text-align:center; line-height:49px; overflow: hidden;background-color: #001529; border-bottom: 1px solid #011120; cursor:pointer;} +.gg-layout .layui-logo, +.gg-layout .layui-logo a {color: #f1f1f1; text-align:center;} + +.layui-side-menu {box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05);background-color: #001529; color: #fff} +.layui-side-menu .layui-side-scroll {width: 100%} +.layui-side-menu .layui-nav {width: 200px; margin-top: 50px; background: 0 0} +.layui-side-menu .layui-nav .layui-nav-item a {height: 40px;line-height: 40px; padding-left: 44px; padding-right: 20px} +.layui-side-menu .layui-nav .layui-nav-item>a {padding-top: 2px;padding-bottom: 2px} +.layui-side-menu .layui-nav .layui-nav-itemed>.layui-nav-child { padding: 0} +.layui-side-menu .layui-nav .layui-nav-item .bi, +.layui-side-menu .layui-nav .layui-nav-item .iconfont, +.layui-side-menu .layui-nav .layui-nav-item .layui-icon{position: absolute; top: 50%;left: 16px; margin-top: -20px} +.layui-side-menu .layui-nav .layui-nav-item .bi, +.layui-side-menu .layui-nav .layui-nav-item .iconfont{font-size:18px;} +.layui-side-menu .layui-nav .layui-nav-item .layui-nav-more {margin-top: -24px; color:#677C91} +.layui-side-menu .layui-nav .layui-nav-child .layui-nav-more {margin-top: -20px; color:#677C91} + +.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child { background: 0 0 !important} +.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child a {padding-left: 58px} +.layui-side-menu .layui-nav .layui-nav-more {right: 12px} + +.layui-nav-tree .layui-nav-child dd.layui-this, +.layui-nav-tree .layui-nav-child dd.layui-this a, +.layui-nav-tree .layui-this, +.layui-nav-tree .layui-this>a, +.layui-nav-tree .layui-this>a:hover {background-color: #192A3B;color: #3C9CFF;} + +.layui-side .layui-nav-tree .layui-nav-child dd a:hover{background-color:#192A3B;} +.layui-side .layui-nav-tree .layui-nav-bar{background-color: #3C9CFF;width:3px;} + +.layui-side-white{background-color: #fff; color: #323232} +.layui-side-white .layui-logo {background-color: #ffffff;border-bottom: 1px solid #eeeeee;} +.layui-side-white .layui-nav .layui-nav-item a{color: #323232} +.layui-side-white .layui-nav .layui-nav-item .iconfont{font-weight:600;} +.layui-side-white .layui-nav-itemed>.layui-nav-child{background-color:#fff!important;} +.layui-side-white .layui-nav-itemed>a, +.layui-side-white .layui-nav-tree .layui-nav-title a, +.layui-side-white .layui-nav-tree .layui-nav-title a:hover{color:#187FDD!important;} +.layui-side-white .layui-nav-tree .layui-nav-child dd.layui-this, +.layui-side-white .layui-nav-tree .layui-nav-child dd.layui-this a, +.layui-side-white .layui-nav-tree .layui-this, +.layui-side-white .layui-nav-tree .layui-this>a, +.layui-side-white .layui-nav-tree .layui-this>a:hover {background-color: #ECF6FF;color: #187FDD;} + +.layui-side-white .layui-nav-tree .layui-nav-child dd a:hover{background-color:#ffffff;color: #187FDD;} +.layui-side-white .layui-nav-tree .layui-nav-bar{background-color: #187FDD;width:3px;left:inherit;right:0} + +.page-tabs{ position: fixed;top: 50px;right: 0; z-index: 999; height: 40px; line-height: 40px; padding: 0 80px 0 40px; background-color: #fff;box-sizing: border-box; box-shadow: 0 1px 20px 0 rgba(0, 0, 0, 8%)} +.page-tabs, +.gg-layout .layui-body, +.gg-layout .layui-footer, +.gg-layout .layui-layout-left {left: 200px} + +.page-tabs, +.gg-layout .layui-body, +.gg-layout .layui-footer, +.gg-layout .layui-header .layui-layout-right, +.gg-layout .layui-header .layui-nav .layui-nav-item, +.gg-layout .layui-layout-left, +.gg-layout .layui-logo, +.gg-layout .layui-side {transition: all .3s;-webkit-transition: all .3s} + +.gg-layout .layui-body {top: 90px;bottom: 0;position: fixed;} +.gg-layout .gg-tab-page {position: absolute; top: 0; bottom: 0;left: 0; right: 0; display: none; overflow: hidden;} +.gg-layout .layui-footer {padding: 10px 0;text-align: center; box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05)} +.gg-body-shade {position: fixed; display: none;left: 0; right: 0; top: 0; bottom: 0; background-color: rgba(0, 0, 0, .3); z-index: 1000} + +.page-tabs .gg-tabs-control { position: absolute; top: 0;width: 40px; height: 100%;text-align: center; cursor: pointer;box-sizing: border-box; border-left: 1px solid #eeeeee; + transition: all .3s; + -webkit-transition: all .3s; +} +.page-tabs .gg-tabs-control:hover {background-color: #fafafa} +.page-tabs .layui-icon-prev {left: 0; border-left: none; border-right: 1px solid #eeeeee} +.page-tabs .layui-icon-next {right: 40px} +.page-tabs .layui-icon-down {right: 0} +.page-tabs .layui-tab {margin: 0; overflow: hidden} +.page-tabs .layui-tab-title {height: 40px;border: none} +.page-tabs .layui-tab-title i{font-size:18px; font-weight:600} + +.page-tabs .layui-tab-title li { min-width: 0; line-height: 40px; max-width: 160px; text-overflow: ellipsis; padding-left:12px; padding-right: 32px;overflow: hidden;border-right: 1px solid #eeeeee;vertical-align: top} +.page-tabs .layui-tab-title li:first-child {padding-right: 15px} +.page-tabs .layui-tab-title li .layui-tab-close { position: absolute;right: 8px; top: 50%;margin: -7px 0 0; width: 16px; height: 16px;line-height: 16px;border-radius: 50%;font-size: 12px} +.page-tabs .layui-tab-title li:after { content: ''; position: absolute; top: 0; left: 0;width: 0; height: 2px; border-radius: 0; background-color: #1E9FFF; + transition: all .3s; + -webkit-transition: all .3s +} + +.page-tabs .layui-tab-title li:hover:after {width: 100%} + +.page-tabs .layui-tab-title li.layui-this, +.page-tabs .layui-tab-title li:hover { background-color: #fafafa; color:#187FDD} + +.page-tabs .layui-tab-title li.layui-this:after {width: 100%; border: none;height: 2px; background-color: #1E9FFF} + +.page-tabs .layui-tab-title li:first-child .layui-tab-close, +.gg-tabs-select.layui-nav .layui-nav-bar, +.gg-tabs-select.layui-nav .layui-nav-more {display: none} + +.gg-tabs-select.layui-nav { position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 0; background: 0 0} +.gg-tabs-select.layui-nav .layui-nav-item { line-height: 40px} +.gg-tabs-select.layui-nav .layui-nav-item>a {height: 40px} +.gg-tabs-select.layui-nav .layui-nav-item a {color: #666} +.gg-tabs-select.layui-nav .layui-nav-child {top: 40px;left: auto;right: 0} + +.gg-tabs-select.layui-nav .layui-nav-child dd.layui-this, +.gg-tabs-select.layui-nav .layui-nav-child dd.layui-this a {background-color: #f2f2f2 !important;color: #333} + +.gg-layout .layui-logo .logo{display: none} +.side-spread .gg-layout .layui-logo {width: 53px;} +.side-spread .gg-layout .layui-logo .syslogo{display: none} +.side-spread .gg-layout .layui-logo .logo{display: inline-block} +.side-spread .layui-side {left: 0;width: 53px} + +.side-spread .page-tabs, +.side-spread .gg-layout .layui-body, +.side-spread .gg-layout .layui-footer, +.side-spread .gg-layout .layui-layout-left {left: 53px} + +.side-spread .layui-side-menu .layui-nav {position: static; width: 53px} +.side-spread .layui-side-menu .layui-nav-item {position: static} +.side-spread .layui-side-menu .layui-nav-item>a {padding-right: 0;padding-left:55px;} + +.side-spread .layui-side-menu .layui-nav-item cite, +.side-spread .layui-side-menu .layui-nav>.layui-nav-item>.layui-nav-child, +.side-spread .layui-side-menu .layui-nav>.layui-nav-item>a .layui-nav-more {display: none; padding: 8px 0;width: 180px} + +.side-spread .layui-side-menu .layui-nav>.layui-nav-itemed>a {background: rgba(0, 0, 0, .3)} + +.side-layout .layui-layer-TipsG.layui-layer-TipsR{display:none;} +.side-layout.layui-layer-tips .layui-layer-content{padding:0!important; border-radius:0!important;} +.side-layout .layui-nav-tree .layui-nav-bar{background-color: #3C9CFF;width:3px;} +@media screen and (max-width:992px) { + .gg-layout .layui-side { + transform: translate3d(-200px, 0, 0); + -webkit-transform: translate3d(-200px, 0, 0); + width: 200px + } + .page-tabs, + .gg-layout .layui-body, + .gg-layout .layui-footer, + .gg-layout .layui-layout-left { + left: 0 + } + .gg-head-screen, + .gg-head-refresh, + .gg-head-cache, + .gg-head-home{display:none;} +} + +.side-spread-sm .layui-side { + transform: translate3d(0,0,0); + -webkit-transform: translate3d(0,0,0); +} +.side-spread-sm .page-tabs, +.side-spread-sm .gg-layout .layui-body, +.side-spread-sm .gg-layout .layui-footer, +.side-spread-sm .gg-layout .layui-layout-left { + left: 0; + transform: translate3d(200px,0,0); + -webkit-transform: translate3d(200px,0,0); +} +.side-spread-sm .gg-body-shade { + display: block; +} + +.gg-tab-page.layui-show {animation:moveTop .8s;-webkit-animation:moveTop .8s;animation-fill-mode:both;-webkit-animation-fill-mode:both;position:relative;height:100%;-webkit-overflow-scrolling:touch;} +@keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(30px);transform:translateY(20px);} + 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);} +} +@-o-keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px);} + 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);} +} +@-moz-keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(30px);-ms-transform:translateY(20px);transform:translateY(20px);} + 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);} +} +@-webkit-keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(30px);-ms-transform:translateY(20px);transform:translateY(20px);} + 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);} +} \ No newline at end of file diff --git a/jun_pc_web/assets/gouguInit.js b/jun_pc_web/assets/gouguInit.js new file mode 100644 index 000000000..c02df9d50 --- /dev/null +++ b/jun_pc_web/assets/gouguInit.js @@ -0,0 +1,52 @@ +window.rootPath = (function (src) { + src = document.currentScript + ? document.currentScript.src + : document.scripts[document.scripts.length - 1].src; + console.log("src="+src); + return src.substring(0, src.lastIndexOf("/") + 1); +})(); +console.log("rootPath="+rootPath); +if (typeof $ == "undefined") { + window.jQuery = layui.jquery; + window.$ = layui.jquery; +} +if (typeof moduleInit == "undefined") { + window.moduleInit = []; + //window.moduleInit = ['tool']; +} + +console.log("moduleInit="+moduleInit); +var module = { + notice: 'notice/notice', + admin: 'admin', + tool: 'tool', + xnUtil: 'xnUtil/xnUtil' , + treetable: 'treetable-lay/treetable' +}; + +/* +var module = { + notice: 'notice/notice', + admin: 'admin', + tool: 'tool', + xnUtil: 'xnUtil/xnUtil' , + treetable: 'treetable-lay/treetable' +}; +*/ +if (moduleInit.length > 0) { + for (var i = 0; i < moduleInit.length; i++) { + module[moduleInit[i]] = moduleInit[i]; + } +} +console.log("moduleInit="+moduleInit); +console.log("module="+module); +layui.config({ + base: rootPath + "module/", + version: "1.0.0" +}).extend(module).use(moduleInit, function () { + if (typeof gouguInit === 'function') { + gouguInit(); + } +}); + + diff --git a/jun_pc_web/assets/images/bg-login.jpg b/jun_pc_web/assets/images/bg-login.jpg new file mode 100644 index 000000000..8caec45ed Binary files /dev/null and b/jun_pc_web/assets/images/bg-login.jpg differ diff --git a/jun_pc_web/assets/images/bg-screen.jpg b/jun_pc_web/assets/images/bg-screen.jpg new file mode 100644 index 000000000..20490c371 Binary files /dev/null and b/jun_pc_web/assets/images/bg-screen.jpg differ diff --git a/jun_pc_web/assets/images/favicon.ico b/jun_pc_web/assets/images/favicon.ico new file mode 100644 index 000000000..fb28ddf43 Binary files /dev/null and b/jun_pc_web/assets/images/favicon.ico differ diff --git a/jun_pc_web/assets/images/gouguadmin.png b/jun_pc_web/assets/images/gouguadmin.png new file mode 100644 index 000000000..bcbc7f67b Binary files /dev/null and b/jun_pc_web/assets/images/gouguadmin.png differ diff --git a/jun_pc_web/assets/images/head.jpg b/jun_pc_web/assets/images/head.jpg new file mode 100644 index 000000000..0e93727a9 Binary files /dev/null and b/jun_pc_web/assets/images/head.jpg differ diff --git a/jun_pc_web/assets/images/ic_403.png b/jun_pc_web/assets/images/ic_403.png new file mode 100644 index 000000000..72221be29 Binary files /dev/null and b/jun_pc_web/assets/images/ic_403.png differ diff --git a/jun_pc_web/assets/images/ic_404.png b/jun_pc_web/assets/images/ic_404.png new file mode 100644 index 000000000..e2eb68352 Binary files /dev/null and b/jun_pc_web/assets/images/ic_404.png differ diff --git a/jun_pc_web/assets/images/ic_500.png b/jun_pc_web/assets/images/ic_500.png new file mode 100644 index 000000000..b937e94d4 Binary files /dev/null and b/jun_pc_web/assets/images/ic_500.png differ diff --git a/jun_pc_web/assets/images/icon.png b/jun_pc_web/assets/images/icon.png new file mode 100644 index 000000000..9a516e4f3 Binary files /dev/null and b/jun_pc_web/assets/images/icon.png differ diff --git a/jun_pc_web/assets/images/logo.png b/jun_pc_web/assets/images/logo.png new file mode 100644 index 000000000..da27b6b0e Binary files /dev/null and b/jun_pc_web/assets/images/logo.png differ diff --git a/jun_pc_web/assets/images/nonepic600x360.jpg b/jun_pc_web/assets/images/nonepic600x360.jpg new file mode 100644 index 000000000..d15f7d1c3 Binary files /dev/null and b/jun_pc_web/assets/images/nonepic600x360.jpg differ diff --git a/jun_pc_web/assets/js/alert.js b/jun_pc_web/assets/js/alert.js new file mode 100644 index 000000000..5ead5d24e --- /dev/null +++ b/jun_pc_web/assets/js/alert.js @@ -0,0 +1,98 @@ +function warn(msg){ + layer.confirm(msg ,{icon: 0, title:'提示'}); +}; +function info(msg){ + layer.confirm(msg ,{icon: 1, title:'提示'}); +}; +function success(msg){ + layer.msg(msg); +}; +function error(msg){ + layer.confirm(msg ,{icon: 2, title:'错误'}); +}; +function jsConfirm(msg,callback){ +layer.confirm(msg ,{icon: 3, title:'提示'},function(index){ + if(index){ + layer.close(index); + if(callback){ + callback.apply(); + } + } + }); +} +layui.use([ 'table', 'form', 'jquery' ], function() { + $('.show-image').click(function(){ + var $item=$(this); + if(!$item.attr('show')){ + $item.attr('show',true); + layer.open({ + type: 1, + title: false, + closeBtn: 0, + area: '50%', + skin: 'layui-layer-nobg', //没有背景色 + shadeClose: true, + content: $item, + end :function(index, layero){ + $('.show-image[show="true"]').removeAttr('show'); + log('cancel'); + return true; + } + }); + } + }); +}); + +/** + * 弹出对话框 + * @param dialogTitle + * @param dialogUrl + * @param isMax + * @param h 高度 + * @param w 宽度,可设置'80%'\'800px'\400; + * @param options + * @returns + */ +var currentLayer; +function openDialog(dialogTitle,dialogUrl,isMax,w,h,option){ + var windowHeight = $(window).height(); + var windowWidth = $(window).width(); + var height_=Math.floor(windowHeight*0.9)+'px'; + var width_='90%'; + if(h){ + if(typeof h=='string'){ + height_=h; + }else{ + height_=h+'px'; + } + } + if(w){ + if(typeof w=='string'){ + width_=w; + }else{ + width_=w+'px'; + } + } + + if(windowWidth<500){ + width_="90%"; + height_=Math.floor(windowHeight*0.9)+'px'; + } + + var option_=null; + if(option){ + option_=option; + } + var tableOptions = $.extend({ + type: 2, + maxmin : true, + title: dialogTitle, + area: [width_,height_], + content: dialogUrl + },option_); + currentLayer=layer.open(tableOptions); + if(isMax){ + layer.full(currentLayer); + } + return currentLayer; +} \ No newline at end of file diff --git a/jun_pc_web/assets/js/base64.js b/jun_pc_web/assets/js/base64.js new file mode 100644 index 000000000..98bc7426b --- /dev/null +++ b/jun_pc_web/assets/js/base64.js @@ -0,0 +1,319 @@ +// +// THIS FILE IS AUTOMATICALLY GENERATED! DO NOT EDIT BY HAND! +// +; +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + ? module.exports = factory() + : typeof define === 'function' && define.amd + ? define(factory) : + // cf. https://github.com/dankogai/js-base64/issues/119 + (function () { + // existing version for noConflict() + var _Base64 = global.Base64; + var gBase64 = factory(); + gBase64.noConflict = function () { + global.Base64 = _Base64; + return gBase64; + }; + if (global.Meteor) { // Meteor.js + Base64 = gBase64; + } + global.Base64 = gBase64; + })(); +}((typeof self !== 'undefined' ? self + : typeof window !== 'undefined' ? window + : typeof global !== 'undefined' ? global + : this), function () { + 'use strict'; + /** + * base64.ts + * + * Licensed under the BSD 3-Clause License. + * http://opensource.org/licenses/BSD-3-Clause + * + * References: + * http://en.wikipedia.org/wiki/Base64 + * + * @author Dan Kogai (https://github.com/dankogai) + */ + var version = '3.7.2'; + /** + * @deprecated use lowercase `version`. + */ + var VERSION = version; + var _hasatob = typeof atob === 'function'; + var _hasbtoa = typeof btoa === 'function'; + var _hasBuffer = typeof Buffer === 'function'; + var _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined; + var _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined; + var b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var b64chs = Array.prototype.slice.call(b64ch); + var b64tab = (function (a) { + var tab = {}; + a.forEach(function (c, i) { return tab[c] = i; }); + return tab; + })(b64chs); + var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; + var _fromCC = String.fromCharCode.bind(String); + var _U8Afrom = typeof Uint8Array.from === 'function' + ? Uint8Array.from.bind(Uint8Array) + : function (it, fn) { + if (fn === void 0) { fn = function (x) { return x; }; } + return new Uint8Array(Array.prototype.slice.call(it, 0).map(fn)); + }; + var _mkUriSafe = function (src) { return src + .replace(/=/g, '').replace(/[+\/]/g, function (m0) { return m0 == '+' ? '-' : '_'; }); }; + var _tidyB64 = function (s) { return s.replace(/[^A-Za-z0-9\+\/]/g, ''); }; + /** + * polyfill version of `btoa` + */ + var btoaPolyfill = function (bin) { + // console.log('polyfilled'); + var u32, c0, c1, c2, asc = ''; + var pad = bin.length % 3; + for (var i = 0; i < bin.length;) { + if ((c0 = bin.charCodeAt(i++)) > 255 || + (c1 = bin.charCodeAt(i++)) > 255 || + (c2 = bin.charCodeAt(i++)) > 255) + throw new TypeError('invalid character found'); + u32 = (c0 << 16) | (c1 << 8) | c2; + asc += b64chs[u32 >> 18 & 63] + + b64chs[u32 >> 12 & 63] + + b64chs[u32 >> 6 & 63] + + b64chs[u32 & 63]; + } + return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc; + }; + /** + * does what `window.btoa` of web browsers do. + * @param {String} bin binary string + * @returns {string} Base64-encoded string + */ + var _btoa = _hasbtoa ? function (bin) { return btoa(bin); } + : _hasBuffer ? function (bin) { return Buffer.from(bin, 'binary').toString('base64'); } + : btoaPolyfill; + var _fromUint8Array = _hasBuffer + ? function (u8a) { return Buffer.from(u8a).toString('base64'); } + : function (u8a) { + // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326 + var maxargs = 0x1000; + var strs = []; + for (var i = 0, l = u8a.length; i < l; i += maxargs) { + strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs))); + } + return _btoa(strs.join('')); + }; + /** + * converts a Uint8Array to a Base64 string. + * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5 + * @returns {string} Base64 string + */ + var fromUint8Array = function (u8a, urlsafe) { + if (urlsafe === void 0) { urlsafe = false; } + return urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a); + }; + // This trick is found broken https://github.com/dankogai/js-base64/issues/130 + // const utob = (src: string) => unescape(encodeURIComponent(src)); + // reverting good old fationed regexp + var cb_utob = function (c) { + if (c.length < 2) { + var cc = c.charCodeAt(0); + return cc < 0x80 ? c + : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6)) + + _fromCC(0x80 | (cc & 0x3f))) + : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f)) + + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + + _fromCC(0x80 | (cc & 0x3f))); + } + else { + var cc = 0x10000 + + (c.charCodeAt(0) - 0xD800) * 0x400 + + (c.charCodeAt(1) - 0xDC00); + return (_fromCC(0xf0 | ((cc >>> 18) & 0x07)) + + _fromCC(0x80 | ((cc >>> 12) & 0x3f)) + + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + + _fromCC(0x80 | (cc & 0x3f))); + } + }; + var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; + /** + * @deprecated should have been internal use only. + * @param {string} src UTF-8 string + * @returns {string} UTF-16 string + */ + var utob = function (u) { return u.replace(re_utob, cb_utob); }; + // + var _encode = _hasBuffer + ? function (s) { return Buffer.from(s, 'utf8').toString('base64'); } + : _TE + ? function (s) { return _fromUint8Array(_TE.encode(s)); } + : function (s) { return _btoa(utob(s)); }; + /** + * converts a UTF-8-encoded string to a Base64 string. + * @param {boolean} [urlsafe] if `true` make the result URL-safe + * @returns {string} Base64 string + */ + var encode = function (src, urlsafe) { + if (urlsafe === void 0) { urlsafe = false; } + return urlsafe + ? _mkUriSafe(_encode(src)) + : _encode(src); + }; + /** + * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5. + * @returns {string} Base64 string + */ + var encodeURI = function (src) { return encode(src, true); }; + // This trick is found broken https://github.com/dankogai/js-base64/issues/130 + // const btou = (src: string) => decodeURIComponent(escape(src)); + // reverting good old fationed regexp + var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; + var cb_btou = function (cccc) { + switch (cccc.length) { + case 4: + var cp = ((0x07 & cccc.charCodeAt(0)) << 18) + | ((0x3f & cccc.charCodeAt(1)) << 12) + | ((0x3f & cccc.charCodeAt(2)) << 6) + | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000; + return (_fromCC((offset >>> 10) + 0xD800) + + _fromCC((offset & 0x3FF) + 0xDC00)); + case 3: + return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12) + | ((0x3f & cccc.charCodeAt(1)) << 6) + | (0x3f & cccc.charCodeAt(2))); + default: + return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6) + | (0x3f & cccc.charCodeAt(1))); + } + }; + /** + * @deprecated should have been internal use only. + * @param {string} src UTF-16 string + * @returns {string} UTF-8 string + */ + var btou = function (b) { return b.replace(re_btou, cb_btou); }; + /** + * polyfill version of `atob` + */ + var atobPolyfill = function (asc) { + // console.log('polyfilled'); + asc = asc.replace(/\s+/g, ''); + if (!b64re.test(asc)) + throw new TypeError('malformed base64.'); + asc += '=='.slice(2 - (asc.length & 3)); + var u24, bin = '', r1, r2; + for (var i = 0; i < asc.length;) { + u24 = b64tab[asc.charAt(i++)] << 18 + | b64tab[asc.charAt(i++)] << 12 + | (r1 = b64tab[asc.charAt(i++)]) << 6 + | (r2 = b64tab[asc.charAt(i++)]); + bin += r1 === 64 ? _fromCC(u24 >> 16 & 255) + : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255) + : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255); + } + return bin; + }; + /** + * does what `window.atob` of web browsers do. + * @param {String} asc Base64-encoded string + * @returns {string} binary string + */ + var _atob = _hasatob ? function (asc) { return atob(_tidyB64(asc)); } + : _hasBuffer ? function (asc) { return Buffer.from(asc, 'base64').toString('binary'); } + : atobPolyfill; + // + var _toUint8Array = _hasBuffer + ? function (a) { return _U8Afrom(Buffer.from(a, 'base64')); } + : function (a) { return _U8Afrom(_atob(a), function (c) { return c.charCodeAt(0); }); }; + /** + * converts a Base64 string to a Uint8Array. + */ + var toUint8Array = function (a) { return _toUint8Array(_unURI(a)); }; + // + var _decode = _hasBuffer + ? function (a) { return Buffer.from(a, 'base64').toString('utf8'); } + : _TD + ? function (a) { return _TD.decode(_toUint8Array(a)); } + : function (a) { return btou(_atob(a)); }; + var _unURI = function (a) { return _tidyB64(a.replace(/[-_]/g, function (m0) { return m0 == '-' ? '+' : '/'; })); }; + /** + * converts a Base64 string to a UTF-8 string. + * @param {String} src Base64 string. Both normal and URL-safe are supported + * @returns {string} UTF-8 string + */ + var decode = function (src) { return _decode(_unURI(src)); }; + /** + * check if a value is a valid Base64 string + * @param {String} src a value to check + */ + var isValid = function (src) { + if (typeof src !== 'string') + return false; + var s = src.replace(/\s+/g, '').replace(/={0,2}$/, ''); + return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s); + }; + // + var _noEnum = function (v) { + return { + value: v, enumerable: false, writable: true, configurable: true + }; + }; + /** + * extend String.prototype with relevant methods + */ + var extendString = function () { + var _add = function (name, body) { return Object.defineProperty(String.prototype, name, _noEnum(body)); }; + _add('fromBase64', function () { return decode(this); }); + _add('toBase64', function (urlsafe) { return encode(this, urlsafe); }); + _add('toBase64URI', function () { return encode(this, true); }); + _add('toBase64URL', function () { return encode(this, true); }); + _add('toUint8Array', function () { return toUint8Array(this); }); + }; + /** + * extend Uint8Array.prototype with relevant methods + */ + var extendUint8Array = function () { + var _add = function (name, body) { return Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); }; + _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); }); + _add('toBase64URI', function () { return fromUint8Array(this, true); }); + _add('toBase64URL', function () { return fromUint8Array(this, true); }); + }; + /** + * extend Builtin prototypes with relevant methods + */ + var extendBuiltins = function () { + extendString(); + extendUint8Array(); + }; + var gBase64 = { + version: version, + VERSION: VERSION, + atob: _atob, + atobPolyfill: atobPolyfill, + btoa: _btoa, + btoaPolyfill: btoaPolyfill, + fromBase64: decode, + toBase64: encode, + encode: encode, + encodeURI: encodeURI, + encodeURL: encodeURI, + utob: utob, + btou: btou, + decode: decode, + isValid: isValid, + fromUint8Array: fromUint8Array, + toUint8Array: toUint8Array, + extendString: extendString, + extendUint8Array: extendUint8Array, + extendBuiltins: extendBuiltins + }; + // + // export Base64 to the namespace + // + // ES5 is yet to have Object.assign() that may make transpilers unhappy. + // gBase64.Base64 = Object.assign({}, gBase64); + gBase64.Base64 = {}; + Object.keys(gBase64).forEach(function (k) { return gBase64.Base64[k] = gBase64[k]; }); + return gBase64; +})); diff --git a/jun_pc_web/assets/js/common.js b/jun_pc_web/assets/js/common.js new file mode 100644 index 000000000..d5047ee52 --- /dev/null +++ b/jun_pc_web/assets/js/common.js @@ -0,0 +1,47 @@ +/** EasyWeb iframe v3.1.8 date:2020-05-04 License By http://easyweb.vip */ +layui.config({ // common.js是配置layui扩展模块的目录,每个页面都需要引入 + version: '318', // 更新组件缓存,设为true不缓存,也可以设一个固定值 + base: getProjectUrl() + 'assets/module/' +}).extend({ + steps: 'steps/steps', + notice: 'notice/notice', + cascader: 'cascader/cascader', + dropdown: 'dropdown/dropdown', + fileChoose: 'fileChoose/fileChoose', + Split: 'Split/Split', + Cropper: 'Cropper/Cropper', + tagsInput: 'tagsInput/tagsInput', + citypicker: 'city-picker/city-picker', + introJs: 'introJs/introJs', + treetable: 'treetable-lay/treetable', + zTree: 'zTree/zTree', + xnUtil: 'xnUtil/xnUtil' +}).use(['layer', 'admin'], function () { + var $ = layui.jquery; + var layer = layui.layer; + var admin = layui.admin; + +}); + +if (typeof $ == "undefined") { + console.log("11111111 111"); + window.jQuery = layui.jquery; + window.$ = layui.jquery; +} + +/** 获取当前项目的根路径,通过获取layui.js全路径截取assets之前的地址 */ +function getProjectUrl() { + var layuiDir = layui.cache.dir; + if (!layuiDir) { + var js = document.scripts, last = js.length - 1, src; + for (var i = last; i > 0; i--) { + if (js[i].readyState === 'interactive') { + src = js[i].src; + break; + } + } + var jsPath = src || js[last].src; + layuiDir = jsPath.substring(0, jsPath.lastIndexOf('/') + 1); + } + return layuiDir.substring(0, layuiDir.indexOf('assets')); +} diff --git a/jun_pc_web/assets/js/core.util.js b/jun_pc_web/assets/js/core.util.js new file mode 100644 index 000000000..1ef566b16 --- /dev/null +++ b/jun_pc_web/assets/js/core.util.js @@ -0,0 +1,262 @@ +/*工具类*/ +var CoreUtil = (function () { + var coreUtil = {}; + var datas ; + + /*GET*/ + coreUtil.sendGet = function(url, params, ft){ + this.sendAJAX(url, params, ft, "GET") + } + /*GET*/ + coreUtil.sendGet2 = function(url, params, ft){ + this.sendAJAX2(url, params, ft, "GET") + } + + /*POST*/ + coreUtil.sendPost = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "POST") + } + /*PUT*/ + coreUtil.sendPut = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "PUT") + } + /*DELETE*/ + coreUtil.sendDelete = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "DELETE") + } + + + /*ajax*/ + coreUtil.sendAJAX = function(url, params, ft, method){ + var loadIndex = top.layer.load(0, {shade: false}); + $.ajax({ + url: url, + cache: false, + async: true, + data: params, + type: method, + contentType: 'application/json; charset=UTF-8', + dataType: "json", + beforeSend: function(request) { + request.setRequestHeader("authorization", CoreUtil.getData("access_token")); + }, + success: function (res) { + top.layer.close(loadIndex); + if (res.code==0 || res.code==200){ + if(ft!=null&&ft!=undefined){ + ft(res); + } + }else if(res.code==401001){ //凭证过期重新登录 + layer.msg("凭证过期请重新登录", {time:2000}, function () { + top.window.location.href="/login.html" + }) + }else if(res.code==401008){ //凭证过期重新登录 + layer.msg("抱歉!您暂无权限", {time:2000}) + }else if(res.code==500001){ //凭证过期重新登录 + layer.msg(res.msg+",请联系管理员!", {time:2000}); + return; + } else { + layer.msg(res.msg, {time:2000}); + } + }, + error:function (XMLHttpRequest, textStatus, errorThrown) { + top.layer.close(loadIndex); + if(XMLHttpRequest.status==404){ + top.window.location.href="/404.html"; + }else{ + layer.msg("服务器好像除了点问题!请稍后试试"); + } + } + }) + }; + + + /*ajax*/ + coreUtil.sendAJAX2 = function(url, params, ft, method){ + $.ajax({ + url: url, + cache: false, + async: false, + data: params, + type: method, + contentType: 'application/json; charset=UTF-8', + dataType: "json", + beforeSend: function(request) { + request.setRequestHeader("authorization", CoreUtil.getData("access_token")); + }, + success: function (res) { + if (res.code==0){ + if(ft!=null&&ft!=undefined){ + ft(res); + } + }else if(res.code==401001){ //凭证过期重新登录 + layer.msg("凭证过期请重新登录", {time:2000}, function () { + top.window.location.href="/login.html" + }) + }else if(res.code==401008){ //凭证过期重新登录 + layer.msg("抱歉!您暂无权限", {time:2000}) + } else { + layer.msg(res.msg); + } + }, + error:function (XMLHttpRequest, textStatus, errorThrown) { + if(XMLHttpRequest.status==404){ + top.window.location.href="/404.html"; + }else{ + layer.msg("服务器好像除了点问题!请稍后试试"); + } + } + }) + }; + + + /*存入本地缓存*/ + coreUtil.setData = function(key, value){ + layui.data('LocalData',{ + key :key, + value: value + }) + }; + /*从本地缓存拿数据*/ + coreUtil.getData = function(key){ + var localData = layui.data('LocalData'); + return localData[key]; + }; + + coreUtil.setLocal = function(key, value){ + layui.data('LocalData1',{ + key :key, + value: value + }) + }; + /*从本地缓存拿数据*/ + coreUtil.getLocal = function(key){ + var localData = layui.data('LocalData1'); + return localData[key]; + }; + + //判断字符是否为空的方法 + coreUtil.isEmpty = function(obj){ + if(typeof obj == "undefined" || obj == null || obj == ""){ + return true; + }else{ + return false; + } + } + + //字典数据回显 + coreUtil.selectDictLabel = function (datas, value) { + //datas = JSON.parse(datas); + var label = ""; + if(datas.code != 500){ + $.each(datas, function(index, dict) { + if (dict.value == ('' + value)) { + label = dict.label; + return false; + } + }); + //匹配不到,返回未知 + if (CoreUtil.isEmpty(label)) { + return "未知"; + } + } + return label; + } + + + + //字典数据回显 + coreUtil.getSysDict = function (name) { + var dictTemp = CoreUtil.getLocal("SysDict-"+name); + if (dictTemp!=undefined && !CoreUtil.isEmpty(dictTemp)) { + return dictTemp; + } + + var datas ; + + // CoreUtil.sendGet2("/api/sysDict/getType/"+name, null, function (res) { + // console.log('res='+res); + // datas = res; + // }); + $.ajax({ + url: "/api/sysDict/getType/"+name, + cache: false, + async: false, + data: {"abc":1}, + type: "POST", + contentType: 'application/json; charset=UTF-8', + dataType: "json", + beforeSend: function(request) { + request.setRequestHeader("authorization", CoreUtil.getData("access_token")); + }, + success: function (res) { + if (res.code==0){ + if(ft!=null&&ft!=undefined){ + ft(res); + } + }else if(res.code==401001){ //凭证过期重新登录 + layer.msg("凭证过期请重新登录", {time:2000}, function () { + top.window.location.href="/login.html" + }) + }else if(res.code==401008){ //凭证过期重新登录 + layer.msg("抱歉!您暂无权限", {time:2000}) + } else { + layer.msg(res.msg); + } + console.log('res='+res); + datas = res; + }, + error:function (XMLHttpRequest, textStatus, errorThrown) { + if(XMLHttpRequest.status==404){ + top.window.location.href="/404.html"; + }else{ + layer.msg("服务器好像除了点问题!请稍后试试"); + } + } + }); + + //匹配不到,返回未知 + if(CoreUtil.isEmpty(datas) || datas==undefined) { + console.log('error:'+11111); + }else{ + console.log(datas.length); + } + CoreUtil.setLocal("SysDict-"+name,datas); + return datas; + + } + + return coreUtil; +})(CoreUtil, window); + +if (!String.prototype.includes) { + String.prototype.includes = function(search, start) { + 'use strict'; + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; +} + +/** 获取当前项目的根路径,通过获取layui.js全路径截取assets之前的地址 */ +function getProjectUrl() { + var layuiDir = layui.cache.dir; + if (!layuiDir) { + var js = document.scripts, last = js.length - 1, src; + for (var i = last; i > 0; i--) { + if (js[i].readyState === 'interactive') { + src = js[i].src; + break; + } + } + var jsPath = src || js[last].src; + layuiDir = jsPath.substring(0, jsPath.lastIndexOf('/') + 1); + } + return layuiDir.substring(0, layuiDir.indexOf('assets')); +} diff --git a/jun_pc_web/assets/js/grid-init.js b/jun_pc_web/assets/js/grid-init.js new file mode 100644 index 000000000..10b97fc91 --- /dev/null +++ b/jun_pc_web/assets/js/grid-init.js @@ -0,0 +1,502 @@ +var table, form, currentLayer; +var gridArgs = { + deleteUrl : null, + updateUrl : null, + detailUrl : null, + addUrl : null, + /** 重置密码 **/ + resetUrl : null, + /** 数据主键* */ + dataId : "id", + /** 表格标题* */ + title : null, + /**特殊的ajax请求**/ + ajaxUrl:null, + /**提示信息**/ + resetTitle:null, + //弹窗是否最大化 + isMax:false, + //弹窗宽度 + width:null, + //弹窗高度 + height:null, + //弹窗回调函数 + options:null +}; +/** + * 表格初始化 + * + *

    + * 使用例子,searchForm:'searchForm',为查询表单form的属性lay-filter='searchForm',edit2对应layer-event + *

    + * gridArgs_.title = '消息类别'; gridArgs_.dataId = 'id'; gridArgs_.deleteUrl = '<@path/>/msg/msgType/del.do'; + * gridArgs_.updateUrl = '<@path/>/msg/msgType/updateView.do?id='; + * gridArgs_.detailUrl = '<@path/>/msg/msgType/detailView.do?id='; + * gridArgs_.addUrl = '<@path/>/msg/msgType/addView.do'; gridArgs_.listUrl = '<@path/>/msg/msgType/list.do'; + * initGrid({cols : [ [{ field : 'id', title : '主键', width : 100, checkbox : + * true }, { field : 'name', title : '名称', width : 200, sort : true }, { width : + * 250, align : 'center', toolbar : '#barDemo' } // 这里的toolbar值是模板元素的选择器 + * ]],page:false,searchForm:'searchForm'}, {edit2:function(obj){ log(obj); + * alert(234); }}); + * + * @param options + * @param events + * 时间表,如果要添加例如审批的事件 + * @param initGridArgs + * gridArgs参数,如果为空则用外面定义的全局变量gridArgs + * @returns + */ +function initGrid(options, events, initGridArgs) { + var gridArgs_ = null; + if (typeof initGridArgs == 'undefined') { + gridArgs_ = gridArgs; + } else { + gridArgs_ = initGridArgs; + if(gridArgs_.dataId==null){ + gridArgs_.dataId="id"; + } + } + var searchFormHeight=32; + if(options.searchForm){ + searchFormHeight=32+$('#'+options.searchForm).height(); + } + var heightDiff=gridArgs_.heightDiff||searchFormHeight; + + var addBtn=gridArgs_.addButton||'#addBtn_'; + var addBtn2=gridArgs_.addButton2||'#addBtn_2'; + var refreshBtn=gridArgs_.refreshButton||'#refreshBtn_'; + var deleteBtn=gridArgs_.deleteButton||'#deleteBtn_'; + var ajaxBtn=gridArgs_.ajaxButton||'#ajaxBtn_'; + var resetBtn=gridArgs_.resetButton||'#resetBtn_'; + + layui.use([ 'table', 'form', 'jquery' ], function() { + table = layui.table; + var form = layui.form; + var layer = layui.layer; + var $ = layui.$; + var tableOptions = $.extend({ + id : 'maingrid', + elem : '#maingrid' // 指定原始表格元素选择器(推荐id选择器) + , + height : 'full-'+heightDiff // 容器高度 + , + request : { + pageName : 'pageNumber' // 页码的参数名称,默认:page + , + limitName : 'pageSize' // 每页数据量的参数名,默认:limit + }, + response : { + countName : 'totalCount' // 数据总数的字段名称,默认:count + , + dataName : 'list' // 数据列表的字段名称,默认:data + }, + url : gridArgs_.listUrl, + limit:gridArgs_.pageSize||20,//分页初始化大小 + limits:gridArgs_.limits||[10,20,50,100,200,500], //分页数组,默认[10,20,30,40,50,60,70,80,90] + page : true, + done:function(res){ + $("#searchBtn_").removeClass("layui-btn-disabled").prop("disabled",false); + } + }, options) + + // 执行渲染 + table.render(tableOptions); + //监听头工具栏事件 + table.on('toolbar(' + options.id + ')', function(obj){ + var checkStatus = table.checkStatus(obj.config.id) + ,data = checkStatus.data; //获取选中的数据 + switch(obj.event){ + case 'add': + currentLayer=openDialog('添加' + gridArgs_.title, gridArgs_.addUrl, gridArgs_.isMax, gridArgs_.width, gridArgs_.height, { + end : function() { + refreshData();//刷新当前页数据 + } + }); + break; + case 'update': + if(data.length === 0){ + layer.msg('请选择一行'); + } else if(data.length > 1){ + layer.msg('只能同时编辑一个'); + } else { + currentLayer=openDialog('编辑' + gridArgs_.title, gridArgs_.updateUrl + data[0][gridArgs_.dataId], gridArgs_.isMax, gridArgs_.width, gridArgs_.height, { + end : function() { + refreshData();//刷新当前页数据 + } + }); + } + break; + case 'delete': + if(data.length === 0){ + layer.msg('请选择一行'); + } else { + var checkStatus = table.checkStatus(options.id); // test即为基础参数id对应的值 + + if(checkStatus.data.length>0){ + layer.confirm('确认删除?', {icon: 3}, function(index) { + var ids = []; + for (var i = 0; i < checkStatus.data.length; i++) { + ids[i] = checkStatus.data[i][gridArgs_.dataId]; + } + // 向服务端发送删除指令 + jQuery.post(gridArgs_.deleteUrl, param({ + 'ids' : ids + }), function(feedback) { + if (feedback.success) { + refreshData(); + } else { + layer.alert(feedback.msg,{icon: 2}); + } + }); + layer.close(index); + }); + }else{ + layer.alert('请选择行',{icon: 7}); + } + } + break; + case 'refresh': + var keyDownEvt = $.Event('keydown', { + keyCode : 13 + }); + + var button = $(".layui-laypage-btn"); + if (button.length > 0) { + refreshData(); + }else{ + $('#' + tableOptions.searchForm).trigger(keyDownEvt); + } + break; + case 'reset': + var checkStatus = table.checkStatus(options.id); // test即为基础参数id对应的值 + + if(checkStatus.data.length>0){ + layer.confirm(gridArgs_.resetTitle||'确认重置密码?', {icon: 3, title:'提示'}, function(index) { + var ids = []; + for (var i = 0; i < checkStatus.data.length; i++) { + ids[i] = checkStatus.data[i][gridArgs_.dataId]; + } + // 向服务端发送删除指令 + jQuery.post(gridArgs_.resetUrl, param({ + 'ids' : ids + }), function(feedback) { + if (feedback.success) { + refreshData(); + layer.msg(feedback.msg); + } else { + layer.alert(feedback.msg,{icon: 2}); + } + }); + layer.close(index); + }); + }else{ + layer.alert('请选择行',{icon: 7}); + } + break; + case 'LAYTABLE_TIPS': + layer.alert('这是工具栏右侧自定义的一个图标按钮'); + break; + default: + if (typeof events != 'undefined') { + + for (evt in events) { + var func = events[evt]; + if (obj.event == evt) { + func.call(this, obj); + } + } + } + break; + }; + }); + + // 监听工具条 + table.on('tool(' + options.id + ')', function(obj) { // 注:tool是工具条事件名,operations是table原始容器的属性,这里设置为跟ID一样 + // lay-filter="对应的值" + var data = obj.data; // 获得当前行数据 + var layEvent = obj.event; // 获得 lay-event 对应的值 + var tr = obj.tr; // 获得当前行 tr 的DOM对象 + if (layEvent === 'detail') { // 查看 + var id = data[gridArgs_.dataId]; + currentLayer=openDialog(gridArgs_.title + '详情', gridArgs_.detailUrl + id, gridArgs_.isMax, gridArgs_.width, gridArgs_.height,gridArgs_.options); + } else if (layEvent === 'detail_') { + currentLayer=openDialog(gridArgs_.title + '详情', gridArgs_.detailUrl + id, false, 650, 400,gridArgs_.options); + } else if (layEvent === 'del') { // 删除 + layer.confirm('确认删除?', {icon: 3},function(index) { + jQuery.post(gridArgs_.deleteUrl, { + 'ids[0]' : data[gridArgs_.dataId] + }, function(feedback) { + if (feedback.success) { + obj.del(); // 删除对应行(tr)的DOM结构 + } else { + layer.alert(feedback.msg,{icon: 2}); + } + }); + layer.close(index); + // 向服务端发送删除指令 + }); + } else if (layEvent === 'edit') { // 编辑 + currentLayer=openDialog('编辑' + gridArgs_.title, gridArgs_.updateUrl + data[gridArgs_.dataId], gridArgs_.isMax, gridArgs_.width, gridArgs_.height, { + end : function() { + refreshData();//刷新当前页数据 + } + }); + } else if (layEvent === 'edit_') { // 编辑 + currentLayer=openDialog('编辑' + gridArgs_.title, gridArgs_.updateUrl + data[gridArgs_.dataId], false, 650, 400, { + end : function() { + refreshData();//刷新当前页数据 + } + }); + } else { + if (typeof events != 'undefined') { + + for (evt in events) { + var func = events[evt]; + if (layEvent == evt) { + func.call(this, obj); + } + } + } + } + }); + // 排序 + table.on('sort(' + tableOptions.id + ')', function(obj) { // 注:tool是工具条事件名,test是table原始容器的属性 + // 尽管我们的 table 自带排序功能,但并没有请求服务端。 + // 有些时候,你可能需要根据当前排序的字段,重新向服务端发送请求,如: + table.reload(options.id, { + initSort : obj // 记录初始排序,如果不设的话,将无法标记表头的排序状态。 layui 2.1.1 新增参数 + , + where : { // 请求参数 + sortname : obj.field // 排序字段 + , + sortorder : obj.type + // 排序方式 + } + }); + }); + // 查询提交 + form.on('submit(' + tableOptions.searchForm + ')', function(data) { + var data = jQuery(data.elem).formToArray(); + var params = tableOptions.where||{}; + for ( var k in data) { + if (data[k]) { + params[data[k].name] = data[k].value; + } else { + params[data[k].name] = null; + delete params[data[k].name]; + } + } + table.reload(tableOptions.id, { + where : params + ,page: { + curr: 1 //重新从第 1 页开始 + } + }); + event.preventDefault(); + event.stopPropagation(); + return false; + }); + + //回车键查询 + $('#' + tableOptions.searchForm).off('bind'); + $('#' + tableOptions.searchForm).bind('keydown', function(event) { + if (event.keyCode == 13) { + $('#' + tableOptions.searchForm).submit(); + } + }); + + $('button[search]').off('click'); + $('button[search]').click(function() { + var searchId = $(this).attr('search'); + log(searchId); + var keyDownEvt = $.Event('keydown', { + keyCode : 13 + }); + $('#' + searchId).trigger(keyDownEvt); + }); + // 添加 + $(addBtn).off('click'); + $(addBtn).click(function() { + currentLayer=openDialog('添加' + gridArgs_.title, gridArgs_.addUrl, gridArgs_.isMax, gridArgs_.width, gridArgs_.height, { + end : function() { + var button = $(".layui-laypage-btn"); + if (button.length > 0) { + refreshData(); + } else { + table.reload(options.id, {}); + } + } + }); + }); + + $(addBtn2).off('click'); + $(addBtn2).click(function() { + currentLayer=openDialog('添加' + gridArgs_.title, gridArgs_.addUrl, false, 650, 400, { + end : function() { + var button = $(".layui-laypage-btn"); + if (button.length > 0) { + refreshData(); + } else { + table.reload(options.id, {}); + } + } + }); + }); +// $('#'+tableOptions.searchForm).removeAttr('action'); + // 刷新 + $(refreshBtn).off('click'); + $(refreshBtn).click(function() { + var keyDownEvt = $.Event('keydown', { + keyCode : 13 + }); + + var button = $(".layui-laypage-btn"); + if (button.length > 0) { + refreshData(); + }else{ + $('#' + tableOptions.searchForm).trigger(keyDownEvt); + } + }); + // 删除多条 + $(deleteBtn).off('click'); + $(deleteBtn).click(function() { + var checkStatus = table.checkStatus(options.id); // test即为基础参数id对应的值 + + if(checkStatus.data.length>0){ + layer.confirm('确认删除?', {icon: 3}, function(index) { + var ids = []; + for (var i = 0; i < checkStatus.data.length; i++) { + ids[i] = checkStatus.data[i][gridArgs_.dataId]; + } + // 向服务端发送删除指令 + jQuery.post(gridArgs_.deleteUrl, param({ + 'ids' : ids + }), function(feedback) { + if (feedback.success) { + refreshData(); + } else { + layer.alert(feedback.msg,{icon: 2}); + } + }); + layer.close(index); + }); + }else{ + layer.alert('请选择行',{icon: 7}); + } + }); + // 重置密码 + $(resetBtn).off('click'); + $(resetBtn).click(function() { + var checkStatus = table.checkStatus(options.id); // test即为基础参数id对应的值 + + if(checkStatus.data.length>0){ + layer.confirm(gridArgs_.resetTitle||'确认重置密码?', {icon: 3, title:'提示'}, function(index) { + var ids = []; + for (var i = 0; i < checkStatus.data.length; i++) { + ids[i] = checkStatus.data[i][gridArgs_.dataId]; + } + // 向服务端发送删除指令 + jQuery.post(gridArgs_.resetUrl, param({ + 'ids' : ids + }), function(feedback) { + if (feedback.success) { + refreshData(); + layer.msg(feedback.msg); + } else { + layer.alert(feedback.msg,{icon: 2}); + } + }); + layer.close(index); + }); + }else{ + layer.alert('请选择行',{icon: 7}); + } + }); + + // 特殊的ajax请求 + $(ajaxBtn).off('click'); + $(ajaxBtn).click(function() { + var checkStatus = table.checkStatus(options.id); // test即为基础参数id对应的值 + + if(checkStatus.data.length>0){ + var ids = []; + for (var i = 0; i < checkStatus.data.length; i++) { + ids[i] = checkStatus.data[i][gridArgs_.dataId]; + } + // 向服务端发送ajax指令 + jQuery.post(gridArgs_.ajaxUrl, param({ + 'ids' : ids + }), function(feedback) { + if (feedback.success) { + refreshData(); + } else { + layer.alert(feedback.msg,{icon: 2}); + } + }); + }else{ + layer.alert('请选择行',{icon: 7}); + } + }); + + //时间戳的处理 + //表格用法:{title: '创建时间', field: 'CREATE_TIME_',templet:'
    {{ layui.laytpl.toDateString(d.CREATE_TIME_,"yyyy-MM-dd") }}
    '}, + layui.laytpl.toDateString = formateDate; + + //数字前置补零 + layui.laytpl.digit = digit; + }); +} +// end initGrid +// 关闭当前弹出框 +function closeCurrentLayer() { + if (currentLayer) { + layer.close(currentLayer); + } +} +// 重新渲染表格 +function loadGrid() { + table.reload('maingrid', {}); +} +//刷新当前页数据 +function refreshData(){ + var button = $(".layui-laypage-btn"); + if (button.length > 0) { + $(".layui-laypage-btn").click(); + } else { + loadGrid() + } +} +var digit = function(num, length, end){ + var str = ''; + num = String(num); + length = length || 2; + for(var i = num.length; i < length; i++){ + str += '0'; + } + return num < Math.pow(10, length) ? str + (num|0) : num; + }; +function formateDate(d, format){ + if(d ==undefined)return ""; + d=d.replace(/-/g,"/"); + var date = new Date(d || new Date()) + ,ymd = [ + digit(date.getFullYear(), 4), + digit(date.getMonth() + 1), + digit(date.getDate()) + ] + ,hms = [ + digit(date.getHours()) + ,digit(date.getMinutes()) + ,digit(date.getSeconds()) + ]; + + format = format || 'yyyy-MM-dd HH:mm:ss'; + + return format.replace(/yyyy/g, ymd[0]) + .replace(/MM/g, ymd[1]) + .replace(/dd/g, ymd[2]) + .replace(/HH/g, hms[0]) + .replace(/mm/g, hms[1]) + .replace(/ss/g, hms[2]); + }; + diff --git a/jun_pc_web/assets/js/jquery-3.2.1.min.js b/jun_pc_web/assets/js/jquery-3.2.1.min.js new file mode 100644 index 000000000..644d35e27 --- /dev/null +++ b/jun_pc_web/assets/js/jquery-3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + diff --git a/jun_pc_web/assets/module/tinymce/plugins/bbcode/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 000000000..a4fa39e91 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function i(t){function o(o,e){t=t.replace(o,e)}return t=n.trim(t),o(/\n/gi,"
    "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t}var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=i(o.content)}),o.on("PostProcess",function(o){function e(o,e){t=t.replace(o,e)}var t;o.set&&(o.content=i(o.content)),o.get&&(o.content=(t=o.content,t=n.trim(t),e(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/(.*?)<\/font>/gi,"$1"),e(//gi,"[img]$1[/img]"),e(/(.*?)<\/span>/gi,"[code]$1[/code]"),e(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),e(/<\/(strong|b)>/gi,"[/b]"),e(/<(strong|b)>/gi,"[b]"),e(/<\/(em|i)>/gi,"[/i]"),e(/<(em|i)>/gi,"[i]"),e(/<\/u>/gi,"[/u]"),e(/(.*?)<\/span>/gi,"[u]$1[/u]"),e(//gi,"[u]"),e(/]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/
    /gi,"\n"),e(//gi,"\n"),e(/
    /gi,"\n"),e(/

    /gi,""),e(/<\/p>/gi,"\n"),e(/ |\u00a0/gi," "),e(/"/gi,'"'),e(/</gi,"<"),e(/>/gi,">"),e(/&/gi,"&"),t))})})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/charmap/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 000000000..a17128e7c --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function l(e,r){var n=e.fire("insertCustomChar",{chr:r}).chr;e.execCommand("mceInsertContent",!1,n)}function i(e){return function(){return e}}function e(e){return e}function r(){return c}var t,g,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(e){return n=typeof(r=e),(null===r?"null":"object"==n&&(Array.prototype.isPrototypeOf(r)||r.constructor&&"Array"===r.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(r)||r.constructor&&"String"===r.constructor.name)?"string":n)===t;var r,n},m=i(!(t="array")),o=i(!(g=null)),c={fold:function(e,r){return e()},isSome:m,isNone:o,getOr:e,getOrThunk:u,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:u,map:r,each:function(){},bind:r,exists:m,forall:o,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function u(e){return e()}function f(e,r){for(var n=e.length,t=new Array(n),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?n.push(o):(o-=65536,n.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,n),n.length=0)}return t+String.fromCharCode.apply(null,n)}function v(e,r){var c=[],u=r.toLowerCase();return function(e){for(var r,n,t,a,i=0,o=e.length;i'+r+""),t.selection.select(t.$("#__new").removeAttr("id")[0])},function(e){t.dom.setAttrib(e,"class","language-"+a),e.innerHTML=r,h(t).highlightElement(e),t.selection.select(e)})}),e.close()}})}!function(e,n){var t,a,r=window.Prism;window.Prism={manual:!0},t=this,a=function(){var e,n,h,t,a,r,s,i,o,l,u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:f,c={exports:{}};function y(e,n){return"___"+e.toUpperCase()+n+"___"}return e=c,n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},j={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof T?new T(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=i.reach);y+=h.value.length,h=h.next){var w=h.value;if(t.length>n.length)return;if(!(w instanceof T)){var k,v=1;if(b){if(!(k=O(f,y,n,g)))break;var _=k.index,x=k.index+k[0].length,F=y;for(F+=h.value.length;F<=_;)F+=(h=h.next).value.length;if(y=F-=h.value.length,h.value instanceof T)continue;for(var P=h;P!==t.tail&&(Fi.reach&&(i.reach=z);var E=h.prev;S&&(E=N(t,E,S),y+=S.length),function(e,n,t){for(var a=n.next,r=0;ri.reach&&(i.reach=C.reach))}}}}(e,r,n,r.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(r)},hooks:{all:{},add:function(e,n){var t=j.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=j.hooks.all[e];if(t&&t.length)for(var a,r=0;a=t[r++];)a(n)}},Token:T};function T(e,n,t,a){this.type=e,this.content=n,this.alias=t,this.length=0|(a||"").length}function O(e,n,t,a){e.lastIndex=n;var r,s=e.exec(t);return s&&a&&s[1]&&(r=s[1].length,s.index+=r,s[0]=s[0].slice(r)),s}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function N(e,n,t){var a=n.next,r={value:t,prev:n,next:a};return n.next=r,a.prev=r,e.length++,r}if(u.Prism=j,T.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var a="";return e.forEach(function(e){a+=n(e,t)}),a}var r={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},s=e.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(r.classes,s):r.classes.push(s)),j.hooks.run("wrap",r);var i,o="";for(i in r.attributes)o+=" "+i+'="'+(r.attributes[i]||"").replace(/"/g,""")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+o+">"+r.content+""},!u.document)return u.addEventListener&&(j.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,a=n.code,r=n.immediateClose;u.postMessage(j.highlight(a,j.languages[t],t)),r&&u.close()},!1)),j;var t,a=j.util.currentScript();function r(){j.manual||j.highlightAll()}return a&&(j.filename=a.src,a.hasAttribute("data-manual")&&(j.manual=!0)),j.manual||("loading"===(t=document.readyState)||"interactive"===t&&a&&a.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),j}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}),e.exports&&(e.exports=n),void 0!==u&&(u.Prism=n),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},h=Prism,Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,s){var i;a.language===r&&(i=a.tokenStack=[],a.code=a.code.replace(e,function(e){if("function"==typeof s&&!s(e))return e;for(var n,t=i.length;-1!==a.code.indexOf(n=y(r,t));)++t;return i[t]=e,n}),a.grammar=h.languages.markup)}},tokenizePlaceholders:{value:function(g,b){var m,f;g.language===b&&g.tokenStack&&(g.grammar=h.languages[b],m=0,f=Object.keys(g.tokenStack),function e(n){for(var t=0;t=f.length);t++){var a,r,s,i,o,l,u,c,d,p=n[t];"string"==typeof p||p.content&&"string"==typeof p.content?(a=f[m],r=g.tokenStack[a],s="string"==typeof p?p:p.content,i=y(b,a),-1<(o=s.indexOf(i))&&(++m,l=s.substring(0,o),u=new h.Token(b,h.tokenize(r,g.grammar),"language-"+b,r),c=s.substring(o+i.length),d=[],l&&d.push.apply(d,e([l])),d.push(u),c&&d.push.apply(d,e([c])),"string"==typeof p?n.splice.apply(n,[t,1].concat(d)):p.content=d)):p.content&&e(p.content)}return n}(g.tokens))}}}),Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean,t=Prism,a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source}),t.languages.cpp=t.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),t.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:module|import)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return r})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),t.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t.languages.cpp}}}}),t.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),t.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:t.languages.extend("cpp",{})}}),t.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},t.languages.cpp["base-clause"]),function(t){function a(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function r(e,n,t){return RegExp(a(e,n),t||"")}function e(e,n){for(var t=0;t>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",s="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(s),c=RegExp(l(n+" "+s+" "+i+" "+o)),d=l(s+" "+i+" "+o),p=l(n+" "+s+" "+o),g=e(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=e(/\((?:[^()]|<>)*\)/.source,2),m=/@?\b[A-Za-z_]\w*\b/.source,f=a(/<<0>>(?:\s*<<1>>)?/.source,[m,g]),h=a(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=a(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[h,y]),k=a(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,b,y]),v=a(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=a(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,h,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,P=/"(?:\\.|[^\\"\r\n])*"/.source;t.languages.csharp=t.languages.extend("clike",{string:[{pattern:r(/(^|[^$\\])<<0>>/.source,[/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source]),lookbehind:!0,greedy:!0},{pattern:r(/(^|[^@$\\])<<0>>/.source,[P]),lookbehind:!0,greedy:!0},{pattern:RegExp(F),greedy:!0,alias:"character"}],"class-name":[{pattern:r(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[m,_]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+)<<0>>(?=\s*=)/.source,[m]),lookbehind:!0},{pattern:r(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:r(/(\bcatch\s*\(\s*)<<0>>/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\bwhere\s+)<<0>>/.source,[m]),lookbehind:!0},{pattern:r(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:r(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,p,m]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),t.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),t.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:r(/([(,]\s*)<<0>>(?=\s*:)/.source,[m]),lookbehind:!0,alias:"punctuation"}}),t.languages.insertBefore("csharp","class-name",{namespace:{pattern:r(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[m]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:r(/(\b(?:default|typeof|sizeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:r(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,h]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:r(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:r(/<<0>>\s*<<1>>(?=\s*\()/.source,[m,g]),inside:{function:r(/^<<0>>/.source,[m]),generic:{pattern:RegExp(g),alias:"class-name",inside:x}}},"type-list":{pattern:r(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,m,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:r(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:t.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var A=P+"|"+F,S=a(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[A]),$=e(a(/[^"'/()]|<<0>>|\(<>*\)/.source,[S]),2),z=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,E=a(/<<0>>(?:\s*\(<<1>>*\))?/.source,[h,$]);t.languages.insertBefore("csharp","class-name",{attribute:{pattern:r(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[z,E]),lookbehind:!0,greedy:!0,inside:{target:{pattern:r(/^<<0>>(?=\s*:)/.source,[z]),alias:"keyword"},"attribute-arguments":{pattern:r(/\(<<0>>*\)/.source,[$]),inside:t.languages.csharp},"class-name":{pattern:RegExp(h),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var C=/:[^}\r\n]+/.source,j=e(a(/[^"'/()]|<<0>>|\(<>*\)/.source,[S]),2),T=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,C]),O=e(a(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[A]),2),N=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,C]);function B(e,n){return{interpolation:{pattern:r(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[e]),lookbehind:!0,inside:{"format-string":{pattern:r(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[n,C]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:t.languages.csharp}}},string:/[\s\S]+/}}t.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:r(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[T]),lookbehind:!0,greedy:!0,inside:B(T,j)},{pattern:r(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:B(N,O)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp,function(e){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism),s=Prism,i=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,o=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,l={pattern:RegExp(o+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}},s.languages.java=s.languages.extend("clike",{"class-name":[l,{pattern:RegExp(o+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:l.inside}],keyword:i,function:[s.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),s.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),s.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":l,keyword:i,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return i.source})),lookbehind:!0,inside:{punctuation:/\./}}}),Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,n){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:Prism.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,function(n){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;n.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:s};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:n.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];n.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:a,operator:r,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),n.hooks.add("before-tokenize",function(e){/<\?/.test(e.code)&&n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism),Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:n}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby}(Prism),{boltExport:c.exports}},"object"==typeof e&&void 0!==n?n.exports=a():(t="undefined"!=typeof globalThis?globalThis:t||self).EphoxContactWrapper=a();window.Prism;window.Prism=r}(b,m);var k=m.exports.boltExport;t.add("codesample",function(n){var t,r,a,s;function e(){return s.execCommand("codesample")}r=(t=n).$,t.on("PreProcess",function(e){r("pre[contenteditable=false]",e.node).filter(c(u)).each(function(e,n){var t=r(n),a=n.textContent;t.attr("class",r.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(r("").each(function(){this.textContent=a}))})}),t.on("SetContent",function(){var e=r("pre").filter(c(u)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){r(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),h(t).highlightElement(n),n.className=r.trim(n.className)})})}),(s=n).ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:e,onSetup:function(t){function e(){var e,n;t.setActive((n=(e=s).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))}return s.on("NodeChange",e),function(){return s.off("NodeChange",e)}}}),s.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:e}),(a=n).addCommand("codesample",function(){var e=a.selection.getNode();a.selection.isCollapsed()||u(e)?w(a):a.formatter.toggle("code")}),n.on("dblclick",function(e){u(e.target)&&w(n)})})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/colorpicker/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 000000000..3b9247355 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/contextmenu/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 000000000..258bb2c94 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/directionality/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 000000000..9cf34afe5 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function n(t){return function(n){return typeof n===t}}function u(n){return function(){return n}}function t(n){return n}function r(){return d}var o,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return r=typeof(t=n),(null===t?"null":"object"==r&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":r)===o;var t,r},c=n("boolean"),f=n("function"),l=n("number"),a=u(!(o="string")),m=u(!0),d={fold:function(n,t){return n()},isSome:a,isNone:m,getOr:t,getOrThunk:s,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(void 0),or:t,orThunk:s,map:r,each:function(){},bind:r,exists:a,forall:m,filter:function(){return d},toArray:function(){return[]},toString:u("none()")};function s(n){return n()}function g(n,t){for(var r=0,o=n.length;r', + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + char: '\ud83d\udd22', + fitzpatrick_scale: false, + category: "symbols" + }, + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + char: '\ud83d\ude00', + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + char: '\ud83d\ude2c', + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + char: '\ud83d\ude01', + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + char: '\ud83d\ude02', + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + char: '\ud83e\udd23', + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + char: '\ud83e\udd73', + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + char: '\ud83d\ude03', + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + char: '\ud83d\ude04', + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + char: '\ud83d\ude05', + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + char: '\ud83d\ude06', + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + char: '\ud83d\ude07', + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + char: '\ud83d\ude09', + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + char: '\ud83d\ude0a', + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + char: '\ud83d\ude42', + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + char: '\ud83d\ude43', + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + char: '\u263a\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + char: '\ud83d\ude0b', + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + char: '\ud83d\ude0c', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + char: '\ud83d\ude0d', + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + char: '\ud83e\udd70', + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude18', + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude17', + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude19', + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude1a', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + char: '\ud83d\ude1c', + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + char: '\ud83e\udd2a', + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + char: '\ud83e\udd28', + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + char: '\ud83e\uddd0', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + char: '\ud83d\ude1d', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + char: '\ud83d\ude1b', + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + char: '\ud83e\udd11', + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + char: '\ud83e\udd13', + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + char: '\ud83d\ude0e', + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + char: '\ud83e\udd29', + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + char: '\ud83e\udd21', + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + char: '\ud83e\udd20', + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + char: '\ud83e\udd17', + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + char: '\ud83d\ude0f', + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + char: '\ud83d\ude36', + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + char: '\ud83d\ude10', + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + char: '\ud83d\ude11', + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + char: '\ud83d\ude12', + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + char: '\ud83d\ude44', + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + char: '\ud83e\udd14', + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + char: '\ud83e\udd25', + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + char: '\ud83e\udd2d', + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + char: '\ud83e\udd2b', + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + char: '\ud83e\udd2c', + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + char: '\ud83e\udd2f', + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + char: '\ud83d\ude33', + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + char: '\ud83d\ude1e', + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + char: '\ud83d\ude1f', + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + char: '\ud83d\ude20', + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + char: '\ud83d\ude21', + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + char: '\ud83d\ude14', + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + char: '\ud83d\ude15', + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + char: '\ud83d\ude41', + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + char: '\u2639', + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + char: '\ud83d\ude23', + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + char: '\ud83d\ude16', + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + char: '\ud83d\ude2b', + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + char: '\ud83d\ude29', + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + char: '\ud83e\udd7a', + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + char: '\ud83d\ude24', + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + char: '\ud83d\ude2e', + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + char: '\ud83d\ude31', + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + char: '\ud83d\ude28', + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + char: '\ud83d\ude30', + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + char: '\ud83d\ude2f', + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + char: '\ud83d\ude26', + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + char: '\ud83d\ude27', + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + char: '\ud83d\ude22', + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + char: '\ud83d\ude25', + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + char: '\ud83e\udd24', + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + char: '\ud83d\ude2a', + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + char: '\ud83d\ude13', + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + char: '\ud83e\udd75', + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + char: '\ud83e\udd76', + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + char: '\ud83d\ude2d', + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + char: '\ud83d\ude35', + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + char: '\ud83d\ude32', + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + char: '\ud83e\udd10', + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + char: '\ud83e\udd22', + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + char: '\ud83e\udd27', + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + char: '\ud83e\udd2e', + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + char: '\ud83d\ude37', + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + char: '\ud83e\udd12', + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + char: '\ud83e\udd15', + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + char: '\ud83e\udd74', + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + char: '\ud83d\ude34', + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + char: '\ud83d\udca4', + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + char: '\ud83d\udca9', + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + char: '\ud83d\ude08', + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + char: '\ud83d\udc7f', + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + char: '\ud83d\udc79', + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + char: '\ud83d\udc7a', + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + char: '\ud83d\udc80', + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + char: '\ud83d\udc7b', + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + char: '\ud83d\udc7d', + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + char: '\ud83e\udd16', + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + char: '\ud83d\ude3a', + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + char: '\ud83d\ude38', + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + char: '\ud83d\ude39', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + char: '\ud83d\ude3b', + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + char: '\ud83d\ude3c', + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + char: '\ud83d\ude3d', + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + char: '\ud83d\ude40', + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + char: '\ud83d\ude3f', + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + char: '\ud83d\ude3e', + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + char: '\ud83e\udd32', + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + char: '\ud83d\ude4c', + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + char: '\ud83d\udc4f', + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + char: '\ud83d\udc4b', + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + char: '\ud83e\udd19', + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + char: '\ud83d\udc4d', + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + char: '\ud83d\udc4e', + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + char: '\ud83d\udc4a', + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + char: '\u270a', + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + char: '\ud83e\udd1b', + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + char: '\ud83e\udd1c', + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + char: '\u270c', + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + char: '\ud83d\udc4c', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + char: '\u270b', + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + char: '\ud83e\udd1a', + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + char: '\ud83d\udc50', + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + char: '\ud83d\udcaa', + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + char: '\ud83d\ude4f', + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + char: '\ud83e\uddb6', + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + char: '\ud83e\uddb5', + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + char: '\ud83e\udd1d', + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + char: '\u261d', + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + char: '\ud83d\udc46', + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + char: '\ud83d\udc47', + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + char: '\ud83d\udc48', + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + char: '\ud83d\udc49', + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + char: '\ud83d\udd95', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + char: '\ud83d\udd90', + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + char: '\ud83e\udd1f', + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + char: '\ud83e\udd18', + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + char: '\ud83e\udd1e', + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + char: '\ud83d\udd96', + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + char: '\u270d', + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + char: '\ud83e\udd33', + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + char: '\ud83d\udc85', + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + char: '\ud83d\udc44', + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + char: '\ud83e\uddb7', + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + char: '\ud83d\udc45', + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + char: '\ud83d\udc42', + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + char: '\ud83d\udc43', + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + char: '\ud83d\udc41', + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + char: '\ud83d\udc40', + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + char: '\ud83e\udde0', + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + char: '\ud83d\udc64', + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + char: '\ud83d\udc65', + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + char: '\ud83d\udde3', + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + char: '\ud83d\udc76', + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + char: '\ud83e\uddd2', + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + char: '\ud83d\udc66', + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + char: '\ud83d\udc67', + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + char: '\ud83e\uddd1', + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + char: '\ud83d\udc68', + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + char: '\ud83d\udc69', + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + char: '\ud83d\udc71\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + char: '\ud83d\udc71', + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + char: '\ud83e\uddd4', + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + char: '\ud83e\uddd3', + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + char: '\ud83d\udc74', + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + char: '\ud83d\udc75', + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + char: '\ud83d\udc72', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + char: '\ud83e\uddd5', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + char: '\ud83d\udc73\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + char: '\ud83d\udc73', + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + char: '\ud83d\udc6e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + char: '\ud83d\udc6e', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + char: '\ud83d\udc77\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + char: '\ud83d\udc77', + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + char: '\ud83d\udc82\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + char: '\ud83d\udc82', + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + char: '\ud83d\udd75\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + char: '\ud83d\udd75', + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + char: '\ud83d\udc69\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + char: '\ud83d\udc68\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + char: '\ud83d\udc69\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + char: '\ud83d\udc68\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + char: '\ud83d\udc69\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + char: '\ud83d\udc68\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + char: '\ud83d\udc69\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + char: '\ud83d\udc68\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + char: '\ud83d\udc69\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + char: '\ud83d\udc68\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + char: '\ud83e\uddb8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + char: '\ud83e\uddb8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + char: '\ud83e\uddb9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + char: '\ud83e\uddb9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + char: '\ud83e\udd36', + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + char: '\ud83c\udf85', + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + char: '\ud83e\uddd9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + char: '\ud83e\uddd9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + char: '\ud83e\udddd\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + char: '\ud83e\udddd\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + char: '\ud83e\udddb\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + char: '\ud83e\udddb\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + char: '\ud83e\udddf\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + char: '\ud83e\udddf\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + char: '\ud83e\uddde\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + char: '\ud83e\uddde\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + char: '\ud83e\udddc\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + char: '\ud83e\udddc\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + char: '\ud83e\uddda\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + char: '\ud83e\uddda\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + char: '\ud83d\udc7c', + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + char: '\ud83e\udd30', + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + char: '\ud83e\udd31', + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + char: '\ud83d\udc78', + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + char: '\ud83e\udd34', + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + char: '\ud83d\udc70', + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + char: '\ud83e\udd35', + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + char: '\ud83c\udfc3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + char: '\ud83c\udfc3', + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + char: '\ud83d\udeb6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + char: '\ud83d\udeb6', + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + char: '\ud83d\udc83', + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + char: '\ud83d\udd7a', + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + char: '\ud83d\udc6f', + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + char: '\ud83d\udc6f\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + char: '\ud83d\udc6b', + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + char: '\ud83d\udc6c', + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + char: '\ud83d\udc6d', + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + char: '\ud83d\ude47\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + char: '\ud83d\ude47', + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + char: '\ud83e\udd26\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + char: '\ud83e\udd26\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + char: '\ud83e\udd37', + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + char: '\ud83e\udd37\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + char: '\ud83d\udc81', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + char: '\ud83d\udc81\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + char: '\ud83d\ude45', + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + char: '\ud83d\ude45\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + char: '\ud83d\ude46', + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + char: '\ud83d\ude46\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + char: '\ud83d\ude4b', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + char: '\ud83d\ude4b\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + char: '\ud83d\ude4e', + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + char: '\ud83d\ude4e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + char: '\ud83d\ude4d', + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + char: '\ud83d\ude4d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + char: '\ud83d\udc87', + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + char: '\ud83d\udc87\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + char: '\ud83d\udc86', + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + char: '\ud83d\udc86\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + char: '\ud83e\uddd6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + char: '\ud83e\uddd6\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: '\ud83d\udc91', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: '\ud83d\udc8f', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + char: '\ud83d\udc6a', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + char: '\ud83e\uddf6', + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + char: '\ud83e\uddf5', + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + char: '\ud83e\udde5', + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + char: '\ud83e\udd7c', + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + char: '\ud83d\udc5a', + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + char: '\ud83d\udc55', + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + char: '\ud83d\udc56', + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + char: '\ud83d\udc54', + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + char: '\ud83d\udc57', + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + char: '\ud83d\udc59', + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + char: '\ud83d\udc58', + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + char: '\ud83d\udc84', + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + char: '\ud83d\udc8b', + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + char: '\ud83d\udc63', + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + char: '\ud83e\udd7f', + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + char: '\ud83d\udc60', + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + char: '\ud83d\udc61', + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + char: '\ud83d\udc62', + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + char: '\ud83d\udc5e', + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + char: '\ud83d\udc5f', + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + char: '\ud83e\udd7e', + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + char: '\ud83e\udde6', + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + char: '\ud83e\udde4', + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + char: '\ud83e\udde3', + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + char: '\ud83d\udc52', + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + char: '\ud83c\udfa9', + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + char: '\ud83e\udde2', + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + char: '\u26d1', + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + char: '\ud83c\udf93', + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + char: '\ud83d\udc51', + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + char: '\ud83c\udf92', + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + char: '\ud83e\uddf3', + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + char: '\ud83d\udc5d', + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + char: '\ud83d\udc5b', + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + char: '\ud83d\udc5c', + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + char: '\ud83d\udcbc', + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + char: '\ud83d\udc53', + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + char: '\ud83d\udd76', + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + char: '\ud83e\udd7d', + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + char: '\ud83d\udc8d', + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + char: '\ud83c\udf02', + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + char: '\ud83d\udc36', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + char: '\ud83d\udc31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + char: '\ud83d\udc2d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + char: '\ud83d\udc30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + char: '\ud83e\udd8a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + char: '\ud83d\udc3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + char: '\ud83d\udc3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + char: '\ud83d\udc2f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + char: '\ud83e\udd81', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: '\ud83d\udc2e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + char: '\ud83d\udc37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + char: '\ud83d\udc3d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + char: '\ud83d\udc38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + char: '\ud83e\udd91', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + char: '\ud83d\udc19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + char: '\ud83e\udd90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + char: '\ud83d\udc35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + char: '\ud83e\udd8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + char: '\ud83d\ude48', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + char: '\ud83d\ude49', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + char: '\ud83d\ude4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + char: '\ud83d\udc12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + char: '\ud83d\udc14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + char: '\ud83d\udc26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + char: '\ud83d\udc24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + char: '\ud83d\udc23', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + char: '\ud83d\udc25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + char: '\ud83e\udd86', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + char: '\ud83e\udd85', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + char: '\ud83e\udd89', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + char: '\ud83e\udd87', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + char: '\ud83d\udc3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + char: '\ud83d\udc34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + char: '\ud83e\udd84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + char: '\ud83d\udc1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + char: '\ud83d\udc1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + char: '\ud83e\udd8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + char: '\ud83d\udc0c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + char: '\ud83d\udc1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + char: '\ud83d\udc1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + char: '\ud83e\udd97', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + char: '\ud83d\udd77', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + char: '\ud83e\udd82', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + char: '\ud83e\udd80', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + char: '\ud83d\udc0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + char: '\ud83e\udd8e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + char: '\ud83e\udd96', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + char: '\ud83e\udd95', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + char: '\ud83d\udc22', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + char: '\ud83d\udc20', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + char: '\ud83d\udc1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + char: '\ud83d\udc21', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + char: '\ud83d\udc2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + char: '\ud83e\udd88', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: '\ud83d\udc33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: '\ud83d\udc0b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + char: '\ud83d\udc0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc06', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + char: '\ud83e\udd93', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + char: '\ud83d\udc05', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + char: '\ud83d\udc03', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + char: '\ud83d\udc02', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: '\ud83d\udc04', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + char: '\ud83e\udd8c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + char: '\ud83d\udc2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + char: '\ud83d\udc2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + char: '\ud83e\udd92', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + char: '\ud83d\udc18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + char: '\ud83e\udd8f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc10', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + char: '\ud83d\udc0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + char: '\ud83d\udc11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + char: '\ud83d\udc0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + char: '\ud83d\udc00', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + char: '\ud83d\udc01', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + char: '\ud83d\udc13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + char: '\ud83e\udd83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + char: '\ud83d\udd4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + char: '\ud83d\udc15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + char: '\ud83d\udc29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + char: '\ud83d\udc08', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + char: '\ud83d\udc07', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + char: '\ud83d\udc3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + char: '\ud83e\udd94', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + char: '\ud83e\udd9d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + char: '\ud83e\udd99', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + char: '\ud83e\udd9b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + char: '\ud83e\udd98', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + char: '\ud83e\udda1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + char: '\ud83e\udda2', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + char: '\ud83e\udd9a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + char: '\ud83e\udd9c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + char: '\ud83e\udd9e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + char: '\ud83e\udd9f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + char: '\ud83d\udc3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: '\ud83d\udc09', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: '\ud83d\udc32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + char: '\ud83c\udf35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + char: '\ud83c\udf84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + char: '\ud83c\udf32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + char: '\ud83c\udf33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + char: '\ud83c\udf34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + char: '\ud83c\udf31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + char: '\ud83c\udf3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + char: '\u2618', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + char: '\ud83c\udf40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + char: '\ud83c\udf8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + char: '\ud83c\udf8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + char: '\ud83c\udf43', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + char: '\ud83c\udf42', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + char: '\ud83c\udf41', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + char: '\ud83c\udf3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + char: '\ud83c\udf3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + char: '\ud83c\udf3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + char: '\ud83c\udf39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + char: '\ud83e\udd40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + char: '\ud83c\udf37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + char: '\ud83c\udf3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + char: '\ud83c\udf38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + char: '\ud83d\udc90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + char: '\ud83c\udf44', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + char: '\ud83c\udf30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + char: '\ud83c\udf83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + char: '\ud83d\udc1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + char: '\ud83d\udd78', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + char: '\ud83c\udf0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + char: '\ud83c\udf0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + char: '\ud83c\udf0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + char: '\ud83c\udf16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + char: '\ud83c\udf14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + char: '\ud83c\udf1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + char: '\ud83c\udf19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + char: '\u2b50', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + char: '\ud83c\udf1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + char: '\ud83d\udcab', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + char: '\u2728', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + char: '\u2604', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + char: '\u2600\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + char: '\ud83c\udf24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + char: '\u26c5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + char: '\ud83c\udf25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + char: '\ud83c\udf26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + char: '\u2601\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + char: '\ud83c\udf27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + char: '\u26c8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + char: '\ud83c\udf29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + char: '\u26a1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + char: '\ud83d\udd25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + char: '\ud83d\udca5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + char: '\u2744\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + char: '\ud83c\udf28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + char: '\u26c4', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + char: '\u2603', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + char: '\ud83c\udf2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + char: '\ud83d\udca8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + char: '\ud83c\udf2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + char: '\ud83c\udf2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + char: '\u2602', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + char: '\u2614', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + char: '\ud83d\udca7', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + char: '\ud83d\udca6', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + char: '\ud83c\udf0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + char: '\ud83c\udf4f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + char: '\ud83c\udf4e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + char: '\ud83c\udf4a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + char: '\ud83c\udf4b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + char: '\ud83c\udf4c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + char: '\ud83c\udf49', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + char: '\ud83c\udf47', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + char: '\ud83c\udf53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf48', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + char: '\ud83c\udf52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf4d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + char: '\ud83e\udd65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + char: '\ud83e\udd5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + char: '\ud83e\udd6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + char: '\ud83e\udd51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + char: '\ud83e\udd66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + char: '\ud83c\udf45', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + char: '\ud83c\udf46', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + char: '\ud83e\udd52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + char: '\ud83e\udd55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + char: '\ud83c\udf36', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + char: '\ud83e\udd54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + char: '\ud83c\udf3d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + char: '\ud83e\udd6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + char: '\ud83c\udf60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + char: '\ud83e\udd5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + char: '\ud83c\udf6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + char: '\ud83e\udd50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + char: '\ud83c\udf5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + char: '\ud83e\udd56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + char: '\ud83e\udd6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + char: '\ud83e\udd68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + char: '\ud83e\uddc0', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + char: '\ud83e\udd5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + char: '\ud83e\udd53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + char: '\ud83e\udd69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + char: '\ud83e\udd5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + char: '\ud83c\udf57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + char: '\ud83c\udf56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + char: '\ud83e\uddb4', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + char: '\ud83c\udf64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + char: '\ud83c\udf73', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + char: '\ud83c\udf54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + char: '\ud83c\udf5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + char: '\ud83e\udd59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + char: '\ud83c\udf2d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + char: '\ud83c\udf55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + char: '\ud83e\udd6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + char: '\ud83e\udd6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + char: '\ud83c\udf5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + char: '\ud83c\udf2e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + char: '\ud83c\udf2f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + char: '\ud83e\udd57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + char: '\ud83e\udd58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + char: '\ud83c\udf5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + char: '\ud83c\udf72', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + char: '\ud83c\udf65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + char: '\ud83e\udd60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + char: '\ud83c\udf63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + char: '\ud83c\udf71', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + char: '\ud83c\udf5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + char: '\ud83c\udf59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + char: '\ud83c\udf5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + char: '\ud83c\udf58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + char: '\ud83c\udf62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + char: '\ud83c\udf61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + char: '\ud83c\udf67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + char: '\ud83c\udf68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + char: '\ud83c\udf66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + char: '\ud83e\udd67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + char: '\ud83c\udf70', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + char: '\ud83e\uddc1', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + char: '\ud83e\udd6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + char: '\ud83c\udf82', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + char: '\ud83c\udf6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + char: '\ud83c\udf6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + char: '\ud83c\udf6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + char: '\ud83c\udf6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + char: '\ud83c\udf7f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + char: '\ud83e\udd5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + char: '\ud83c\udf69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + char: '\ud83c\udf6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + char: '\ud83e\udd5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: '\ud83c\udf7a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: '\ud83c\udf7b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + char: '\ud83e\udd42', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + char: '\ud83c\udf77', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + char: '\ud83e\udd43', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + char: '\ud83c\udf78', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + char: '\ud83c\udf79', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + char: '\ud83c\udf7e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + char: '\ud83c\udf76', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + char: '\ud83c\udf75', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + char: '\ud83e\udd64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + char: '\u2615', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + char: '\ud83c\udf7c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + char: '\ud83e\uddc2', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + char: '\ud83e\udd44', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + char: '\ud83c\udf74', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + char: '\ud83c\udf7d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + char: '\ud83e\udd63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + char: '\ud83e\udd61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + char: '\ud83e\udd62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + char: '\u26bd', + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + char: '\ud83c\udfc0', + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + char: '\ud83c\udfc8', + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + char: '\u26be', + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + char: '\ud83e\udd4e', + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + char: '\ud83c\udfbe', + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + char: '\ud83c\udfd0', + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + char: '\ud83c\udfc9', + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + char: '\ud83e\udd4f', + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + char: '\ud83c\udfb1', + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + char: '\u26f3', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + char: '\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + char: '\ud83c\udfcc', + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + char: '\ud83c\udfd3', + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + char: '\ud83c\udff8', + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + char: '\ud83e\udd45', + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + char: '\ud83c\udfd2', + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + char: '\ud83c\udfd1', + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + char: '\ud83e\udd4d', + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + char: '\ud83c\udfcf', + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + char: '\ud83c\udfbf', + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + char: '\u26f7', + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + char: '\ud83c\udfc2', + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + char: '\ud83e\udd3a', + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: '\ud83e\udd3c\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: '\ud83e\udd3c\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + char: '\ud83e\udd38\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + char: '\ud83e\udd38\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + char: '\ud83e\udd3e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + char: '\ud83e\udd3e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + char: '\u26f8', + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + char: '\ud83e\udd4c', + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + char: '\ud83d\udef9', + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + char: '\ud83d\udef7', + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + char: '\ud83c\udff9', + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + char: '\ud83c\udfa3', + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + char: '\ud83e\udd4a', + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + char: '\ud83e\udd4b', + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + char: '\ud83d\udea3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + char: '\ud83d\udea3', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + char: '\ud83e\uddd7\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + char: '\ud83e\uddd7\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + char: '\ud83c\udfca\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + char: '\ud83c\udfca', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: '\ud83e\udd3d\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: '\ud83e\udd3d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: '\ud83e\uddd8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: '\ud83e\uddd8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + char: '\ud83c\udfc4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + char: '\ud83c\udfc4', + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + char: '\ud83d\udec0', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + char: '\u26f9\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + char: '\u26f9', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + char: '\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + char: '\ud83c\udfcb', + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + char: '\ud83d\udeb4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + char: '\ud83d\udeb4', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + char: '\ud83d\udeb5\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + char: '\ud83d\udeb5', + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + char: '\ud83c\udfc7', + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + char: '\ud83d\udd74', + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + char: '\ud83c\udfc6', + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + char: '\ud83c\udfbd', + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + char: '\ud83c\udfc5', + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + char: '\ud83c\udf96', + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + char: '\ud83e\udd47', + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + char: '\ud83e\udd48', + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + char: '\ud83e\udd49', + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + char: '\ud83c\udf97', + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + char: '\ud83c\udff5', + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + char: '\ud83c\udfab', + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + char: '\ud83c\udf9f', + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + char: '\ud83c\udfad', + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + char: '\ud83c\udfa8', + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + char: '\ud83c\udfaa', + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: '\ud83e\udd39\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: '\ud83e\udd39\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + char: '\ud83c\udfa4', + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + char: '\ud83c\udfa7', + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + char: '\ud83c\udfbc', + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + char: '\ud83c\udfb9', + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + char: '\ud83e\udd41', + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + char: '\ud83c\udfb7', + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + char: '\ud83c\udfba', + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + char: '\ud83c\udfb8', + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + char: '\ud83c\udfbb', + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + char: '\ud83c\udfac', + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + char: '\ud83c\udfae', + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + char: '\ud83d\udc7e', + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + char: '\ud83c\udfaf', + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + char: '\ud83c\udfb2', + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + char: "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + char: '\ud83c\udfb0', + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + char: '\ud83e\udde9', + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + char: '\ud83c\udfb3', + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + char: '\ud83d\ude97', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + char: '\ud83d\ude95', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude99', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + char: '\ud83d\ude8c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + char: '\ud83d\ude8e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + char: '\ud83c\udfce', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + char: '\ud83d\ude93', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + char: '\ud83d\ude91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + char: '\ud83d\ude92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + char: '\ud83d\ude90', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + char: '\ud83d\ude9a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + char: '\ud83d\ude9b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + char: '\ud83d\ude9c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + char: '\ud83d\udef4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + char: '\ud83c\udfcd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + char: '\ud83d\udeb2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + char: '\ud83d\udef5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + char: '\ud83d\udea8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + char: '\ud83d\ude94', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + char: '\ud83d\ude8d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + char: '\ud83d\ude98', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + char: '\ud83d\ude96', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: '\ud83d\udea1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: '\ud83d\udea0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + char: '\ud83d\ude9f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude83', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + char: '\ud83d\ude8b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude9d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude84', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + char: '\ud83d\ude85', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude88', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude9e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + char: '\ud83d\ude82', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + char: '\ud83d\ude87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude8a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + char: '\ud83d\ude89', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + char: '\ud83d\udef8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + char: '\ud83d\ude81', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + char: '\ud83d\udee9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + char: '\u2708\ufe0f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + char: '\ud83d\udeeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + char: '\ud83d\udeec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + char: '\u26f5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + char: '\ud83d\udee5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + char: '\ud83d\udea4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + char: '\u26f4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + char: '\ud83d\udef3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + char: '\ud83d\ude80', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + char: '\ud83d\udef0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + char: '\ud83d\udcba', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + char: '\ud83d\udef6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + char: '\u2693', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + char: '\ud83d\udea7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + char: '\u26fd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + char: '\ud83d\ude8f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + char: '\ud83d\udea6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + char: '\ud83d\udea5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + char: '\ud83c\udfc1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + char: '\ud83d\udea2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + char: '\ud83c\udfa1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + char: '\ud83c\udfa2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + char: '\ud83c\udfa0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + char: '\ud83c\udfd7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + char: '\ud83c\udf01', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + char: '\ud83d\uddfc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + char: '\ud83c\udfed', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + char: '\u26f2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + char: '\ud83c\udf91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + char: '\u26f0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + char: '\ud83c\udfd4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + char: '\ud83d\uddfb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + char: '\ud83c\udf0b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + char: '\ud83d\uddfe', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + char: '\ud83c\udfd5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + char: '\u26fa', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + char: '\ud83c\udfde', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + char: '\ud83d\udee3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + char: '\ud83d\udee4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + char: '\ud83c\udf05', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + char: '\ud83c\udf04', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + char: '\ud83c\udfdc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + char: '\ud83c\udfd6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + char: '\ud83c\udfdd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + char: '\ud83c\udf07', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + char: '\ud83c\udf06', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + char: '\ud83c\udfd9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + char: '\ud83c\udf03', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + char: '\ud83c\udf09', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + char: '\ud83c\udf0c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + char: '\ud83c\udf20', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + char: '\ud83c\udf87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + char: '\ud83c\udf86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + char: '\ud83c\udf08', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + char: '\ud83c\udfd8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + char: '\ud83c\udff0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + char: '\ud83c\udfef', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + char: '\ud83c\udfdf', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + char: '\ud83d\uddfd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + char: '\ud83c\udfe0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + char: '\ud83c\udfe1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + char: '\ud83c\udfda', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + char: '\ud83c\udfe2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + char: '\ud83c\udfec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + char: '\ud83c\udfe3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + char: '\ud83c\udfe4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + char: '\ud83c\udfe5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + char: '\ud83c\udfe6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + char: '\ud83c\udfe8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + char: '\ud83c\udfea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + char: '\ud83c\udfeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + char: '\ud83c\udfe9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + char: '\ud83d\udc92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + char: '\ud83c\udfdb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + char: '\u26ea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + char: '\ud83d\udd4c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + char: '\ud83d\udd4d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + char: '\ud83d\udd4b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + char: '\u26e9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + char: '\u231a', + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + char: '\ud83d\udcf1', + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + char: '\ud83d\udcf2', + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + char: '\ud83d\udcbb', + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + char: '\u2328', + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + char: '\ud83d\udda5', + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + char: '\ud83d\udda8', + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + char: '\ud83d\uddb1', + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + char: '\ud83d\uddb2', + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + char: '\ud83d\udd79', + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + char: '\ud83d\udddc', + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + char: '\ud83d\udcbd', + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + char: '\ud83d\udcbe', + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + char: '\ud83d\udcbf', + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + char: '\ud83d\udcc0', + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + char: '\ud83d\udcfc', + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + char: '\ud83d\udcf7', + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + char: '\ud83d\udcf8', + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + char: '\ud83d\udcf9', + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + char: '\ud83c\udfa5', + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + char: '\ud83d\udcfd', + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + char: '\ud83c\udf9e', + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + char: '\ud83d\udcde', + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + char: '\u260e\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + char: '\ud83d\udcdf', + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + char: '\ud83d\udce0', + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + char: '\ud83d\udcfa', + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + char: '\ud83d\udcfb', + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + char: '\ud83c\udf99', + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + char: '\ud83c\udf9a', + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + char: '\ud83c\udf9b', + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + char: '\ud83e\udded', + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + char: '\u23f1', + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + char: '\u23f2', + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + char: '\u23f0', + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + char: '\ud83d\udd70', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + char: '\u23f3', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + char: '\u231b', + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + char: '\ud83d\udce1', + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + char: '\ud83d\udd0b', + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + char: '\ud83d\udd0c', + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + char: '\ud83d\udca1', + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + char: '\ud83d\udd26', + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + char: '\ud83d\udd6f', + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + char: '\ud83e\uddef', + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + char: '\ud83d\uddd1', + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + char: '\ud83d\udee2', + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + char: '\ud83d\udcb8', + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + char: '\ud83d\udcb5', + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + char: '\ud83d\udcb4', + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + char: '\ud83d\udcb6', + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + char: '\ud83d\udcb7', + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + char: '\ud83d\udcb0', + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + char: '\ud83d\udcb3', + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + char: '\ud83d\udc8e', + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + char: '\u2696', + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + char: '\ud83e\uddf0', + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + char: '\ud83d\udd27', + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + char: '\ud83d\udd28', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + char: '\u2692', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + char: '\ud83d\udee0', + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + char: '\u26cf', + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + char: '\ud83d\udd29', + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + char: '\u2699', + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + char: '\ud83e\uddf1', + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + char: '\u26d3', + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + char: '\ud83e\uddf2', + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + char: '\ud83d\udd2b', + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + char: '\ud83d\udca3', + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + char: '\ud83e\udde8', + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + char: '\ud83d\udd2a', + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + char: '\ud83d\udde1', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + char: '\u2694', + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + char: '\ud83d\udee1', + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + char: '\ud83d\udeac', + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + char: '\u2620', + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + char: '\u26b0', + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + char: '\u26b1', + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + char: '\ud83c\udffa', + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + char: '\ud83d\udd2e', + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + char: '\ud83d\udcff', + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + char: '\ud83e\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + char: '\ud83d\udc88', + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + char: '\u2697', + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + char: '\ud83d\udd2d', + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + char: '\ud83d\udd2c', + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + char: '\ud83d\udd73', + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + char: '\ud83d\udc8a', + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + char: '\ud83d\udc89', + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + char: '\ud83e\uddec', + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + char: '\ud83e\udda0', + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + char: '\ud83e\uddeb', + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + char: '\ud83e\uddea', + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + char: '\ud83c\udf21', + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + char: '\ud83e\uddf9', + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + char: '\ud83e\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + char: '\ud83e\uddfb', + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + char: '\ud83c\udff7', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + char: '\ud83d\udd16', + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + char: '\ud83d\udebd', + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + char: '\ud83d\udebf', + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + char: '\ud83d\udec1', + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + char: '\ud83e\uddfc', + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + char: '\ud83e\uddfd', + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + char: '\ud83e\uddf4', + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + char: '\ud83d\udd11', + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + char: '\ud83d\udddd', + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + char: '\ud83d\udecb', + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + char: '\ud83d\udecc', + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + char: '\ud83d\udecf', + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + char: '\ud83d\udeaa', + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + char: '\ud83d\udece', + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + char: '\ud83e\uddf8', + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + char: '\ud83d\uddbc', + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + char: '\ud83d\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + char: '\u26f1', + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + char: '\ud83d\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + char: '\ud83d\udecd', + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + char: '\ud83d\uded2', + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + char: '\ud83c\udf88', + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + char: '\ud83c\udf8f', + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + char: '\ud83c\udf80', + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + char: '\ud83c\udf81', + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + char: '\ud83c\udf8a', + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + char: '\ud83c\udf89', + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + char: '\ud83c\udf8e', + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + char: '\ud83c\udf90', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + char: '\ud83c\udf8c', + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + char: '\ud83c\udfee', + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + char: '\ud83e\udde7', + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + char: '\u2709\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + char: '\ud83d\udce9', + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + char: '\ud83d\udce8', + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + char: '\ud83d\udce7', + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + char: '\ud83d\udc8c', + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + char: '\ud83d\udcee', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + char: '\ud83d\udcea', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + char: '\ud83d\udceb', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + char: '\ud83d\udcec', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + char: '\ud83d\udced', + fitzpatrick_scale: false, + category: "objects" + }, + package: { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + char: '\ud83d\udce6', + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + char: '\ud83d\udcef', + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + char: '\ud83d\udce5', + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + char: '\ud83d\udce4', + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + char: '\ud83d\udcdc', + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + char: '\ud83d\udcc3', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + char: '\ud83d\udcd1', + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + char: '\ud83e\uddfe', + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + char: '\ud83d\udcca', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + char: '\ud83d\udcc8', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + char: '\ud83d\udcc9', + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + char: '\ud83d\udcc4', + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + char: '\ud83d\udcc5', + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + char: '\ud83d\udcc6', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + char: '\ud83d\uddd3', + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + char: '\ud83d\udcc7', + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + char: '\ud83d\uddc3', + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + char: '\ud83d\uddf3', + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + char: '\ud83d\uddc4', + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + char: '\ud83d\udccb', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + char: '\ud83d\uddd2', + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + char: '\ud83d\udcc1', + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + char: '\ud83d\udcc2', + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + char: '\ud83d\uddc2', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + char: '\ud83d\uddde', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + char: '\ud83d\udcf0', + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + char: '\ud83d\udcd3', + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + char: '\ud83d\udcd5', + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + char: '\ud83d\udcd7', + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + char: '\ud83d\udcd8', + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + char: '\ud83d\udcd9', + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + char: '\ud83d\udcd4', + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + char: '\ud83d\udcd2', + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + char: '\ud83d\udcda', + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + char: '\ud83d\udcd6', + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + char: '\ud83e\uddf7', + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + char: '\ud83d\udd17', + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + char: '\ud83d\udcce', + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + char: '\ud83d\udd87', + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + char: '\u2702\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + char: '\ud83d\udcd0', + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + char: '\ud83d\udccf', + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + char: '\ud83e\uddee', + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + char: '\ud83d\udccc', + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + char: '\ud83d\udccd', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + char: '\ud83d\udea9', + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + char: '\ud83c\udff3', + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + char: '\ud83c\udff4', + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + char: '\ud83c\udff3\ufe0f\u200d\ud83c\udf08', + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + char: '\ud83d\udd10', + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + char: '\ud83d\udd12', + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + char: '\ud83d\udd13', + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + char: '\ud83d\udd0f', + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + char: '\ud83d\udd8a', + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + char: '\ud83d\udd8b', + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + char: '\u2712\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + char: '\ud83d\udcdd', + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + char: '\u270f\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + char: '\ud83d\udd8d', + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + char: '\ud83d\udd8c', + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + char: '\ud83d\udd0d', + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + char: '\ud83d\udd0e', + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + char: '\u2764\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83e\udde1', + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9b', + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9a', + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc99', + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9c', + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + char: '\ud83d\udda4', + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + char: '\ud83d\udc94', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + char: '\u2763', + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + char: '\ud83d\udc95', + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9e', + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + char: '\ud83d\udc93', + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + char: '\ud83d\udc97', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc96', + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + char: '\ud83d\udc98', + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + char: '\ud83d\udc9d', + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + char: '\ud83d\udc9f', + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + char: '\u262e', + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + char: '\u271d', + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + char: '\u262a', + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: '\ud83d\udd49', + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: '\u2638', + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + char: '\u2721', + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + char: '\ud83d\udd2f', + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + char: '\ud83d\udd4e', + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + char: '\u262f', + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + char: '\u2626', + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + char: '\ud83d\uded0', + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + char: '\u26ce', + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u2648', + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: '\u2649', + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u264a', + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u264b', + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u264c', + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u264d', + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u264e', + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + char: '\u264f', + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u2650', + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u2651', + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u2652', + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: '\u2653', + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + char: '\ud83c\udd94', + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + char: '\u269b', + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + char: '\ud83c\ude33', + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + char: '\ud83c\ude39', + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + char: '\u2622', + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + char: '\u2623', + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + char: '\ud83d\udcf4', + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + char: '\ud83d\udcf3', + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + char: '\ud83c\ude36', + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + char: '\ud83c\ude1a', + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + char: '\ud83c\ude38', + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + char: '\ud83c\ude3a', + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + char: '\ud83c\ude37\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + char: '\u2734\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + char: '\ud83c\udd9a', + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + char: '\ud83c\ude51', + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + char: '\ud83d\udcae', + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + char: '\ud83c\ude50', + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + char: '\u3299\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + char: '\u3297\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + char: '\ud83c\ude34', + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + char: '\ud83c\ude35', + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + char: '\ud83c\ude32', + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + char: '\ud83c\udd70\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + char: '\ud83c\udd71\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + char: '\ud83c\udd8e', + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + char: '\ud83c\udd91', + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + char: '\ud83c\udd7e\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + char: '\ud83c\udd98', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + char: '\u26d4', + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + char: '\ud83d\udcdb', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + char: '\ud83d\udeab', + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + char: '\u274c', + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + char: '\u2b55', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + char: '\ud83d\uded1', + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + char: '\ud83d\udca2', + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + char: '\u2668\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + char: '\ud83d\udeb7', + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + char: '\ud83d\udeaf', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + char: '\ud83d\udeb3', + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + char: '\ud83d\udeb1', + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + char: '\ud83d\udd1e', + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + char: '\ud83d\udcf5', + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + char: '\u2757', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + char: '\u2755', + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + char: '\u2753', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + char: '\u2754', + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + char: '\u203c\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + char: '\u2049\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + char: '\ud83d\udd05', + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + char: '\ud83d\udd06', + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + char: '\ud83d\udd31', + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + char: '\u269c', + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + char: '\u303d\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + char: '\u26a0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + char: '\ud83d\udeb8', + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + char: '\ud83d\udd30', + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + char: '\u267b\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + char: '\ud83c\ude2f', + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + char: '\ud83d\udcb9', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + char: '\u2747\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + char: '\u2733\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + char: '\u274e', + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + char: '\u2705', + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + char: '\ud83d\udca0', + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + char: '\ud83c\udf00', + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + char: '\u27bf', + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + char: '\ud83c\udf10', + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + char: '\u24c2\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + char: '\ud83c\udfe7', + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + char: '\ud83c\ude02\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + char: '\ud83d\udec2', + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + char: '\ud83d\udec3', + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + char: '\ud83d\udec4', + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + char: '\ud83d\udec5', + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + char: '\u267f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + char: '\ud83d\udead', + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + char: '\ud83d\udebe', + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + char: '\ud83c\udd7f\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + char: '\ud83d\udeb0', + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + char: '\ud83d\udeb9', + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + char: '\ud83d\udeba', + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + char: '\ud83d\udebc', + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + char: '\ud83d\udebb', + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + char: '\ud83d\udeae', + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + char: '\ud83c\udfa6', + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + char: '\ud83d\udcf6', + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + char: '\ud83c\ude01', + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + char: '\ud83c\udd96', + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + char: '\ud83c\udd97', + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + char: '\ud83c\udd99', + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + char: '\ud83c\udd92', + fitzpatrick_scale: false, + category: "symbols" + }, + new: { + keywords: [ "blue-square", "words", "start" ], + char: '\ud83c\udd95', + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + char: '\ud83c\udd93', + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + char: '0\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + char: '1\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + char: '2\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + char: '3\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + char: '4\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + char: '5\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + char: '6\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + char: '7\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + char: '8\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + char: '9\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + char: '\ud83d\udd1f', + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + char: '*\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + char: '\u23cf\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + char: '\u25b6\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + char: '\u23f8', + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + char: '\u23ed', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + char: '\u23f9', + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + char: '\u23fa', + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + char: '\u23ef', + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + char: '\u23ee', + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + char: '\u23e9', + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + char: '\u23ea', + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + char: '\ud83d\udd00', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + char: '\ud83d\udd01', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + char: '\ud83d\udd02', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + char: '\u25c0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + char: '\ud83d\udd3c', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\ud83d\udd3d', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + char: '\u23eb', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\u23ec', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + char: '\u27a1\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + char: '\u2b05\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + char: '\u2b06\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\u2b07\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + char: '\u2197\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + char: '\u2198\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + char: '\u2199\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + char: '\u2196\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + char: '\u2195\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + char: '\u2194\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + char: '\ud83d\udd04', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + char: '\u21aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + char: '\u21a9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + char: '\u2934\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\u2935\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + char: '#\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + char: '\u2139\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + char: '\ud83d\udd24', + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + char: '\ud83d\udd21', + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + char: '\ud83d\udd20', + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + char: '\ud83d\udd23', + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + char: '\ud83c\udfb5', + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + char: '\ud83c\udfb6', + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + char: '\u3030\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + char: '\u27b0', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + char: '\u2714\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + char: '\ud83d\udd03', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + char: '\u2795', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + char: '\u2796', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + char: '\u2797', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + char: '\u2716\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + char: '\u267e', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + char: '\ud83d\udcb2', + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + char: '\ud83d\udcb1', + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + char: '\xa9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + char: '\xae\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + char: '\u2122\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + char: '\ud83d\udd1a', + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + char: '\ud83d\udd19', + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + char: '\ud83d\udd1b', + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + char: '\ud83d\udd1d', + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + char: '\ud83d\udd1c', + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + char: '\u2611\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + char: '\ud83d\udd18', + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + char: '\u26aa', + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + char: '\u26ab', + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + char: '\ud83d\udd34', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + char: '\ud83d\udd35', + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd38', + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd39', + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd36', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd37', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + char: '\ud83d\udd3a', + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + char: '\u25aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + char: '\u25ab\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + char: '\u2b1b', + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + char: '\u2b1c', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + char: '\ud83d\udd3b', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + char: '\u25fc\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + char: '\u25fb\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + char: '\u25fe', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + char: '\u25fd', + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + char: '\ud83d\udd32', + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + char: '\ud83d\udd33', + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + char: '\ud83d\udd08', + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + char: '\ud83d\udd09', + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + char: '\ud83d\udd0a', + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + char: '\ud83d\udd07', + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + char: '\ud83d\udce3', + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + char: '\ud83d\udce2', + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + char: '\ud83d\udd14', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + char: '\ud83d\udd15', + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + char: '\ud83c\udccf', + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + char: '\ud83c\udc04', + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + char: '\u2660\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: '\u2663\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: '\u2665\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: '\u2666\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + char: '\ud83c\udfb4', + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + char: '\ud83d\udcad', + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + char: '\ud83d\uddef', + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + char: '\ud83d\udcac', + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + char: '\ud83d\udde8', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd50', + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd51', + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd52', + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd53', + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd54', + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + char: '\ud83d\udd55', + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd56', + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd57', + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd58', + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd59', + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5a', + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + char: '\ud83d\udd5b', + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5c', + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5d', + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5e', + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5f', + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd60', + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd61', + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd62', + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd63', + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd64', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd65', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd66', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd67', + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + char: '\ud83c\udde8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + char: '\ud83c\uddea\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + char: '\ud83c\uddeb\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfd\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfe\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf4\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf6\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfc\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddff\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + char: '\ud83c\uddec\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfc\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfe\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddff\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddff\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + char: '\ud83c\uddfa\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + char: '\ud83c\udff4\u200d\u2620\ufe0f', + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojiimages.min.js b/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojiimages.min.js new file mode 100644 index 000000000..a0451629e --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojiimages.min.js @@ -0,0 +1,3 @@ +// Source: npm package: emojilib +// Images provided by twemoji: https://github.com/twitter/twemoji +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'\ud83d\udcaf',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'\ud83d\udd22',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'\ud83d\ude00',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'\ud83d\ude2c',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'\ud83d\ude01',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'\ud83d\ude02',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'\ud83e\udd23',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'\ud83e\udd73',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'\ud83d\ude03',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'\ud83d\ude04',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'\ud83d\ude05',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'\ud83d\ude06',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'\ud83d\ude07',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'\ud83d\ude09',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'\ud83d\ude0a',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'\ud83d\ude42',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'\ud83d\ude43',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'\u263a\ufe0f',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'\ud83d\ude0b',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'\ud83d\ude0c',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'\ud83d\ude0d',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'\ud83e\udd70',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\ud83d\ude18',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'\ud83d\ude17',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'\ud83d\ude19',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\ud83d\ude1a',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'\ud83d\ude1c',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'\ud83e\udd2a',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'\ud83e\udd28',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'\ud83e\uddd0',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'\ud83d\ude1d',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'\ud83d\ude1b',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'\ud83e\udd11',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'\ud83e\udd13',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'\ud83d\ude0e',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'\ud83e\udd29',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:'\ud83e\udd21',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'\ud83e\udd20',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:'\ud83e\udd17',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'\ud83d\ude0f',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'\ud83d\ude36',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'\ud83d\ude10',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'\ud83d\ude11',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'\ud83d\ude12',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'\ud83d\ude44',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'\ud83e\udd14',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'\ud83e\udd25',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'\ud83e\udd2d',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'\ud83e\udd2b',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'\ud83e\udd2c',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'\ud83e\udd2f',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'\ud83d\ude33',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'\ud83d\ude1e',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'\ud83d\ude1f',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'\ud83d\ude20',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'\ud83d\ude21',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'\ud83d\ude14',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'\ud83d\ude15',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'\ud83d\ude41',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'\u2639',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'\ud83d\ude23',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'\ud83d\ude16',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'\ud83d\ude2b',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'\ud83d\ude29',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'\ud83e\udd7a',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'\ud83d\ude24',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'\ud83d\ude2e',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'\ud83d\ude31',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'\ud83d\ude28',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'\ud83d\ude30',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:'\ud83d\ude2f',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:'\ud83d\ude26',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'\ud83d\ude27',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'\ud83d\ude22',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'\ud83d\ude25',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:'\ud83e\udd24',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'\ud83d\ude2a',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'\ud83d\ude13',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'\ud83e\udd75',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'\ud83e\udd76',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'\ud83d\ude2d',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'\ud83d\ude35',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'\ud83d\ude32',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'\ud83e\udd10',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'\ud83e\udd22',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'\ud83e\udd27',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:'\ud83e\udd2e',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'\ud83d\ude37',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'\ud83e\udd12',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'\ud83e\udd15',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'\ud83e\udd74',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'\ud83d\ude34',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'\ud83d\udca4',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'\ud83d\udca9',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'\ud83d\ude08',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:'\ud83d\udc7f',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'\ud83d\udc79',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'\ud83d\udc7a',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'\ud83d\udc80',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'\ud83d\udc7b',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'\ud83d\udc7d',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:'\ud83e\udd16',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'\ud83d\ude3a',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'\ud83d\ude38',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'\ud83d\ude39',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'\ud83d\ude3b',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'\ud83d\ude3c',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'\ud83d\ude3d',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'\ud83d\ude40',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'\ud83d\ude3f',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'\ud83d\ude3e',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'\ud83e\udd32',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'\ud83d\ude4c',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'\ud83d\udc4f',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'\ud83d\udc4b',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'\ud83e\udd19',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'\ud83d\udc4d',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'\ud83d\udc4e',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'\ud83d\udc4a',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'\u270a',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'\ud83e\udd1b',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'\ud83e\udd1c',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'\u270c',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'\ud83d\udc4c',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'\u270b',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'\ud83e\udd1a',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'\ud83d\udc50',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'\ud83d\udcaa',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'\ud83d\ude4f',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:'\ud83e\uddb6',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:'\ud83e\uddb5',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:'\ud83e\udd1d',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'\u261d',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'\ud83d\udc46',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'\ud83d\udc47',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'\ud83d\udc48',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'\ud83d\udc49',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'\ud83d\udd95',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'\ud83d\udd90',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'\ud83e\udd1f',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'\ud83e\udd18',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'\ud83e\udd1e',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'\ud83d\udd96',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'\u270d',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:'\ud83e\udd33',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'\ud83d\udc85',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:'\ud83d\udc44',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:'\ud83e\uddb7',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:'\ud83d\udc45',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'\ud83d\udc42',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:'\ud83d\udc43',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'\ud83d\udc41',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'\ud83d\udc40',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:'\ud83e\udde0',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'\ud83d\udc64',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'\ud83d\udc65',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'\ud83d\udde3',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'\ud83d\udc76',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:'\ud83e\uddd2',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'\ud83d\udc66',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:'\ud83d\udc67',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:'\ud83e\uddd1',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'\ud83d\udc68',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:'\ud83d\udc69',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'\ud83d\udc71\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'\ud83d\udc71',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'\ud83e\uddd4',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'\ud83e\uddd3',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'\ud83d\udc74',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'\ud83d\udc75',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'\ud83d\udc72',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'\ud83e\uddd5',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'\ud83d\udc73\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'\ud83d\udc73',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'\ud83d\udc6e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'\ud83d\udc6e',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'\ud83d\udc77\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'\ud83d\udc77',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'\ud83d\udc82\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'\ud83d\udc82',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'\ud83d\udd75\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'\ud83d\udd75',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'\ud83d\udc69\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'\ud83d\udc68\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'\ud83d\udc69\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'\ud83d\udc68\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'\ud83d\udc69\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'\ud83d\udc68\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'\ud83d\udc69\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'\ud83d\udc68\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'\ud83d\udc69\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'\ud83d\udc68\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'\ud83d\udc69\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'\ud83d\udc68\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'\ud83d\udc69\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'\ud83d\udc68\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'\ud83d\udc69\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'\ud83d\udc68\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'\ud83d\udc69\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'\ud83d\udc68\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'\ud83e\uddb8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'\ud83e\uddb8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'\ud83e\uddb9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'\ud83e\uddb9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'\ud83e\udd36',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'\ud83c\udf85',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'\ud83e\uddd9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'\ud83e\uddd9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:'\ud83e\udddd\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:'\ud83e\udddd\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:'\ud83e\udddb\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'\ud83e\udddb\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'\ud83e\udddf\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'\ud83e\udddf\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:'\ud83e\uddde\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:'\ud83e\uddde\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'\ud83e\udddc\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:'\ud83e\udddc\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:'\ud83e\uddda\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:'\ud83e\uddda\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'\ud83d\udc7c',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:'\ud83e\udd30',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'\ud83e\udd31',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'\ud83d\udc78',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'\ud83e\udd34',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'\ud83d\udc70',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'\ud83e\udd35',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'\ud83c\udfc3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'\ud83c\udfc3',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'\ud83d\udeb6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'\ud83d\udeb6',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'\ud83d\udc83',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'\ud83d\udd7a',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'\ud83d\udc6f',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'\ud83d\udc6f\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'\ud83d\udc6b',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'\ud83d\udc6c',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'\ud83d\udc6d',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'\ud83d\ude47\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'\ud83d\ude47',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'\ud83e\udd26\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'\ud83e\udd26\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'\ud83e\udd37',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'\ud83e\udd37\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'\ud83d\udc81',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'\ud83d\udc81\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'\ud83d\ude45',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'\ud83d\ude45\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'\ud83d\ude46',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'\ud83d\ude46\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'\ud83d\ude4b',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'\ud83d\ude4b\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'\ud83d\ude4e',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'\ud83d\ude4e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'\ud83d\ude4d',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'\ud83d\ude4d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'\ud83d\udc87',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'\ud83d\udc87\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'\ud83d\udc86',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'\ud83d\udc86\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'\ud83e\uddd6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'\ud83e\uddd6\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc91',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc8f',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'\ud83d\udc6a',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'\ud83e\uddf6',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'\ud83e\uddf5',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:'\ud83e\udde5',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'\ud83e\udd7c',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'\ud83d\udc5a',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'\ud83d\udc55',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:'\ud83d\udc56',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'\ud83d\udc54',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'\ud83d\udc57',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'\ud83d\udc59',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'\ud83d\udc58',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'\ud83d\udc84',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'\ud83d\udc8b',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'\ud83d\udc63',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'\ud83e\udd7f',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'\ud83d\udc60',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'\ud83d\udc61',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:'\ud83d\udc62',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'\ud83d\udc5e',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'\ud83d\udc5f',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'\ud83e\udd7e',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:'\ud83e\udde6',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'\ud83e\udde4',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'\ud83e\udde3',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'\ud83d\udc52',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'\ud83c\udfa9',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'\ud83e\udde2',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'\u26d1',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'\ud83c\udf93',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'\ud83d\udc51',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'\ud83c\udf92',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:'\ud83e\uddf3',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'\ud83d\udc5d',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'\ud83d\udc5b',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'\ud83d\udc5c',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'\ud83d\udcbc',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'\ud83d\udc53',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'\ud83d\udd76',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'\ud83e\udd7d',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'\ud83d\udc8d',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'\ud83c\udf02',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'\ud83d\udc36',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'\ud83d\udc31',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'\ud83d\udc2d',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'\ud83d\udc39',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'\ud83d\udc30',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'\ud83e\udd8a',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'\ud83d\udc3b',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'\ud83d\udc3c',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'\ud83d\udc28',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'\ud83d\udc2f',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'\ud83e\udd81',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\ud83d\udc2e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'\ud83d\udc37',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'\ud83d\udc3d',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'\ud83d\udc38',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'\ud83e\udd91',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'\ud83d\udc19',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'\ud83e\udd90',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'\ud83d\udc35',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'\ud83e\udd8d',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'\ud83d\ude48',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'\ud83d\ude49',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'\ud83d\ude4a',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'\ud83d\udc12',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'\ud83d\udc14',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'\ud83d\udc27',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'\ud83d\udc26',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'\ud83d\udc24',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'\ud83d\udc23',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'\ud83d\udc25',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'\ud83e\udd86',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'\ud83e\udd85',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'\ud83e\udd89',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'\ud83e\udd87',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'\ud83d\udc3a',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'\ud83d\udc17',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'\ud83d\udc34',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'\ud83e\udd84',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'\ud83d\udc1d',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'\ud83d\udc1b',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'\ud83e\udd8b',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'\ud83d\udc0c',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'\ud83d\udc1e',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'\ud83d\udc1c',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'\ud83e\udd97',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'\ud83d\udd77',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'\ud83e\udd82',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'\ud83e\udd80',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'\ud83d\udc0d',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'\ud83e\udd8e',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'\ud83e\udd96',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'\ud83e\udd95',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'\ud83d\udc22',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'\ud83d\udc20',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'\ud83d\udc1f',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'\ud83d\udc21',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'\ud83d\udc2c',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'\ud83e\udd88',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'\ud83d\udc33',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'\ud83d\udc0b',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'\ud83d\udc0a',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'\ud83d\udc06',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'\ud83e\udd93',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'\ud83d\udc05',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'\ud83d\udc03',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'\ud83d\udc02',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\ud83d\udc04',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'\ud83e\udd8c',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'\ud83d\udc2a',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'\ud83d\udc2b',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'\ud83e\udd92',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'\ud83d\udc18',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'\ud83e\udd8f',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'\ud83d\udc10',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'\ud83d\udc0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'\ud83d\udc11',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'\ud83d\udc0e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'\ud83d\udc16',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'\ud83d\udc00',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'\ud83d\udc01',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'\ud83d\udc13',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'\ud83e\udd83',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'\ud83d\udd4a',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'\ud83d\udc15',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'\ud83d\udc29',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'\ud83d\udc08',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'\ud83d\udc07',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'\ud83d\udc3f',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'\ud83e\udd94',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'\ud83e\udd9d',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'\ud83e\udd99',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'\ud83e\udd9b',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'\ud83e\udd98',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'\ud83e\udda1',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'\ud83e\udda2',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'\ud83e\udd9a',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'\ud83e\udd9c',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'\ud83e\udd9e',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'\ud83e\udd9f',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'\ud83d\udc3e',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'\ud83d\udc09',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'\ud83d\udc32',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'\ud83c\udf35',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'\ud83c\udf84',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'\ud83c\udf32',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'\ud83c\udf33',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'\ud83c\udf34',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'\ud83c\udf31',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'\ud83c\udf3f',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'\u2618',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'\ud83c\udf40',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'\ud83c\udf8d',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'\ud83c\udf8b',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'\ud83c\udf43',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'\ud83c\udf42',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'\ud83c\udf41',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'\ud83c\udf3e',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'\ud83c\udf3a',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'\ud83c\udf3b',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'\ud83c\udf39',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'\ud83e\udd40',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'\ud83c\udf37',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'\ud83c\udf3c',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'\ud83c\udf38',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'\ud83d\udc90',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'\ud83c\udf44',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'\ud83c\udf30',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'\ud83c\udf83',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'\ud83d\udc1a',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'\ud83d\udd78',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'\ud83c\udf0e',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'\ud83c\udf0d',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'\ud83c\udf0f',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf15',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'\ud83c\udf16',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf17',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf18',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf11',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf12',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf13',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'\ud83c\udf14',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1a',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1d',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1b',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1c',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'\ud83c\udf1e',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'\ud83c\udf19',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'\u2b50',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'\ud83c\udf1f',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'\ud83d\udcab',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'\u2728',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:'\u2604',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'\u2600\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'\ud83c\udf24',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'\u26c5',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'\ud83c\udf25',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'\ud83c\udf26',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'\u2601\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'\ud83c\udf27',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'\u26c8',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'\ud83c\udf29',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'\u26a1',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'\ud83d\udd25',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'\ud83d\udca5',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'\u2744\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'\ud83c\udf28',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'\u26c4',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'\u2603',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'\ud83c\udf2c',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'\ud83d\udca8',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'\ud83c\udf2a',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:'\ud83c\udf2b',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'\u2602',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'\u2614',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'\ud83d\udca7',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'\ud83d\udca6',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'\ud83c\udf0a',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'\ud83c\udf4f',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'\ud83c\udf4e',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'\ud83c\udf50',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'\ud83c\udf4a',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'\ud83c\udf4b',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'\ud83c\udf4c',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'\ud83c\udf49',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'\ud83c\udf47',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'\ud83c\udf53',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'\ud83c\udf48',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'\ud83c\udf52',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'\ud83c\udf51',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'\ud83c\udf4d',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'\ud83e\udd65',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'\ud83e\udd5d',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'\ud83e\udd6d',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'\ud83e\udd51',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'\ud83e\udd66',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'\ud83c\udf45',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'\ud83c\udf46',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'\ud83e\udd52',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'\ud83e\udd55',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'\ud83c\udf36',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'\ud83e\udd54',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'\ud83c\udf3d',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'\ud83e\udd6c',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'\ud83c\udf60',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'\ud83e\udd5c',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'\ud83c\udf6f',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'\ud83e\udd50',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'\ud83c\udf5e',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'\ud83e\udd56',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'\ud83e\udd6f',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'\ud83e\udd68',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'\ud83e\uddc0',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'\ud83e\udd5a',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'\ud83e\udd53',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'\ud83e\udd69',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'\ud83e\udd5e',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'\ud83c\udf57',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'\ud83c\udf56',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'\ud83e\uddb4',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'\ud83c\udf64',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'\ud83c\udf73',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'\ud83c\udf54',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'\ud83c\udf5f',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'\ud83e\udd59',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'\ud83c\udf2d',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'\ud83c\udf55',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'\ud83e\udd6a',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'\ud83e\udd6b',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'\ud83c\udf5d',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'\ud83c\udf2e',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'\ud83c\udf2f',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'\ud83e\udd57',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'\ud83e\udd58',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'\ud83c\udf5c',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'\ud83c\udf72',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'\ud83c\udf65',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'\ud83e\udd60',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'\ud83c\udf63',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'\ud83c\udf71',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'\ud83c\udf5b',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'\ud83c\udf59',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'\ud83c\udf5a',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'\ud83c\udf58',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'\ud83c\udf62',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'\ud83c\udf61',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'\ud83c\udf67',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'\ud83c\udf68',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'\ud83c\udf66',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'\ud83e\udd67',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'\ud83c\udf70',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'\ud83e\uddc1',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'\ud83e\udd6e',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'\ud83c\udf82',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'\ud83c\udf6e',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'\ud83c\udf6c',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'\ud83c\udf6d',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'\ud83c\udf6b',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'\ud83c\udf7f',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'\ud83e\udd5f',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'\ud83c\udf69',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'\ud83c\udf6a',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'\ud83e\udd5b',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\ud83c\udf7a',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\ud83c\udf7b',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'\ud83e\udd42',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'\ud83c\udf77',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'\ud83e\udd43',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'\ud83c\udf78',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'\ud83c\udf79',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'\ud83c\udf7e',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'\ud83c\udf76',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'\ud83c\udf75',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'\ud83e\udd64',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'\u2615',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'\ud83c\udf7c',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'\ud83e\uddc2',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'\ud83e\udd44',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'\ud83c\udf74',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'\ud83c\udf7d',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'\ud83e\udd63',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'\ud83e\udd61',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'\ud83e\udd62',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'\u26bd',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'\ud83c\udfc0',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'\ud83c\udfc8',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:'\u26be',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:'\ud83e\udd4e',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'\ud83c\udfbe',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:'\ud83c\udfd0',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:'\ud83c\udfc9',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'\ud83e\udd4f',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'\ud83c\udfb1',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'\u26f3',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:'\ud83c\udfcc',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'\ud83c\udfd3',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:'\ud83c\udff8',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:'\ud83e\udd45',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:'\ud83c\udfd2',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:'\ud83c\udfd1',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'\ud83e\udd4d',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:'\ud83c\udfcf',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'\ud83c\udfbf',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'\u26f7',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'\ud83c\udfc2',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'\ud83e\udd3a',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'\ud83e\udd3c\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'\ud83e\udd3c\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'\ud83e\udd38\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'\ud83e\udd38\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'\ud83e\udd3e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:'\ud83e\udd3e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:'\u26f8',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:'\ud83e\udd4c',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:'\ud83d\udef9',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'\ud83d\udef7',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'\ud83c\udff9',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'\ud83c\udfa3',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'\ud83e\udd4a',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'\ud83e\udd4b',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'\ud83d\udea3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'\ud83d\udea3',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'\ud83e\uddd7\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'\ud83e\uddd7\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'\ud83c\udfca\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'\ud83c\udfca',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'\ud83e\udd3d\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'\ud83e\udd3d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'\ud83e\uddd8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'\ud83e\uddd8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'\ud83c\udfc4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'\ud83c\udfc4',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'\ud83d\udec0',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'\u26f9\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:'\u26f9',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'\ud83c\udfcb',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'\ud83d\udeb4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'\ud83d\udeb4',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'\ud83d\udeb5\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'\ud83d\udeb5',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'\ud83c\udfc7',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'\ud83d\udd74',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'\ud83c\udfc6',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'\ud83c\udfbd',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:'\ud83c\udfc5',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'\ud83c\udf96',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'\ud83e\udd47',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'\ud83e\udd48',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'\ud83e\udd49',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'\ud83c\udf97',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'\ud83c\udff5',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'\ud83c\udfab',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'\ud83c\udf9f',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'\ud83c\udfad',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'\ud83c\udfa8',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'\ud83c\udfaa',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\ud83e\udd39\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\ud83e\udd39\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'\ud83c\udfa4',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'\ud83c\udfa7',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'\ud83c\udfbc',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'\ud83c\udfb9',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'\ud83e\udd41',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'\ud83c\udfb7',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:'\ud83c\udfba',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:'\ud83c\udfb8',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'\ud83c\udfbb',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:'\ud83c\udfac',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'\ud83c\udfae',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'\ud83d\udc7e',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'\ud83c\udfaf',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'\ud83c\udfb2',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'\ud83c\udfb0',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'\ud83e\udde9',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'\ud83c\udfb3',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'\ud83d\ude97',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'\ud83d\ude95',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'\ud83d\ude99',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'\ud83d\ude8c',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'\ud83d\ude8e',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'\ud83c\udfce',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'\ud83d\ude93',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'\ud83d\ude91',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'\ud83d\ude92',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'\ud83d\ude90',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'\ud83d\ude9a',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'\ud83d\ude9b',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'\ud83d\ude9c',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'\ud83d\udef4',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'\ud83c\udfcd',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'\ud83d\udeb2',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'\ud83d\udef5',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'\ud83d\udea8',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'\ud83d\ude94',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'\ud83d\ude8d',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'\ud83d\ude98',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'\ud83d\ude96',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'\ud83d\udea1',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'\ud83d\udea0',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'\ud83d\ude9f',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'\ud83d\ude83',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'\ud83d\ude8b',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'\ud83d\ude9d',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'\ud83d\ude84',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'\ud83d\ude85',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'\ud83d\ude88',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'\ud83d\ude9e',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'\ud83d\ude82',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'\ud83d\ude86',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'\ud83d\ude87',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'\ud83d\ude8a',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'\ud83d\ude89',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'\ud83d\udef8',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'\ud83d\ude81',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'\ud83d\udee9',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'\u2708\ufe0f',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'\ud83d\udeeb',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'\ud83d\udeec',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'\u26f5',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'\ud83d\udee5',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'\ud83d\udea4',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'\u26f4',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'\ud83d\udef3',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'\ud83d\ude80',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'\ud83d\udef0',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'\ud83d\udcba',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'\ud83d\udef6',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'\u2693',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'\ud83d\udea7',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'\u26fd',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'\ud83d\ude8f',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'\ud83d\udea6',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'\ud83d\udea5',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'\ud83c\udfc1',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'\ud83d\udea2',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'\ud83c\udfa1',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'\ud83c\udfa2',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'\ud83c\udfa0',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'\ud83c\udfd7',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'\ud83c\udf01',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'\ud83d\uddfc',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'\ud83c\udfed',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'\u26f2',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'\ud83c\udf91',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'\u26f0',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'\ud83c\udfd4',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'\ud83d\uddfb',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'\ud83c\udf0b',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'\ud83d\uddfe',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'\ud83c\udfd5',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'\u26fa',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'\ud83c\udfde',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'\ud83d\udee3',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'\ud83d\udee4',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'\ud83c\udf05',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'\ud83c\udf04',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'\ud83c\udfdc',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'\ud83c\udfd6',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'\ud83c\udfdd',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'\ud83c\udf07',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'\ud83c\udf06',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'\ud83c\udfd9',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'\ud83c\udf03',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'\ud83c\udf09',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'\ud83c\udf0c',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'\ud83c\udf20',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'\ud83c\udf87',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'\ud83c\udf86',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'\ud83c\udf08',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'\ud83c\udfd8',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'\ud83c\udff0',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'\ud83c\udfef',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'\ud83c\udfdf',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'\ud83d\uddfd',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:'\ud83c\udfe0',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'\ud83c\udfe1',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'\ud83c\udfda',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'\ud83c\udfe2',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'\ud83c\udfec',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'\ud83c\udfe3',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'\ud83c\udfe4',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'\ud83c\udfe5',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'\ud83c\udfe6',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'\ud83c\udfe8',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'\ud83c\udfea',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'\ud83c\udfeb',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'\ud83c\udfe9',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'\ud83d\udc92',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'\ud83c\udfdb',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'\u26ea',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'\ud83d\udd4c',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'\ud83d\udd4d',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'\ud83d\udd4b',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'\u26e9',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'\u231a',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'\ud83d\udcf1',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:'\ud83d\udcf2',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'\ud83d\udcbb',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'\u2328',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'\ud83d\udda5',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:'\ud83d\udda8',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:'\ud83d\uddb1',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'\ud83d\uddb2',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:'\ud83d\udd79',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:'\ud83d\udddc',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'\ud83d\udcbd',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'\ud83d\udcbe',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'\ud83d\udcbf',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'\ud83d\udcc0',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'\ud83d\udcfc',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:'\ud83d\udcf7',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'\ud83d\udcf8',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:'\ud83d\udcf9',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:'\ud83c\udfa5',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'\ud83d\udcfd',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:'\ud83c\udf9e',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'\ud83d\udcde',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'\u260e\ufe0f',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'\ud83d\udcdf',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:'\ud83d\udce0',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'\ud83d\udcfa',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'\ud83d\udcfb',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'\ud83c\udf99',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:'\ud83c\udf9a',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:'\ud83c\udf9b',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'\ud83e\udded',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'\u23f1',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:'\u23f2',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'\u23f0',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'\ud83d\udd70',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'\u23f3',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'\u231b',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'\ud83d\udce1',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'\ud83d\udd0b',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:'\ud83d\udd0c',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'\ud83d\udca1',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'\ud83d\udd26',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:'\ud83d\udd6f',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'\ud83e\uddef',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'\ud83d\uddd1',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:'\ud83d\udee2',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'\ud83d\udcb8',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'\ud83d\udcb5',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'\ud83d\udcb4',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'\ud83d\udcb6',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'\ud83d\udcb7',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'\ud83d\udcb0',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'\ud83d\udcb3',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'\ud83d\udc8e',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'\u2696',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'\ud83e\uddf0',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'\ud83d\udd27',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:'\ud83d\udd28',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'\u2692',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'\ud83d\udee0',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:'\u26cf',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'\ud83d\udd29',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:'\u2699',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:'\ud83e\uddf1',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:'\u26d3',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'\ud83e\uddf2',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'\ud83d\udd2b',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'\ud83d\udca3',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'\ud83e\udde8',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'\ud83d\udd2a',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:'\ud83d\udde1',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:'\u2694',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:'\ud83d\udee1',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'\ud83d\udeac',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'\u2620',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'\u26b0',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'\u26b1',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:'\ud83c\udffa',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'\ud83d\udd2e',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'\ud83d\udcff',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'\ud83e\uddff',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:'\ud83d\udc88',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'\u2697',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'\ud83d\udd2d',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'\ud83d\udd2c',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:'\ud83d\udd73',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'\ud83d\udc8a',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'\ud83d\udc89',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'\ud83e\uddec',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'\ud83e\udda0',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'\ud83e\uddeb',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'\ud83e\uddea',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'\ud83c\udf21',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'\ud83e\uddf9',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:'\ud83e\uddfa',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:'\ud83e\uddfb',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:'\ud83c\udff7',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'\ud83d\udd16',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'\ud83d\udebd',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'\ud83d\udebf',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'\ud83d\udec1',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'\ud83e\uddfc',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'\ud83e\uddfd',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'\ud83e\uddf4',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:'\ud83d\udd11',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:'\ud83d\udddd',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'\ud83d\udecb',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'\ud83d\udecc',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:'\ud83d\udecf',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:'\ud83d\udeaa',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:'\ud83d\udece',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'\ud83e\uddf8',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:'\ud83d\uddbc',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:'\ud83d\uddfa',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'\u26f1',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'\ud83d\uddff',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'\ud83d\udecd',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:'\ud83d\uded2',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'\ud83c\udf88',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'\ud83c\udf8f',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'\ud83c\udf80',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'\ud83c\udf81',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'\ud83c\udf8a',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'\ud83c\udf89',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'\ud83c\udf8e',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'\ud83c\udf90',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'\ud83c\udf8c',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'\ud83c\udfee',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:'\ud83e\udde7',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'\u2709\ufe0f',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'\ud83d\udce9',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'\ud83d\udce8',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'\ud83d\udce7',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'\ud83d\udc8c',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'\ud83d\udcee',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'\ud83d\udcea',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'\ud83d\udceb',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'\ud83d\udcec',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'\ud83d\udced',fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'\ud83d\udce6',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'\ud83d\udcef',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'\ud83d\udce5',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'\ud83d\udce4',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'\ud83d\udcdc',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'\ud83d\udcc3',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'\ud83d\udcd1',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'\ud83e\uddfe',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'\ud83d\udcca',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'\ud83d\udcc8',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'\ud83d\udcc9',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'\ud83d\udcc4',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:'\ud83d\udcc5',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'\ud83d\udcc6',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'\ud83d\uddd3',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:'\ud83d\udcc7',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'\ud83d\uddc3',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:'\ud83d\uddf3',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'\ud83d\uddc4',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'\ud83d\udccb',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'\ud83d\uddd2',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'\ud83d\udcc1',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'\ud83d\udcc2',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'\ud83d\uddc2',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'\ud83d\uddde',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:'\ud83d\udcf0',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'\ud83d\udcd3',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'\ud83d\udcd5',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'\ud83d\udcd7',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'\ud83d\udcd8',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'\ud83d\udcd9',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'\ud83d\udcd4',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:'\ud83d\udcd2',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:'\ud83d\udcda',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'\ud83d\udcd6',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:'\ud83e\uddf7',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:'\ud83d\udd17',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'\ud83d\udcce',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'\ud83d\udd87',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:'\u2702\ufe0f',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'\ud83d\udcd0',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'\ud83d\udccf',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:'\ud83e\uddee',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'\ud83d\udccc',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'\ud83d\udccd',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'\ud83d\udea9',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'\ud83c\udff3',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:'\ud83c\udff4',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'\ud83c\udff3\ufe0f\u200d\ud83c\udf08',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'\ud83d\udd10',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:'\ud83d\udd12',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:'\ud83d\udd13',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'\ud83d\udd0f',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'\ud83d\udd8a',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'\ud83d\udd8b',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'\u2712\ufe0f',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'\ud83d\udcdd',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'\u270f\ufe0f',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'\ud83d\udd8d',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'\ud83d\udd8c',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'\ud83d\udd0d',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'\ud83d\udd0e',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:'\u2764\ufe0f',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'\ud83e\udde1',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9b',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9a',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc99',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9c',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:'\ud83d\udda4',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'\ud83d\udc94',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'\u2763',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'\ud83d\udc95',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9e',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'\ud83d\udc93',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'\ud83d\udc97',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc96',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'\ud83d\udc98',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'\ud83d\udc9d',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'\ud83d\udc9f',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'\u262e',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:'\u271d',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'\u262a',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\ud83d\udd49',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\u2638',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:'\u2721',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'\ud83d\udd2f',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'\ud83d\udd4e',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:'\u262f',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'\u2626',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'\ud83d\uded0',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'\u26ce',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2648',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2649',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264a',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264b',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264c',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264d',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264e',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'\u264f',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2650',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2651',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2652',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2653',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:'\ud83c\udd94',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'\u269b',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'\ud83c\ude33',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'\ud83c\ude39',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'\u2622',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:'\u2623',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'\ud83d\udcf4',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'\ud83d\udcf3',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'\ud83c\ude36',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'\ud83c\ude1a',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'\ud83c\ude38',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'\ud83c\ude3a',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'\ud83c\ude37\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'\u2734\ufe0f',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:'\ud83c\udd9a',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'\ud83c\ude51',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'\ud83d\udcae',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'\ud83c\ude50',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'\u3299\ufe0f',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'\u3297\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'\ud83c\ude34',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'\ud83c\ude35',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'\ud83c\ude32',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'\ud83c\udd70\ufe0f',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'\ud83c\udd71\ufe0f',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'\ud83c\udd8e',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'\ud83c\udd91',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'\ud83c\udd7e\ufe0f',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'\ud83c\udd98',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'\u26d4',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'\ud83d\udcdb',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'\ud83d\udeab',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'\u274c',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:'\u2b55',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:'\ud83d\uded1',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:'\ud83d\udca2',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'\u2668\ufe0f',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'\ud83d\udeb7',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'\ud83d\udeaf',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'\ud83d\udeb3',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'\ud83d\udeb1',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'\ud83d\udd1e',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'\ud83d\udcf5',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'\u2757',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'\u2755',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:'\u2753',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'\u2754',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'\u203c\ufe0f',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'\u2049\ufe0f',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'\ud83d\udd05',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'\ud83d\udd06',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:'\ud83d\udd31',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'\u269c',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'\u303d\ufe0f',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'\u26a0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'\ud83d\udeb8',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:'\ud83d\udd30',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'\u267b\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'\ud83c\ude2f',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'\ud83d\udcb9',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'\u2747\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'\u2733\ufe0f',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'\u274e',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'\u2705',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'\ud83d\udca0',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'\ud83c\udf00',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:'\u27bf',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'\ud83c\udf10',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'\u24c2\ufe0f',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'\ud83c\udfe7',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'\ud83c\ude02\ufe0f',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'\ud83d\udec2',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'\ud83d\udec3',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'\ud83d\udec4',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'\ud83d\udec5',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'\u267f',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'\ud83d\udead',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'\ud83d\udebe',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'\ud83c\udd7f\ufe0f',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'\ud83d\udeb0',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'\ud83d\udeb9',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'\ud83d\udeba',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'\ud83d\udebc',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'\ud83d\udebb',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'\ud83d\udeae',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'\ud83c\udfa6',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'\ud83d\udcf6',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'\ud83c\ude01',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'\ud83c\udd96',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'\ud83c\udd97',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'\ud83c\udd99',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:'\ud83c\udd92',fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'\ud83c\udd95',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:'\ud83c\udd93',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'0\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'1\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'2\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'3\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'4\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'5\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'6\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'7\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'8\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'9\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'\ud83d\udd1f',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'*\u20e3',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:'\u23cf\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'\u25b6\ufe0f',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'\u23f8',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'\u23ed',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:'\u23f9',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:'\u23fa',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'\u23ef',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:'\u23ee',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'\u23e9',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'\u23ea',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'\ud83d\udd00',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:'\ud83d\udd01',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'\ud83d\udd02',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'\u25c0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'\ud83d\udd3c',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'\ud83d\udd3d',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'\u23eb',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'\u23ec',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'\u27a1\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'\u2b05\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'\u2b06\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'\u2b07\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'\u2197\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'\u2198\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'\u2199\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'\u2196\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'\u2195\ufe0f',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'\u2194\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'\ud83d\udd04',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'\u21aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'\u21a9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'\u2934\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'\u2935\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'#\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'\u2139\ufe0f',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'\ud83d\udd24',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'\ud83d\udd21',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'\ud83d\udd20',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'\ud83d\udd23',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'\ud83c\udfb5',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:'\ud83c\udfb6',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'\u3030\ufe0f',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'\u27b0',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'\u2714\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'\ud83d\udd03',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'\u2795',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'\u2796',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'\u2797',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'\u2716\ufe0f',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:'\u267e',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'\ud83d\udcb2',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'\ud83d\udcb1',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'\xa9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'\xae\ufe0f',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'\u2122\ufe0f',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:'\ud83d\udd1a',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:'\ud83d\udd19',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:'\ud83d\udd1b',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:'\ud83d\udd1d',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:'\ud83d\udd1c',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'\u2611\ufe0f',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'\ud83d\udd18',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:'\u26aa',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'\u26ab',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'\ud83d\udd34',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'\ud83d\udd35',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd38',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd39',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd36',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd37',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'\ud83d\udd3a',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'\u25aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'\u25ab\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'\u2b1b',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'\u2b1c',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'\ud83d\udd3b',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'\u25fc\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'\u25fb\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'\u25fe',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'\u25fd',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'\ud83d\udd32',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'\ud83d\udd33',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'\ud83d\udd08',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'\ud83d\udd09',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'\ud83d\udd0a',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'\ud83d\udd07',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'\ud83d\udce3',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'\ud83d\udce2',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'\ud83d\udd14',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'\ud83d\udd15',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'\ud83c\udccf',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'\ud83c\udc04',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'\u2660\ufe0f',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'\u2663\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'\u2665\ufe0f',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'\u2666\ufe0f',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'\ud83c\udfb4',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'\ud83d\udcad',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'\ud83d\uddef',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'\ud83d\udcac',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'\ud83d\udde8',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'\ud83d\udd50',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'\ud83d\udd51',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'\ud83d\udd52',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'\ud83d\udd53',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'\ud83d\udd54',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'\ud83d\udd55',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'\ud83d\udd56',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'\ud83d\udd57',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'\ud83d\udd58',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'\ud83d\udd59',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5a',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'\ud83d\udd5b',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5c',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5d',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5e',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5f',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'\ud83d\udd60',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'\ud83d\udd61',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'\ud83d\udd62',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'\ud83d\udd63',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'\ud83d\udd64',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'\ud83d\udd65',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'\ud83d\udd66',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'\ud83d\udd67',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'\ud83c\udde8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'\ud83c\uddea\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'\ud83c\uddeb\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'\ud83c\udde9\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'\ud83c\uddef\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'\ud83c\uddfd\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'\ud83c\uddfe\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'\ud83c\uddf0\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'\ud83c\uddf4\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'\ud83c\uddf6\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'\ud83c\uddfc\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'\ud83c\uddf0\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'\ud83c\uddec\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'\ud83c\uddfc\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'\ud83c\uddfe\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'\ud83c\uddfa\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'\ud83c\udff4\u200d\u2620\ufe0f',fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojis.js b/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojis.js new file mode 100644 index 000000000..cf7f472bf --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojis.js @@ -0,0 +1,9423 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons", { + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + char: "\ud83d\ude00", + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + char: "\ud83d\ude2c", + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + char: "\ud83d\ude01", + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + char: "\ud83d\ude02", + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + char: "\ud83e\udd23", + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + char: "\ud83e\udd73", + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + char: "\ud83d\ude03", + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + char: "\ud83d\ude04", + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + char: "\ud83d\ude05", + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + char: "\ud83d\ude06", + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + char: "\ud83d\ude07", + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + char: "\ud83d\ude09", + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + char: "\ud83d\ude0a", + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + char: "\ud83d\ude42", + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + char: "\ud83d\ude43", + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + char: "\u263a\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + char: "\ud83d\ude0b", + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + char: "\ud83d\ude0c", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + char: "\ud83d\ude0d", + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + char: "\ud83e\udd70", + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude18", + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude17", + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude19", + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude1a", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + char: "\ud83d\ude1c", + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + char: "\ud83e\udd2a", + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + char: "\ud83e\udd28", + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + char: "\ud83e\uddd0", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + char: "\ud83d\ude1d", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + char: "\ud83d\ude1b", + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + char: "\ud83e\udd11", + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + char: "\ud83e\udd13", + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + char: "\ud83d\ude0e", + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + char: "\ud83e\udd29", + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + char: "\ud83e\udd21", + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + char: "\ud83e\udd20", + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + char: "\ud83e\udd17", + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + char: "\ud83d\ude0f", + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + char: "\ud83d\ude36", + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + char: "\ud83d\ude10", + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + char: "\ud83d\ude11", + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + char: "\ud83d\ude12", + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + char: "\ud83d\ude44", + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + char: "\ud83e\udd14", + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + char: "\ud83e\udd25", + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + char: "\ud83e\udd2d", + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + char: "\ud83e\udd2b", + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + char: "\ud83e\udd2c", + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + char: "\ud83e\udd2f", + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + char: "\ud83d\ude33", + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + char: "\ud83d\ude1e", + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + char: "\ud83d\ude1f", + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + char: "\ud83d\ude20", + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + char: "\ud83d\ude21", + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + char: "\ud83d\ude14", + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + char: "\ud83d\ude15", + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + char: "\ud83d\ude41", + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + char: "\u2639", + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + char: "\ud83d\ude23", + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + char: "\ud83d\ude16", + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + char: "\ud83d\ude2b", + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + char: "\ud83d\ude29", + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + char: "\ud83e\udd7a", + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + char: "\ud83d\ude24", + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + char: "\ud83d\ude2e", + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + char: "\ud83d\ude31", + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + char: "\ud83d\ude28", + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + char: "\ud83d\ude30", + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + char: "\ud83d\ude2f", + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + char: "\ud83d\ude26", + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + char: "\ud83d\ude27", + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + char: "\ud83d\ude22", + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + char: "\ud83d\ude25", + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + char: "\ud83e\udd24", + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + char: "\ud83d\ude2a", + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + char: "\ud83d\ude13", + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + char: "\ud83e\udd75", + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + char: "\ud83e\udd76", + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + char: "\ud83d\ude2d", + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + char: "\ud83d\ude35", + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + char: "\ud83d\ude32", + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + char: "\ud83e\udd10", + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + char: "\ud83e\udd22", + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + char: "\ud83e\udd27", + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + char: "\ud83e\udd2e", + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + char: "\ud83d\ude37", + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + char: "\ud83e\udd12", + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + char: "\ud83e\udd15", + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + char: "\ud83e\udd74", + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + char: "\ud83d\ude34", + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + char: "\ud83d\udca4", + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + char: "\ud83d\udca9", + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + char: "\ud83d\ude08", + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + char: "\ud83d\udc7f", + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + char: "\ud83d\udc79", + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + char: "\ud83d\udc7a", + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + char: "\ud83d\udc80", + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + char: "\ud83d\udc7b", + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + char: "\ud83d\udc7d", + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + char: "\ud83e\udd16", + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + char: "\ud83d\ude3a", + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + char: "\ud83d\ude38", + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + char: "\ud83d\ude39", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + char: "\ud83d\ude3b", + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + char: "\ud83d\ude3c", + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + char: "\ud83d\ude3d", + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + char: "\ud83d\ude40", + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + char: "\ud83d\ude3f", + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + char: "\ud83d\ude3e", + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + char: "\ud83e\udd32", + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + char: "\ud83d\ude4c", + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + char: "\ud83d\udc4f", + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + char: "\ud83d\udc4b", + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + char: "\ud83e\udd19", + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + char: "\ud83d\udc4d", + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + char: "\ud83d\udc4e", + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + char: "\ud83d\udc4a", + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + char: "\u270a", + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + char: "\ud83e\udd1b", + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + char: "\ud83e\udd1c", + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + char: "\u270c", + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + char: "\ud83d\udc4c", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + char: "\u270b", + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + char: "\ud83e\udd1a", + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + char: "\ud83d\udc50", + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + char: "\ud83d\udcaa", + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + char: "\ud83d\ude4f", + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + char: "\ud83e\uddb6", + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + char: "\ud83e\uddb5", + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + char: "\ud83e\udd1d", + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + char: "\u261d", + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + char: "\ud83d\udc46", + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + char: "\ud83d\udc47", + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + char: "\ud83d\udc48", + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + char: "\ud83d\udc49", + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + char: "\ud83d\udd95", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + char: "\ud83d\udd90", + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + char: "\ud83e\udd1f", + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + char: "\ud83e\udd18", + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + char: "\ud83e\udd1e", + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + char: "\ud83d\udd96", + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + char: "\u270d", + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + char: "\ud83e\udd33", + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + char: "\ud83d\udc85", + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + char: "\ud83d\udc44", + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + char: "\ud83e\uddb7", + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + char: "\ud83d\udc45", + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + char: "\ud83d\udc42", + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + char: "\ud83d\udc43", + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + char: "\ud83d\udc41", + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + char: "\ud83d\udc40", + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + char: "\ud83e\udde0", + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + char: "\ud83d\udc64", + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + char: "\ud83d\udc65", + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + char: "\ud83d\udde3", + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + char: "\ud83d\udc76", + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + char: "\ud83e\uddd2", + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + char: "\ud83d\udc66", + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + char: "\ud83d\udc67", + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + char: "\ud83e\uddd1", + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + char: "\ud83d\udc68", + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + char: "\ud83d\udc69", + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + char: "\ud83d\udc71\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + char: "\ud83d\udc71", + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + char: "\ud83e\uddd4", + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + char: "\ud83e\uddd3", + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + char: "\ud83d\udc74", + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + char: "\ud83d\udc75", + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + char: "\ud83d\udc72", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + char: "\ud83e\uddd5", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + char: "\ud83d\udc73\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + char: "\ud83d\udc73", + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + char: "\ud83d\udc6e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + char: "\ud83d\udc6e", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + char: "\ud83d\udc77\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + char: "\ud83d\udc77", + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + char: "\ud83d\udc82\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + char: "\ud83d\udc82", + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + char: "\ud83d\udd75\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + char: "\ud83d\udd75", + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + char: "\ud83d\udc69\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + char: "\ud83d\udc68\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + char: "\ud83d\udc69\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + char: "\ud83d\udc68\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + char: "\ud83d\udc69\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + char: "\ud83d\udc68\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + char: "\ud83d\udc69\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + char: "\ud83d\udc68\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + char: "\ud83d\udc69\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + char: "\ud83d\udc68\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + char: "\ud83e\uddb8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + char: "\ud83e\uddb8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + char: "\ud83e\uddb9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + char: "\ud83e\uddb9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + char: "\ud83e\udd36", + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + char: "\ud83c\udf85", + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + char: "\ud83e\uddd9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + char: "\ud83e\uddd9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + char: "\ud83e\udddd\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + char: "\ud83e\udddd\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + char: "\ud83e\udddb\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + char: "\ud83e\udddb\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + char: "\ud83e\udddf\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + char: "\ud83e\udddf\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + char: "\ud83e\uddde\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + char: "\ud83e\uddde\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + char: "\ud83e\udddc\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + char: "\ud83e\udddc\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + char: "\ud83e\uddda\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + char: "\ud83e\uddda\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + char: "\ud83d\udc7c", + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + char: "\ud83e\udd30", + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + char: "\ud83e\udd31", + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + char: "\ud83d\udc78", + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + char: "\ud83e\udd34", + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + char: "\ud83d\udc70", + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + char: "\ud83e\udd35", + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + char: "\ud83c\udfc3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + char: "\ud83c\udfc3", + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + char: "\ud83d\udeb6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + char: "\ud83d\udeb6", + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + char: "\ud83d\udc83", + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + char: "\ud83d\udd7a", + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + char: "\ud83d\udc6f", + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + char: "\ud83d\udc6f\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + char: "\ud83d\udc6b", + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + char: "\ud83d\udc6c", + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + char: "\ud83d\udc6d", + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + char: "\ud83d\ude47\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + char: "\ud83d\ude47", + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + char: "\ud83e\udd26\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + char: "\ud83e\udd26\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + char: "\ud83e\udd37", + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + char: "\ud83e\udd37\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + char: "\ud83d\udc81", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + char: "\ud83d\udc81\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + char: "\ud83d\ude45", + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + char: "\ud83d\ude45\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + char: "\ud83d\ude46", + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + char: "\ud83d\ude46\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + char: "\ud83d\ude4b", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + char: "\ud83d\ude4b\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + char: "\ud83d\ude4e", + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + char: "\ud83d\ude4e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + char: "\ud83d\ude4d", + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + char: "\ud83d\ude4d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + char: "\ud83d\udc87", + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + char: "\ud83d\udc87\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + char: "\ud83d\udc86", + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + char: "\ud83d\udc86\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + char: "\ud83e\uddd6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + char: "\ud83e\uddd6\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: "\ud83d\udc91", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: "\ud83d\udc8f", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + char: "\ud83d\udc6a", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + char: "\ud83e\uddf6", + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + char: "\ud83e\uddf5", + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + char: "\ud83e\udde5", + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + char: "\ud83e\udd7c", + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + char: "\ud83d\udc5a", + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + char: "\ud83d\udc55", + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + char: "\ud83d\udc56", + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + char: "\ud83d\udc54", + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + char: "\ud83d\udc57", + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + char: "\ud83d\udc59", + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + char: "\ud83d\udc58", + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + char: "\ud83d\udc84", + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + char: "\ud83d\udc8b", + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + char: "\ud83d\udc63", + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + char: "\ud83e\udd7f", + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + char: "\ud83d\udc60", + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + char: "\ud83d\udc61", + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + char: "\ud83d\udc62", + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + char: "\ud83d\udc5e", + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + char: "\ud83d\udc5f", + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + char: "\ud83e\udd7e", + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + char: "\ud83e\udde6", + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + char: "\ud83e\udde4", + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + char: "\ud83e\udde3", + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + char: "\ud83d\udc52", + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + char: "\ud83c\udfa9", + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + char: "\ud83e\udde2", + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + char: "\u26d1", + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + char: "\ud83c\udf93", + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + char: "\ud83d\udc51", + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + char: "\ud83c\udf92", + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + char: "\ud83e\uddf3", + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + char: "\ud83d\udc5d", + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + char: "\ud83d\udc5b", + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + char: "\ud83d\udc5c", + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + char: "\ud83d\udcbc", + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + char: "\ud83d\udc53", + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + char: "\ud83d\udd76", + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + char: "\ud83e\udd7d", + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + char: "\ud83d\udc8d", + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + char: "\ud83c\udf02", + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + char: "\ud83d\udc36", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + char: "\ud83d\udc31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + char: "\ud83d\udc2d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + char: "\ud83d\udc30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + char: "\ud83e\udd8a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + char: "\ud83d\udc3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + char: "\ud83d\udc3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + char: "\ud83d\udc2f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + char: "\ud83e\udd81", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: "\ud83d\udc2e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + char: "\ud83d\udc37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + char: "\ud83d\udc3d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + char: "\ud83d\udc38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + char: "\ud83e\udd91", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + char: "\ud83d\udc19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + char: "\ud83e\udd90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + char: "\ud83d\udc35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + char: "\ud83e\udd8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + char: "\ud83d\ude48", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + char: "\ud83d\ude49", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + char: "\ud83d\ude4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + char: "\ud83d\udc12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + char: "\ud83d\udc14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + char: "\ud83d\udc26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + char: "\ud83d\udc24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + char: "\ud83d\udc23", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + char: "\ud83d\udc25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + char: "\ud83e\udd86", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + char: "\ud83e\udd85", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + char: "\ud83e\udd89", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + char: "\ud83e\udd87", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + char: "\ud83d\udc3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + char: "\ud83d\udc34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + char: "\ud83e\udd84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + char: "\ud83d\udc1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + char: "\ud83d\udc1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + char: "\ud83e\udd8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + char: "\ud83d\udc0c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + char: "\ud83d\udc1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + char: "\ud83d\udc1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + char: "\ud83e\udd97", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + char: "\ud83d\udd77", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + char: "\ud83e\udd82", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + char: "\ud83e\udd80", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + char: "\ud83d\udc0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + char: "\ud83e\udd8e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + char: "\ud83e\udd96", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + char: "\ud83e\udd95", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + char: "\ud83d\udc22", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + char: "\ud83d\udc20", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + char: "\ud83d\udc1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + char: "\ud83d\udc21", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + char: "\ud83d\udc2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + char: "\ud83e\udd88", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: "\ud83d\udc33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: "\ud83d\udc0b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + char: "\ud83d\udc0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc06", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + char: "\ud83e\udd93", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + char: "\ud83d\udc05", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + char: "\ud83d\udc03", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + char: "\ud83d\udc02", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: "\ud83d\udc04", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + char: "\ud83e\udd8c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + char: "\ud83d\udc2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + char: "\ud83d\udc2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + char: "\ud83e\udd92", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + char: "\ud83d\udc18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + char: "\ud83e\udd8f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc10", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + char: "\ud83d\udc0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + char: "\ud83d\udc11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + char: "\ud83d\udc0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + char: "\ud83d\udc00", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + char: "\ud83d\udc01", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + char: "\ud83d\udc13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + char: "\ud83e\udd83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + char: "\ud83d\udd4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + char: "\ud83d\udc15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + char: "\ud83d\udc29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + char: "\ud83d\udc08", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + char: "\ud83d\udc07", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + char: "\ud83d\udc3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + char: "\ud83e\udd94", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + char: "\ud83e\udd9d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + char: "\ud83e\udd99", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + char: "\ud83e\udd9b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + char: "\ud83e\udd98", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + char: "\ud83e\udda1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + char: "\ud83e\udda2", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + char: "\ud83e\udd9a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + char: "\ud83e\udd9c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + char: "\ud83e\udd9e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + char: "\ud83e\udd9f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + char: "\ud83d\udc3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: "\ud83d\udc09", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: "\ud83d\udc32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + char: "\ud83c\udf35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + char: "\ud83c\udf84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + char: "\ud83c\udf32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + char: "\ud83c\udf33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + char: "\ud83c\udf34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + char: "\ud83c\udf31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + char: "\ud83c\udf3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + char: "\u2618", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + char: "\ud83c\udf40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + char: "\ud83c\udf8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + char: "\ud83c\udf8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + char: "\ud83c\udf43", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + char: "\ud83c\udf42", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + char: "\ud83c\udf41", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + char: "\ud83c\udf3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + char: "\ud83c\udf3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + char: "\ud83c\udf3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + char: "\ud83c\udf39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + char: "\ud83e\udd40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + char: "\ud83c\udf37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + char: "\ud83c\udf3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + char: "\ud83c\udf38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + char: "\ud83d\udc90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + char: "\ud83c\udf44", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + char: "\ud83c\udf30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + char: "\ud83c\udf83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + char: "\ud83d\udc1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + char: "\ud83d\udd78", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + char: "\ud83c\udf0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + char: "\ud83c\udf0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + char: "\ud83c\udf0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + char: "\ud83c\udf16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + char: "\ud83c\udf14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + char: "\ud83c\udf1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + char: "\ud83c\udf19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + char: "\u2b50", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + char: "\ud83c\udf1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + char: "\ud83d\udcab", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + char: "\u2728", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + char: "\u2604", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + char: "\u2600\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + char: "\ud83c\udf24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + char: "\u26c5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + char: "\ud83c\udf25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + char: "\ud83c\udf26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + char: "\u2601\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + char: "\ud83c\udf27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + char: "\u26c8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + char: "\ud83c\udf29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + char: "\u26a1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + char: "\ud83d\udd25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + char: "\ud83d\udca5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + char: "\u2744\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + char: "\ud83c\udf28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + char: "\u26c4", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + char: "\u2603", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + char: "\ud83c\udf2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + char: "\ud83d\udca8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + char: "\ud83c\udf2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + char: "\ud83c\udf2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + char: "\u2602", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + char: "\u2614", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + char: "\ud83d\udca7", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + char: "\ud83d\udca6", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + char: "\ud83c\udf0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + char: "\ud83c\udf4f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + char: "\ud83c\udf4e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + char: "\ud83c\udf4a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + char: "\ud83c\udf4b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + char: "\ud83c\udf4c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + char: "\ud83c\udf49", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + char: "\ud83c\udf47", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + char: "\ud83c\udf53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf48", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + char: "\ud83c\udf52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf4d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + char: "\ud83e\udd65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + char: "\ud83e\udd5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + char: "\ud83e\udd6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + char: "\ud83e\udd51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + char: "\ud83e\udd66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + char: "\ud83c\udf45", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + char: "\ud83c\udf46", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + char: "\ud83e\udd52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + char: "\ud83e\udd55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + char: "\ud83c\udf36", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + char: "\ud83e\udd54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + char: "\ud83c\udf3d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + char: "\ud83e\udd6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + char: "\ud83c\udf60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + char: "\ud83e\udd5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + char: "\ud83c\udf6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + char: "\ud83e\udd50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + char: "\ud83c\udf5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + char: "\ud83e\udd56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + char: "\ud83e\udd6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + char: "\ud83e\udd68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + char: "\ud83e\uddc0", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + char: "\ud83e\udd5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + char: "\ud83e\udd53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + char: "\ud83e\udd69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + char: "\ud83e\udd5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + char: "\ud83c\udf57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + char: "\ud83c\udf56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + char: "\ud83e\uddb4", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + char: "\ud83c\udf64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + char: "\ud83c\udf73", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + char: "\ud83c\udf54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + char: "\ud83c\udf5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + char: "\ud83e\udd59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + char: "\ud83c\udf2d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + char: "\ud83c\udf55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + char: "\ud83e\udd6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + char: "\ud83e\udd6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + char: "\ud83c\udf5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + char: "\ud83c\udf2e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + char: "\ud83c\udf2f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + char: "\ud83e\udd57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + char: "\ud83e\udd58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + char: "\ud83c\udf5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + char: "\ud83c\udf72", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + char: "\ud83c\udf65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + char: "\ud83e\udd60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + char: "\ud83c\udf63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + char: "\ud83c\udf71", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + char: "\ud83c\udf5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + char: "\ud83c\udf59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + char: "\ud83c\udf5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + char: "\ud83c\udf58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + char: "\ud83c\udf62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + char: "\ud83c\udf61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + char: "\ud83c\udf67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + char: "\ud83c\udf68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + char: "\ud83c\udf66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + char: "\ud83e\udd67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + char: "\ud83c\udf70", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + char: "\ud83e\uddc1", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + char: "\ud83e\udd6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + char: "\ud83c\udf82", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + char: "\ud83c\udf6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + char: "\ud83c\udf6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + char: "\ud83c\udf6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + char: "\ud83c\udf6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + char: "\ud83c\udf7f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + char: "\ud83e\udd5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + char: "\ud83c\udf69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + char: "\ud83c\udf6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + char: "\ud83e\udd5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: "\ud83c\udf7a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: "\ud83c\udf7b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + char: "\ud83e\udd42", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + char: "\ud83c\udf77", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + char: "\ud83e\udd43", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + char: "\ud83c\udf78", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + char: "\ud83c\udf79", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + char: "\ud83c\udf7e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + char: "\ud83c\udf76", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + char: "\ud83c\udf75", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + char: "\ud83e\udd64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + char: "\u2615", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + char: "\ud83c\udf7c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + char: "\ud83e\uddc2", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + char: "\ud83e\udd44", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + char: "\ud83c\udf74", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + char: "\ud83c\udf7d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + char: "\ud83e\udd63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + char: "\ud83e\udd61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + char: "\ud83e\udd62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + char: "\u26bd", + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + char: "\ud83c\udfc0", + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + char: "\ud83c\udfc8", + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + char: "\u26be", + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + char: "\ud83e\udd4e", + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + char: "\ud83c\udfbe", + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + char: "\ud83c\udfd0", + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + char: "\ud83c\udfc9", + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + char: "\ud83e\udd4f", + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + char: "\ud83c\udfb1", + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + char: "\u26f3", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + char: "\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + char: "\ud83c\udfcc", + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + char: "\ud83c\udfd3", + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + char: "\ud83c\udff8", + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + char: "\ud83e\udd45", + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + char: "\ud83c\udfd2", + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + char: "\ud83c\udfd1", + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + char: "\ud83e\udd4d", + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + char: "\ud83c\udfcf", + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + char: "\ud83c\udfbf", + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + char: "\u26f7", + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + char: "\ud83c\udfc2", + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + char: "\ud83e\udd3a", + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: "\ud83e\udd3c\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: "\ud83e\udd3c\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + char: "\ud83e\udd38\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + char: "\ud83e\udd38\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + char: "\ud83e\udd3e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + char: "\ud83e\udd3e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + char: "\u26f8", + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + char: "\ud83e\udd4c", + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + char: "\ud83d\udef9", + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + char: "\ud83d\udef7", + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + char: "\ud83c\udff9", + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + char: "\ud83c\udfa3", + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + char: "\ud83e\udd4a", + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + char: "\ud83e\udd4b", + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + char: "\ud83d\udea3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + char: "\ud83d\udea3", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + char: "\ud83e\uddd7\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + char: "\ud83e\uddd7\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + char: "\ud83c\udfca\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + char: "\ud83c\udfca", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: "\ud83e\udd3d\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: "\ud83e\udd3d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: "\ud83e\uddd8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: "\ud83e\uddd8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + char: "\ud83c\udfc4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + char: "\ud83c\udfc4", + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + char: "\ud83d\udec0", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + char: "\u26f9\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + char: "\u26f9", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + char: "\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + char: "\ud83c\udfcb", + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + char: "\ud83d\udeb4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + char: "\ud83d\udeb4", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + char: "\ud83d\udeb5\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + char: "\ud83d\udeb5", + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + char: "\ud83c\udfc7", + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + char: "\ud83d\udd74", + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + char: "\ud83c\udfc6", + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + char: "\ud83c\udfbd", + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + char: "\ud83c\udfc5", + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + char: "\ud83c\udf96", + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + char: "\ud83e\udd47", + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + char: "\ud83e\udd48", + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + char: "\ud83e\udd49", + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + char: "\ud83c\udf97", + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + char: "\ud83c\udff5", + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + char: "\ud83c\udfab", + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + char: "\ud83c\udf9f", + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + char: "\ud83c\udfad", + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + char: "\ud83c\udfa8", + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + char: "\ud83c\udfaa", + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: "\ud83e\udd39\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: "\ud83e\udd39\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + char: "\ud83c\udfa4", + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + char: "\ud83c\udfa7", + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + char: "\ud83c\udfbc", + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + char: "\ud83c\udfb9", + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + char: "\ud83e\udd41", + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + char: "\ud83c\udfb7", + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + char: "\ud83c\udfba", + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + char: "\ud83c\udfb8", + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + char: "\ud83c\udfbb", + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + char: "\ud83c\udfac", + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + char: "\ud83c\udfae", + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + char: "\ud83d\udc7e", + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + char: "\ud83c\udfaf", + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + char: "\ud83c\udfb2", + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + char: "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + char: "\ud83c\udfb0", + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + char: "\ud83e\udde9", + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + char: "\ud83c\udfb3", + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + char: "\ud83d\ude97", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + char: "\ud83d\ude95", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude99", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + char: "\ud83d\ude8c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + char: "\ud83d\ude8e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + char: "\ud83c\udfce", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + char: "\ud83d\ude93", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + char: "\ud83d\ude91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + char: "\ud83d\ude92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + char: "\ud83d\ude90", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + char: "\ud83d\ude9a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + char: "\ud83d\ude9b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + char: "\ud83d\ude9c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + char: "\ud83d\udef4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + char: "\ud83c\udfcd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + char: "\ud83d\udeb2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + char: "\ud83d\udef5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + char: "\ud83d\udea8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + char: "\ud83d\ude94", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + char: "\ud83d\ude8d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + char: "\ud83d\ude98", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + char: "\ud83d\ude96", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: "\ud83d\udea1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: "\ud83d\udea0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + char: "\ud83d\ude9f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude83", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + char: "\ud83d\ude8b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude9d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude84", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + char: "\ud83d\ude85", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude88", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude9e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + char: "\ud83d\ude82", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + char: "\ud83d\ude87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude8a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + char: "\ud83d\ude89", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + char: "\ud83d\udef8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + char: "\ud83d\ude81", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + char: "\ud83d\udee9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + char: "\u2708\ufe0f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + char: "\ud83d\udeeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + char: "\ud83d\udeec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + char: "\u26f5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + char: "\ud83d\udee5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + char: "\ud83d\udea4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + char: "\u26f4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + char: "\ud83d\udef3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + char: "\ud83d\ude80", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + char: "\ud83d\udef0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + char: "\ud83d\udcba", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + char: "\ud83d\udef6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + char: "\u2693", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + char: "\ud83d\udea7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + char: "\u26fd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + char: "\ud83d\ude8f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + char: "\ud83d\udea6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + char: "\ud83d\udea5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + char: "\ud83c\udfc1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + char: "\ud83d\udea2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + char: "\ud83c\udfa1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + char: "\ud83c\udfa2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + char: "\ud83c\udfa0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + char: "\ud83c\udfd7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + char: "\ud83c\udf01", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + char: "\ud83d\uddfc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + char: "\ud83c\udfed", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + char: "\u26f2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + char: "\ud83c\udf91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + char: "\u26f0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + char: "\ud83c\udfd4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + char: "\ud83d\uddfb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + char: "\ud83c\udf0b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + char: "\ud83d\uddfe", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + char: "\ud83c\udfd5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + char: "\u26fa", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + char: "\ud83c\udfde", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + char: "\ud83d\udee3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + char: "\ud83d\udee4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + char: "\ud83c\udf05", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + char: "\ud83c\udf04", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + char: "\ud83c\udfdc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + char: "\ud83c\udfd6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + char: "\ud83c\udfdd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + char: "\ud83c\udf07", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + char: "\ud83c\udf06", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + char: "\ud83c\udfd9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + char: "\ud83c\udf03", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + char: "\ud83c\udf09", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + char: "\ud83c\udf0c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + char: "\ud83c\udf20", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + char: "\ud83c\udf87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + char: "\ud83c\udf86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + char: "\ud83c\udf08", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + char: "\ud83c\udfd8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + char: "\ud83c\udff0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + char: "\ud83c\udfef", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + char: "\ud83c\udfdf", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + char: "\ud83d\uddfd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + char: "\ud83c\udfe0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + char: "\ud83c\udfe1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + char: "\ud83c\udfda", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + char: "\ud83c\udfe2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + char: "\ud83c\udfec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + char: "\ud83c\udfe3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + char: "\ud83c\udfe4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + char: "\ud83c\udfe5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + char: "\ud83c\udfe6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + char: "\ud83c\udfe8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + char: "\ud83c\udfea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + char: "\ud83c\udfeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + char: "\ud83c\udfe9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + char: "\ud83d\udc92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + char: "\ud83c\udfdb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + char: "\u26ea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + char: "\ud83d\udd4c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + char: "\ud83d\udd4d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + char: "\ud83d\udd4b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + char: "\u26e9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + char: "\u231a", + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + char: "\ud83d\udcf1", + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + char: "\ud83d\udcf2", + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + char: "\ud83d\udcbb", + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + char: "\u2328", + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + char: "\ud83d\udda5", + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + char: "\ud83d\udda8", + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + char: "\ud83d\uddb1", + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + char: "\ud83d\uddb2", + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + char: "\ud83d\udd79", + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + char: "\ud83d\udddc", + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + char: "\ud83d\udcbd", + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + char: "\ud83d\udcbe", + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + char: "\ud83d\udcbf", + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + char: "\ud83d\udcc0", + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + char: "\ud83d\udcfc", + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + char: "\ud83d\udcf7", + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + char: "\ud83d\udcf8", + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + char: "\ud83d\udcf9", + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + char: "\ud83c\udfa5", + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + char: "\ud83d\udcfd", + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + char: "\ud83c\udf9e", + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + char: "\ud83d\udcde", + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + char: "\u260e\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + char: "\ud83d\udcdf", + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + char: "\ud83d\udce0", + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + char: "\ud83d\udcfa", + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + char: "\ud83d\udcfb", + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + char: "\ud83c\udf99", + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + char: "\ud83c\udf9a", + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + char: "\ud83c\udf9b", + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + char: "\ud83e\udded", + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + char: "\u23f1", + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + char: "\u23f2", + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + char: "\u23f0", + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + char: "\ud83d\udd70", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + char: "\u23f3", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + char: "\u231b", + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + char: "\ud83d\udce1", + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + char: "\ud83d\udd0b", + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + char: "\ud83d\udd0c", + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + char: "\ud83d\udca1", + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + char: "\ud83d\udd26", + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + char: "\ud83d\udd6f", + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + char: "\ud83e\uddef", + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + char: "\ud83d\uddd1", + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + char: "\ud83d\udee2", + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + char: "\ud83d\udcb8", + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + char: "\ud83d\udcb5", + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + char: "\ud83d\udcb4", + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + char: "\ud83d\udcb6", + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + char: "\ud83d\udcb7", + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + char: "\ud83d\udcb0", + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + char: "\ud83d\udcb3", + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + char: "\ud83d\udc8e", + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + char: "\u2696", + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + char: "\ud83e\uddf0", + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + char: "\ud83d\udd27", + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + char: "\ud83d\udd28", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + char: "\u2692", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + char: "\ud83d\udee0", + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + char: "\u26cf", + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + char: "\ud83d\udd29", + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + char: "\u2699", + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + char: "\ud83e\uddf1", + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + char: "\u26d3", + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + char: "\ud83e\uddf2", + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + char: "\ud83d\udd2b", + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + char: "\ud83d\udca3", + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + char: "\ud83e\udde8", + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + char: "\ud83d\udd2a", + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + char: "\ud83d\udde1", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + char: "\u2694", + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + char: "\ud83d\udee1", + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + char: "\ud83d\udeac", + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + char: "\u2620", + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + char: "\u26b0", + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + char: "\u26b1", + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + char: "\ud83c\udffa", + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + char: "\ud83d\udd2e", + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + char: "\ud83d\udcff", + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + char: "\ud83e\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + char: "\ud83d\udc88", + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + char: "\u2697", + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + char: "\ud83d\udd2d", + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + char: "\ud83d\udd2c", + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + char: "\ud83d\udd73", + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + char: "\ud83d\udc8a", + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + char: "\ud83d\udc89", + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + char: "\ud83e\uddec", + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + char: "\ud83e\udda0", + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + char: "\ud83e\uddeb", + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + char: "\ud83e\uddea", + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + char: "\ud83c\udf21", + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + char: "\ud83e\uddf9", + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + char: "\ud83e\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + char: "\ud83e\uddfb", + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + char: "\ud83c\udff7", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + char: "\ud83d\udd16", + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + char: "\ud83d\udebd", + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + char: "\ud83d\udebf", + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + char: "\ud83d\udec1", + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + char: "\ud83e\uddfc", + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + char: "\ud83e\uddfd", + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + char: "\ud83e\uddf4", + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + char: "\ud83d\udd11", + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + char: "\ud83d\udddd", + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + char: "\ud83d\udecb", + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + char: "\ud83d\udecc", + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + char: "\ud83d\udecf", + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + char: "\ud83d\udeaa", + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + char: "\ud83d\udece", + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + char: "\ud83e\uddf8", + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + char: "\ud83d\uddbc", + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + char: "\ud83d\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + char: "\u26f1", + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + char: "\ud83d\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + char: "\ud83d\udecd", + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + char: "\ud83d\uded2", + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + char: "\ud83c\udf88", + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + char: "\ud83c\udf8f", + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + char: "\ud83c\udf80", + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + char: "\ud83c\udf81", + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + char: "\ud83c\udf8a", + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + char: "\ud83c\udf89", + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + char: "\ud83c\udf8e", + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + char: "\ud83c\udf90", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + char: "\ud83c\udf8c", + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + char: "\ud83c\udfee", + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + char: "\ud83e\udde7", + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + char: "\u2709\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + char: "\ud83d\udce9", + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + char: "\ud83d\udce8", + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + char: "\ud83d\udce7", + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + char: "\ud83d\udc8c", + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + char: "\ud83d\udcee", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + char: "\ud83d\udcea", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + char: "\ud83d\udceb", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + char: "\ud83d\udcec", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + char: "\ud83d\udced", + fitzpatrick_scale: false, + category: "objects" + }, + package: { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + char: "\ud83d\udce6", + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + char: "\ud83d\udcef", + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + char: "\ud83d\udce5", + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + char: "\ud83d\udce4", + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + char: "\ud83d\udcdc", + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + char: "\ud83d\udcc3", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + char: "\ud83d\udcd1", + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + char: "\ud83e\uddfe", + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + char: "\ud83d\udcca", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + char: "\ud83d\udcc8", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + char: "\ud83d\udcc9", + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + char: "\ud83d\udcc4", + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + char: "\ud83d\udcc5", + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + char: "\ud83d\udcc6", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + char: "\ud83d\uddd3", + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + char: "\ud83d\udcc7", + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + char: "\ud83d\uddc3", + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + char: "\ud83d\uddf3", + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + char: "\ud83d\uddc4", + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + char: "\ud83d\udccb", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + char: "\ud83d\uddd2", + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + char: "\ud83d\udcc1", + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + char: "\ud83d\udcc2", + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + char: "\ud83d\uddc2", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + char: "\ud83d\uddde", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + char: "\ud83d\udcf0", + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + char: "\ud83d\udcd3", + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + char: "\ud83d\udcd5", + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + char: "\ud83d\udcd7", + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + char: "\ud83d\udcd8", + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + char: "\ud83d\udcd9", + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + char: "\ud83d\udcd4", + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + char: "\ud83d\udcd2", + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + char: "\ud83d\udcda", + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + char: "\ud83d\udcd6", + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + char: "\ud83e\uddf7", + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + char: "\ud83d\udd17", + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + char: "\ud83d\udcce", + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + char: "\ud83d\udd87", + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + char: "\u2702\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + char: "\ud83d\udcd0", + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + char: "\ud83d\udccf", + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + char: "\ud83e\uddee", + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + char: "\ud83d\udccc", + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + char: "\ud83d\udccd", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + char: "\ud83d\udea9", + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + char: "\ud83c\udff3", + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + char: "\ud83c\udff4", + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + char: "\ud83c\udff3\ufe0f\u200d\ud83c\udf08", + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + char: "\ud83d\udd10", + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + char: "\ud83d\udd12", + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + char: "\ud83d\udd13", + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + char: "\ud83d\udd0f", + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + char: "\ud83d\udd8a", + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + char: "\ud83d\udd8b", + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + char: "\u2712\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + char: "\ud83d\udcdd", + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + char: "\u270f\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + char: "\ud83d\udd8d", + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + char: "\ud83d\udd8c", + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + char: "\ud83d\udd0d", + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + char: "\ud83d\udd0e", + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + char: "\u2764\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83e\udde1", + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9b", + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9a", + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc99", + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9c", + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + char: "\ud83d\udda4", + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + char: "\ud83d\udc94", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + char: "\u2763", + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + char: "\ud83d\udc95", + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9e", + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + char: "\ud83d\udc93", + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + char: "\ud83d\udc97", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc96", + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + char: "\ud83d\udc98", + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + char: "\ud83d\udc9d", + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + char: "\ud83d\udc9f", + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + char: "\u262e", + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + char: "\u271d", + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + char: "\u262a", + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: "\ud83d\udd49", + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: "\u2638", + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + char: "\u2721", + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + char: "\ud83d\udd2f", + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + char: "\ud83d\udd4e", + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + char: "\u262f", + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + char: "\u2626", + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + char: "\ud83d\uded0", + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + char: "\u26ce", + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u2648", + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: "\u2649", + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u264a", + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u264b", + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u264c", + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u264d", + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u264e", + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + char: "\u264f", + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u2650", + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u2651", + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u2652", + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: "\u2653", + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + char: "\ud83c\udd94", + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + char: "\u269b", + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + char: "\ud83c\ude33", + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + char: "\ud83c\ude39", + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + char: "\u2622", + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + char: "\u2623", + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + char: "\ud83d\udcf4", + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + char: "\ud83d\udcf3", + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + char: "\ud83c\ude36", + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + char: "\ud83c\ude1a", + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + char: "\ud83c\ude38", + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + char: "\ud83c\ude3a", + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + char: "\ud83c\ude37\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + char: "\u2734\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + char: "\ud83c\udd9a", + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + char: "\ud83c\ude51", + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + char: "\ud83d\udcae", + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + char: "\ud83c\ude50", + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + char: "\u3299\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + char: "\u3297\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + char: "\ud83c\ude34", + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + char: "\ud83c\ude35", + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + char: "\ud83c\ude32", + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + char: "\ud83c\udd70\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + char: "\ud83c\udd71\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + char: "\ud83c\udd8e", + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + char: "\ud83c\udd91", + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + char: "\ud83c\udd7e\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + char: "\ud83c\udd98", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + char: "\u26d4", + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + char: "\ud83d\udcdb", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + char: "\ud83d\udeab", + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + char: "\u274c", + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + char: "\u2b55", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + char: "\ud83d\uded1", + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + char: "\ud83d\udca2", + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + char: "\u2668\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + char: "\ud83d\udeb7", + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + char: "\ud83d\udeaf", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + char: "\ud83d\udeb3", + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + char: "\ud83d\udeb1", + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + char: "\ud83d\udd1e", + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + char: "\ud83d\udcf5", + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + char: "\u2757", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + char: "\u2755", + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + char: "\u2753", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + char: "\u2754", + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + char: "\u203c\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + char: "\u2049\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + 100: { + keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ], + char: "\ud83d\udcaf", + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + char: "\ud83d\udd05", + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + char: "\ud83d\udd06", + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + char: "\ud83d\udd31", + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + char: "\u269c", + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + char: "\u303d\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + char: "\u26a0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + char: "\ud83d\udeb8", + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + char: "\ud83d\udd30", + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + char: "\u267b\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + char: "\ud83c\ude2f", + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + char: "\ud83d\udcb9", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + char: "\u2747\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + char: "\u2733\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + char: "\u274e", + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + char: "\u2705", + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + char: "\ud83d\udca0", + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + char: "\ud83c\udf00", + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + char: "\u27bf", + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + char: "\ud83c\udf10", + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + char: "\u24c2\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + char: "\ud83c\udfe7", + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + char: "\ud83c\ude02\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + char: "\ud83d\udec2", + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + char: "\ud83d\udec3", + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + char: "\ud83d\udec4", + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + char: "\ud83d\udec5", + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + char: "\u267f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + char: "\ud83d\udead", + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + char: "\ud83d\udebe", + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + char: "\ud83c\udd7f\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + char: "\ud83d\udeb0", + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + char: "\ud83d\udeb9", + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + char: "\ud83d\udeba", + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + char: "\ud83d\udebc", + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + char: "\ud83d\udebb", + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + char: "\ud83d\udeae", + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + char: "\ud83c\udfa6", + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + char: "\ud83d\udcf6", + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + char: "\ud83c\ude01", + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + char: "\ud83c\udd96", + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + char: "\ud83c\udd97", + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + char: "\ud83c\udd99", + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + char: "\ud83c\udd92", + fitzpatrick_scale: false, + category: "symbols" + }, + new: { + keywords: [ "blue-square", "words", "start" ], + char: "\ud83c\udd95", + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + char: "\ud83c\udd93", + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + char: "0\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + char: "1\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + char: "2\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + char: "3\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + char: "4\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + char: "5\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + char: "6\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + char: "7\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + char: "8\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + char: "9\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + char: "\ud83d\udd1f", + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + char: "*\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + char: "\ud83d\udd22", + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + char: "\u23cf\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + char: "\u25b6\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + char: "\u23f8", + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + char: "\u23ed", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + char: "\u23f9", + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + char: "\u23fa", + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + char: "\u23ef", + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + char: "\u23ee", + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + char: "\u23e9", + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + char: "\u23ea", + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + char: "\ud83d\udd00", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + char: "\ud83d\udd01", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + char: "\ud83d\udd02", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + char: "\u25c0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + char: "\ud83d\udd3c", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\ud83d\udd3d", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + char: "\u23eb", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\u23ec", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + char: "\u27a1\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + char: "\u2b05\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + char: "\u2b06\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\u2b07\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + char: "\u2197\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + char: "\u2198\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + char: "\u2199\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + char: "\u2196\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + char: "\u2195\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + char: "\u2194\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + char: "\ud83d\udd04", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + char: "\u21aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + char: "\u21a9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + char: "\u2934\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\u2935\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + char: "#\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + char: "\u2139\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + char: "\ud83d\udd24", + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + char: "\ud83d\udd21", + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + char: "\ud83d\udd20", + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + char: "\ud83d\udd23", + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + char: "\ud83c\udfb5", + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + char: "\ud83c\udfb6", + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + char: "\u3030\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + char: "\u27b0", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + char: "\u2714\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + char: "\ud83d\udd03", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + char: "\u2795", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + char: "\u2796", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + char: "\u2797", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + char: "\u2716\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + char: "\u267e", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + char: "\ud83d\udcb2", + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + char: "\ud83d\udcb1", + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + char: "\xa9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + char: "\xae\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + char: "\u2122\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + char: "\ud83d\udd1a", + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + char: "\ud83d\udd19", + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + char: "\ud83d\udd1b", + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + char: "\ud83d\udd1d", + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + char: "\ud83d\udd1c", + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + char: "\u2611\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + char: "\ud83d\udd18", + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + char: "\u26aa", + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + char: "\u26ab", + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + char: "\ud83d\udd34", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + char: "\ud83d\udd35", + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd38", + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd39", + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd36", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd37", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + char: "\ud83d\udd3a", + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + char: "\u25aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + char: "\u25ab\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + char: "\u2b1b", + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + char: "\u2b1c", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + char: "\ud83d\udd3b", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + char: "\u25fc\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + char: "\u25fb\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + char: "\u25fe", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + char: "\u25fd", + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + char: "\ud83d\udd32", + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + char: "\ud83d\udd33", + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + char: "\ud83d\udd08", + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + char: "\ud83d\udd09", + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + char: "\ud83d\udd0a", + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + char: "\ud83d\udd07", + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + char: "\ud83d\udce3", + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + char: "\ud83d\udce2", + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + char: "\ud83d\udd14", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + char: "\ud83d\udd15", + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + char: "\ud83c\udccf", + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + char: "\ud83c\udc04", + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + char: "\u2660\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: "\u2663\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: "\u2665\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: "\u2666\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + char: "\ud83c\udfb4", + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + char: "\ud83d\udcad", + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + char: "\ud83d\uddef", + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + char: "\ud83d\udcac", + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + char: "\ud83d\udde8", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd50", + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd51", + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd52", + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd53", + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd54", + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + char: "\ud83d\udd55", + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd56", + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd57", + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd58", + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd59", + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5a", + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + char: "\ud83d\udd5b", + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5c", + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5d", + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5e", + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5f", + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd60", + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd61", + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd62", + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd63", + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd64", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd65", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd66", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd67", + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + char: "\ud83c\udde8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + char: "\ud83c\uddea\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + char: "\ud83c\uddeb\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfd\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfe\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf4\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf6\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfc\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddff\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + char: "\ud83c\uddec\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfc\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfe\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddff\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddff\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + char: "\ud83c\uddfa\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + char: "\ud83c\udff4\u200d\u2620\ufe0f", + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojis.min.js b/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojis.min.js new file mode 100644 index 000000000..42cea9ab4 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/emoticons/js/emojis.min.js @@ -0,0 +1,2 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"\ud83d\ude00",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"\ud83d\ude2c",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"\ud83d\ude01",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"\ud83d\ude02",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"\ud83e\udd23",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"\ud83e\udd73",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"\ud83d\ude03",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"\ud83d\ude04",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"\ud83d\ude05",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"\ud83d\ude06",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"\ud83d\ude07",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"\ud83d\ude09",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"\ud83d\ude0a",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"\ud83d\ude42",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"\ud83d\ude43",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"\ud83d\ude0b",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"\ud83d\ude0c",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"\ud83d\ude0d",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"\ud83e\udd70",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude18",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"\ud83d\ude17",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"\ud83d\ude19",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude1a",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"\ud83d\ude1c",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"\ud83e\udd2a",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"\ud83e\udd28",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"\ud83e\uddd0",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"\ud83d\ude1d",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"\ud83d\ude1b",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"\ud83e\udd11",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"\ud83e\udd13",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"\ud83d\ude0e",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"\ud83e\udd29",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:"\ud83e\udd21",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"\ud83e\udd20",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:"\ud83e\udd17",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"\ud83d\ude0f",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"\ud83d\ude36",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"\ud83d\ude10",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"\ud83d\ude11",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"\ud83d\ude12",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"\ud83d\ude44",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"\ud83e\udd14",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"\ud83e\udd25",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"\ud83e\udd2d",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"\ud83e\udd2b",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"\ud83e\udd2c",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"\ud83e\udd2f",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"\ud83d\ude33",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"\ud83d\ude1e",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"\ud83d\ude1f",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"\ud83d\ude20",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"\ud83d\ude21",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"\ud83d\ude14",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"\ud83d\ude15",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"\ud83d\ude41",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"\ud83d\ude23",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"\ud83d\ude16",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"\ud83d\ude2b",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"\ud83d\ude29",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"\ud83e\udd7a",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"\ud83d\ude24",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"\ud83d\ude2e",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"\ud83d\ude31",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"\ud83d\ude28",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"\ud83d\ude30",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:"\ud83d\ude2f",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:"\ud83d\ude26",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"\ud83d\ude27",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"\ud83d\ude22",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"\ud83d\ude25",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:"\ud83e\udd24",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"\ud83d\ude2a",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"\ud83d\ude13",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"\ud83e\udd75",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"\ud83e\udd76",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"\ud83d\ude2d",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"\ud83d\ude35",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"\ud83d\ude32",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"\ud83e\udd10",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"\ud83e\udd22",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"\ud83e\udd27",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:"\ud83e\udd2e",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"\ud83d\ude37",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"\ud83e\udd12",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"\ud83e\udd15",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"\ud83e\udd74",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"\ud83d\ude34",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"\ud83d\udca4",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"\ud83d\udca9",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"\ud83d\ude08",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:"\ud83d\udc7f",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"\ud83d\udc79",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"\ud83d\udc7a",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"\ud83d\udc80",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"\ud83d\udc7b",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"\ud83d\udc7d",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:"\ud83e\udd16",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"\ud83d\ude3a",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"\ud83d\ude38",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"\ud83d\ude39",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"\ud83d\ude3b",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"\ud83d\ude3c",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"\ud83d\ude3d",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"\ud83d\ude40",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"\ud83d\ude3f",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"\ud83d\ude3e",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"\ud83e\udd32",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"\ud83d\ude4c",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"\ud83d\udc4f",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"\ud83d\udc4b",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"\ud83e\udd19",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"\ud83d\udc4d",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"\ud83d\udc4e",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"\ud83d\udc4a",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"\ud83e\udd1b",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"\ud83e\udd1c",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"\ud83d\udc4c",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"\ud83e\udd1a",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"\ud83d\udc50",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"\ud83d\udcaa",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"\ud83d\ude4f",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:"\ud83e\uddb6",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:"\ud83e\uddb5",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:"\ud83e\udd1d",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"\ud83d\udc46",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"\ud83d\udc47",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"\ud83d\udc48",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"\ud83d\udc49",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"\ud83d\udd95",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"\ud83d\udd90",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"\ud83e\udd1f",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"\ud83e\udd18",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"\ud83e\udd1e",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"\ud83d\udd96",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:"\ud83e\udd33",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"\ud83d\udc85",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:"\ud83d\udc44",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:"\ud83e\uddb7",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:"\ud83d\udc45",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"\ud83d\udc42",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:"\ud83d\udc43",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"\ud83d\udc41",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"\ud83d\udc40",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:"\ud83e\udde0",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"\ud83d\udc64",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"\ud83d\udc65",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"\ud83d\udde3",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"\ud83d\udc76",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:"\ud83e\uddd2",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"\ud83d\udc66",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:"\ud83d\udc67",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:"\ud83e\uddd1",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"\ud83d\udc68",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:"\ud83d\udc69",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"\ud83d\udc71\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"\ud83d\udc71",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"\ud83e\uddd4",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"\ud83e\uddd3",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"\ud83d\udc74",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"\ud83d\udc75",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"\ud83d\udc72",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"\ud83e\uddd5",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"\ud83d\udc73\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"\ud83d\udc73",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"\ud83d\udc6e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"\ud83d\udc6e",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"\ud83d\udc77\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"\ud83d\udc77",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"\ud83d\udc82\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"\ud83d\udc82",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"\ud83d\udd75\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"\ud83d\udd75",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"\ud83d\udc69\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"\ud83d\udc68\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"\ud83d\udc69\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"\ud83d\udc68\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"\ud83d\udc68\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"\ud83d\udc69\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"\ud83d\udc68\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"\ud83d\udc68\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"\ud83d\udc69\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"\ud83d\udc68\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"\ud83d\udc69\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"\ud83d\udc68\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"\ud83e\uddb8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"\ud83e\uddb8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"\ud83e\uddb9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"\ud83e\uddb9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"\ud83e\udd36",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"\ud83c\udf85",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"\ud83e\uddd9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"\ud83e\uddd9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:"\ud83e\udddd\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:"\ud83e\udddd\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:"\ud83e\udddb\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"\ud83e\udddb\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"\ud83e\udddf\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"\ud83e\udddf\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:"\ud83e\uddde\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:"\ud83e\uddde\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"\ud83e\udddc\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:"\ud83e\udddc\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:"\ud83e\uddda\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:"\ud83e\uddda\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"\ud83d\udc7c",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:"\ud83e\udd30",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"\ud83e\udd31",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"\ud83d\udc78",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"\ud83e\udd34",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"\ud83d\udc70",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"\ud83e\udd35",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"\ud83c\udfc3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"\ud83c\udfc3",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"\ud83d\udeb6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"\ud83d\udeb6",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"\ud83d\udc83",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"\ud83d\udd7a",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"\ud83d\udc6f",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"\ud83d\udc6f\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"\ud83d\udc6b",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"\ud83d\udc6c",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"\ud83d\udc6d",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"\ud83d\ude47\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"\ud83d\ude47",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"\ud83e\udd26\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"\ud83e\udd26\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"\ud83e\udd37",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"\ud83e\udd37\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"\ud83d\udc81",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"\ud83d\udc81\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"\ud83d\ude45",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"\ud83d\ude45\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"\ud83d\ude46",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"\ud83d\ude46\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4b",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"\ud83d\ude4b\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4e",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"\ud83d\ude4e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"\ud83d\udc87",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"\ud83d\udc87\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"\ud83d\udc86",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"\ud83d\udc86\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc91",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc8f",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"\ud83d\udc6a",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"\ud83e\uddf6",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"\ud83e\uddf5",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:"\ud83e\udde5",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"\ud83e\udd7c",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"\ud83d\udc5a",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"\ud83d\udc55",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:"\ud83d\udc56",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"\ud83d\udc54",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"\ud83d\udc57",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"\ud83d\udc59",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"\ud83d\udc58",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"\ud83d\udc84",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"\ud83d\udc8b",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"\ud83d\udc63",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"\ud83e\udd7f",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"\ud83d\udc60",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"\ud83d\udc61",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:"\ud83d\udc62",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"\ud83d\udc5e",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"\ud83d\udc5f",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"\ud83e\udd7e",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:"\ud83e\udde6",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"\ud83e\udde4",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"\ud83e\udde3",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"\ud83d\udc52",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"\ud83c\udfa9",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"\ud83e\udde2",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"\ud83c\udf93",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"\ud83d\udc51",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"\ud83c\udf92",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:"\ud83e\uddf3",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"\ud83d\udc5d",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"\ud83d\udc5b",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"\ud83d\udc5c",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"\ud83d\udcbc",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"\ud83d\udc53",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"\ud83d\udd76",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"\ud83e\udd7d",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"\ud83d\udc8d",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"\ud83c\udf02",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"\ud83d\udc36",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"\ud83d\udc31",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"\ud83d\udc2d",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"\ud83d\udc39",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"\ud83d\udc30",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"\ud83e\udd8a",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"\ud83d\udc3b",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"\ud83d\udc3c",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"\ud83d\udc28",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"\ud83d\udc2f",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"\ud83e\udd81",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc2e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"\ud83d\udc37",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"\ud83d\udc3d",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"\ud83d\udc38",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"\ud83e\udd91",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"\ud83d\udc19",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"\ud83e\udd90",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"\ud83d\udc35",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"\ud83e\udd8d",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"\ud83d\ude48",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"\ud83d\ude49",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"\ud83d\ude4a",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"\ud83d\udc12",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"\ud83d\udc14",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"\ud83d\udc27",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"\ud83d\udc26",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"\ud83d\udc24",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"\ud83d\udc23",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"\ud83d\udc25",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"\ud83e\udd86",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"\ud83e\udd85",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"\ud83e\udd89",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"\ud83e\udd87",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"\ud83d\udc3a",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"\ud83d\udc17",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"\ud83d\udc34",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"\ud83e\udd84",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"\ud83d\udc1d",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"\ud83d\udc1b",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"\ud83e\udd8b",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"\ud83d\udc0c",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"\ud83d\udc1e",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"\ud83d\udc1c",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"\ud83e\udd97",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"\ud83d\udd77",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"\ud83e\udd82",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"\ud83e\udd80",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"\ud83d\udc0d",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"\ud83e\udd8e",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"\ud83e\udd96",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"\ud83e\udd95",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"\ud83d\udc22",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"\ud83d\udc20",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"\ud83d\udc1f",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"\ud83d\udc21",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"\ud83d\udc2c",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"\ud83e\udd88",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc33",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc0b",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"\ud83d\udc0a",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"\ud83d\udc06",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"\ud83e\udd93",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"\ud83d\udc05",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"\ud83d\udc03",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"\ud83d\udc02",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc04",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"\ud83e\udd8c",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"\ud83d\udc2a",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"\ud83d\udc2b",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"\ud83e\udd92",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"\ud83d\udc18",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"\ud83e\udd8f",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"\ud83d\udc10",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"\ud83d\udc0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"\ud83d\udc11",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"\ud83d\udc0e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"\ud83d\udc16",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"\ud83d\udc00",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"\ud83d\udc01",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"\ud83d\udc13",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"\ud83e\udd83",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"\ud83d\udd4a",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"\ud83d\udc15",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"\ud83d\udc29",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"\ud83d\udc08",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"\ud83d\udc07",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"\ud83d\udc3f",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"\ud83e\udd94",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"\ud83e\udd9d",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"\ud83e\udd99",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"\ud83e\udd9b",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"\ud83e\udd98",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"\ud83e\udda1",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"\ud83e\udda2",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"\ud83e\udd9a",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"\ud83e\udd9c",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"\ud83e\udd9e",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"\ud83e\udd9f",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"\ud83d\udc3e",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc09",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc32",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"\ud83c\udf35",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"\ud83c\udf84",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"\ud83c\udf32",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"\ud83c\udf33",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"\ud83c\udf34",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"\ud83c\udf31",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"\ud83c\udf3f",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"\ud83c\udf40",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"\ud83c\udf8d",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"\ud83c\udf8b",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"\ud83c\udf43",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"\ud83c\udf42",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"\ud83c\udf41",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"\ud83c\udf3e",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"\ud83c\udf3a",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"\ud83c\udf3b",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"\ud83c\udf39",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"\ud83e\udd40",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"\ud83c\udf37",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"\ud83c\udf3c",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"\ud83c\udf38",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"\ud83d\udc90",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"\ud83c\udf44",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"\ud83c\udf30",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"\ud83c\udf83",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"\ud83d\udc1a",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"\ud83d\udd78",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"\ud83c\udf0e",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"\ud83c\udf0d",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"\ud83c\udf0f",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf15",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"\ud83c\udf16",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf17",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf18",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf11",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf12",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf13",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"\ud83c\udf14",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1a",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1d",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1b",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1c",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"\ud83c\udf1e",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"\ud83c\udf19",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"\ud83c\udf1f",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"\ud83d\udcab",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"\ud83c\udf24",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"\ud83c\udf25",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"\ud83c\udf26",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"\ud83c\udf27",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"\ud83c\udf29",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"\ud83d\udd25",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"\ud83d\udca5",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"\ud83c\udf28",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"\ud83c\udf2c",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"\ud83d\udca8",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"\ud83c\udf2a",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:"\ud83c\udf2b",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"\ud83d\udca7",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"\ud83d\udca6",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"\ud83c\udf0a",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"\ud83c\udf4f",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"\ud83c\udf4e",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"\ud83c\udf50",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"\ud83c\udf4a",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"\ud83c\udf4b",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"\ud83c\udf4c",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"\ud83c\udf49",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"\ud83c\udf47",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"\ud83c\udf53",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"\ud83c\udf48",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"\ud83c\udf52",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"\ud83c\udf51",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"\ud83c\udf4d",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"\ud83e\udd65",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"\ud83e\udd5d",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"\ud83e\udd6d",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"\ud83e\udd51",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"\ud83e\udd66",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"\ud83c\udf45",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"\ud83c\udf46",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"\ud83e\udd52",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"\ud83e\udd55",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"\ud83c\udf36",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"\ud83e\udd54",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"\ud83c\udf3d",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"\ud83e\udd6c",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"\ud83c\udf60",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"\ud83e\udd5c",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"\ud83c\udf6f",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"\ud83e\udd50",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"\ud83c\udf5e",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"\ud83e\udd56",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"\ud83e\udd6f",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"\ud83e\udd68",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"\ud83e\uddc0",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"\ud83e\udd5a",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"\ud83e\udd53",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"\ud83e\udd69",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"\ud83e\udd5e",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"\ud83c\udf57",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"\ud83c\udf56",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"\ud83e\uddb4",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"\ud83c\udf64",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"\ud83c\udf73",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"\ud83c\udf54",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"\ud83c\udf5f",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"\ud83e\udd59",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"\ud83c\udf2d",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"\ud83c\udf55",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"\ud83e\udd6a",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"\ud83e\udd6b",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"\ud83c\udf5d",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"\ud83c\udf2e",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"\ud83c\udf2f",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"\ud83e\udd57",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"\ud83e\udd58",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"\ud83c\udf5c",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"\ud83c\udf72",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"\ud83c\udf65",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"\ud83e\udd60",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"\ud83c\udf63",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"\ud83c\udf71",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"\ud83c\udf5b",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"\ud83c\udf59",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"\ud83c\udf5a",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"\ud83c\udf58",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"\ud83c\udf62",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"\ud83c\udf61",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"\ud83c\udf67",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"\ud83c\udf68",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"\ud83c\udf66",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"\ud83e\udd67",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"\ud83c\udf70",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"\ud83e\uddc1",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"\ud83e\udd6e",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"\ud83c\udf82",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"\ud83c\udf6e",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"\ud83c\udf6c",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"\ud83c\udf6d",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"\ud83c\udf6b",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"\ud83c\udf7f",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"\ud83e\udd5f",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"\ud83c\udf69",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"\ud83c\udf6a",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"\ud83e\udd5b",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7a",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7b",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"\ud83e\udd42",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"\ud83c\udf77",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"\ud83e\udd43",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"\ud83c\udf78",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"\ud83c\udf79",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"\ud83c\udf7e",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"\ud83c\udf76",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"\ud83c\udf75",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"\ud83e\udd64",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"\ud83c\udf7c",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"\ud83e\uddc2",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"\ud83e\udd44",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"\ud83c\udf74",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"\ud83c\udf7d",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"\ud83e\udd63",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"\ud83e\udd61",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"\ud83e\udd62",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"\ud83c\udfc0",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"\ud83c\udfc8",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:"\ud83e\udd4e",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"\ud83c\udfbe",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:"\ud83c\udfd0",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:"\ud83c\udfc9",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"\ud83e\udd4f",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"\ud83c\udfb1",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:"\ud83c\udfcc",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"\ud83c\udfd3",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:"\ud83c\udff8",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:"\ud83e\udd45",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:"\ud83c\udfd2",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:"\ud83c\udfd1",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"\ud83e\udd4d",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:"\ud83c\udfcf",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"\ud83c\udfbf",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"\ud83c\udfc2",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"\ud83e\udd3a",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:"\ud83e\udd4c",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:"\ud83d\udef9",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"\ud83d\udef7",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"\ud83c\udff9",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"\ud83c\udfa3",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"\ud83e\udd4a",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"\ud83e\udd4b",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"\ud83d\udea3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"\ud83d\udea3",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"\ud83e\uddd7\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"\ud83e\uddd7\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"\ud83c\udfca\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"\ud83c\udfca",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"\ud83c\udfc4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"\ud83c\udfc4",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec0",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"\ud83c\udfcb",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"\ud83d\udeb4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"\ud83d\udeb4",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"\ud83d\udeb5\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"\ud83d\udeb5",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"\ud83c\udfc7",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"\ud83d\udd74",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"\ud83c\udfc6",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"\ud83c\udfbd",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:"\ud83c\udfc5",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"\ud83c\udf96",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"\ud83e\udd47",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"\ud83e\udd48",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"\ud83e\udd49",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"\ud83c\udf97",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"\ud83c\udff5",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"\ud83c\udfab",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"\ud83c\udf9f",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"\ud83c\udfad",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"\ud83c\udfa8",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"\ud83c\udfaa",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"\ud83c\udfa4",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"\ud83c\udfa7",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"\ud83c\udfbc",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"\ud83c\udfb9",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"\ud83e\udd41",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"\ud83c\udfb7",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:"\ud83c\udfba",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:"\ud83c\udfb8",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"\ud83c\udfbb",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:"\ud83c\udfac",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"\ud83c\udfae",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"\ud83d\udc7e",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"\ud83c\udfaf",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"\ud83c\udfb2",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"\ud83c\udfb0",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"\ud83e\udde9",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"\ud83c\udfb3",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"\ud83d\ude97",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"\ud83d\ude95",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude99",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude8c",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"\ud83d\ude8e",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"\ud83c\udfce",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"\ud83d\ude93",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"\ud83d\ude91",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"\ud83d\ude92",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"\ud83d\ude90",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"\ud83d\ude9a",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"\ud83d\ude9b",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"\ud83d\ude9c",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"\ud83d\udef4",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"\ud83c\udfcd",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"\ud83d\udeb2",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"\ud83d\udef5",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"\ud83d\udea8",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"\ud83d\ude94",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"\ud83d\ude8d",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude98",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"\ud83d\ude96",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea1",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea0",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"\ud83d\ude9f",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude83",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"\ud83d\ude8b",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"\ud83d\ude9d",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"\ud83d\ude84",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"\ud83d\ude85",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"\ud83d\ude88",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"\ud83d\ude9e",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"\ud83d\ude82",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"\ud83d\ude86",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"\ud83d\ude87",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"\ud83d\ude8a",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"\ud83d\ude89",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"\ud83d\udef8",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"\ud83d\ude81",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"\ud83d\udee9",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"\ud83d\udeeb",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"\ud83d\udeec",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"\ud83d\udee5",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"\ud83d\udea4",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"\ud83d\udef3",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"\ud83d\ude80",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"\ud83d\udef0",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"\ud83d\udcba",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"\ud83d\udef6",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"\ud83d\udea7",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"\ud83d\ude8f",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"\ud83d\udea6",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"\ud83d\udea5",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"\ud83c\udfc1",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"\ud83d\udea2",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"\ud83c\udfa1",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"\ud83c\udfa2",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"\ud83c\udfa0",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"\ud83c\udfd7",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"\ud83c\udf01",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"\ud83d\uddfc",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"\ud83c\udfed",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"\ud83c\udf91",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"\ud83c\udfd4",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"\ud83d\uddfb",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"\ud83c\udf0b",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"\ud83d\uddfe",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"\ud83c\udfd5",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"\ud83c\udfde",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"\ud83d\udee3",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"\ud83d\udee4",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"\ud83c\udf05",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"\ud83c\udf04",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"\ud83c\udfdc",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"\ud83c\udfd6",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"\ud83c\udfdd",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"\ud83c\udf07",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"\ud83c\udf06",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"\ud83c\udfd9",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"\ud83c\udf03",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"\ud83c\udf09",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"\ud83c\udf0c",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"\ud83c\udf20",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"\ud83c\udf87",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"\ud83c\udf86",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"\ud83c\udf08",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"\ud83c\udfd8",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"\ud83c\udff0",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"\ud83c\udfef",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"\ud83c\udfdf",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"\ud83d\uddfd",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:"\ud83c\udfe0",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"\ud83c\udfe1",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"\ud83c\udfda",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"\ud83c\udfe2",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"\ud83c\udfec",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"\ud83c\udfe3",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"\ud83c\udfe4",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"\ud83c\udfe5",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"\ud83c\udfe6",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"\ud83c\udfe8",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"\ud83c\udfea",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"\ud83c\udfeb",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"\ud83c\udfe9",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"\ud83d\udc92",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"\ud83c\udfdb",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"\ud83d\udd4c",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"\ud83d\udd4d",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"\ud83d\udd4b",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"\ud83d\udcf1",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:"\ud83d\udcf2",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"\ud83d\udcbb",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"\ud83d\udda5",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:"\ud83d\udda8",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:"\ud83d\uddb1",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"\ud83d\uddb2",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:"\ud83d\udd79",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:"\ud83d\udddc",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"\ud83d\udcbd",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"\ud83d\udcbe",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"\ud83d\udcbf",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"\ud83d\udcc0",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"\ud83d\udcfc",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:"\ud83d\udcf7",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"\ud83d\udcf8",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:"\ud83d\udcf9",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:"\ud83c\udfa5",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"\ud83d\udcfd",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:"\ud83c\udf9e",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"\ud83d\udcde",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"\ud83d\udcdf",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:"\ud83d\udce0",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"\ud83d\udcfa",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"\ud83d\udcfb",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"\ud83c\udf99",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:"\ud83c\udf9a",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:"\ud83c\udf9b",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"\ud83e\udded",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"\ud83d\udd70",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"\ud83d\udce1",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"\ud83d\udd0b",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:"\ud83d\udd0c",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"\ud83d\udca1",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"\ud83d\udd26",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:"\ud83d\udd6f",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"\ud83e\uddef",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"\ud83d\uddd1",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:"\ud83d\udee2",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"\ud83d\udcb8",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"\ud83d\udcb5",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"\ud83d\udcb4",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"\ud83d\udcb6",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"\ud83d\udcb7",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"\ud83d\udcb0",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"\ud83d\udcb3",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"\ud83d\udc8e",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"\ud83e\uddf0",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"\ud83d\udd27",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:"\ud83d\udd28",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"\ud83d\udee0",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"\ud83d\udd29",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:"\ud83e\uddf1",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"\ud83e\uddf2",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"\ud83d\udd2b",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"\ud83d\udca3",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"\ud83e\udde8",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"\ud83d\udd2a",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:"\ud83d\udde1",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:"\ud83d\udee1",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"\ud83d\udeac",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:"\ud83c\udffa",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"\ud83d\udd2e",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"\ud83d\udcff",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"\ud83e\uddff",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:"\ud83d\udc88",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"\ud83d\udd2d",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"\ud83d\udd2c",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:"\ud83d\udd73",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"\ud83d\udc8a",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"\ud83d\udc89",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"\ud83e\uddec",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"\ud83e\udda0",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"\ud83e\uddeb",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"\ud83e\uddea",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"\ud83c\udf21",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"\ud83e\uddf9",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:"\ud83e\uddfa",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:"\ud83e\uddfb",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:"\ud83c\udff7",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"\ud83d\udd16",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"\ud83d\udebd",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"\ud83d\udebf",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec1",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"\ud83e\uddfc",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"\ud83e\uddfd",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"\ud83e\uddf4",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:"\ud83d\udd11",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:"\ud83d\udddd",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"\ud83d\udecb",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"\ud83d\udecc",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:"\ud83d\udecf",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:"\ud83d\udeaa",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:"\ud83d\udece",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"\ud83e\uddf8",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:"\ud83d\uddbc",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:"\ud83d\uddfa",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"\ud83d\uddff",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"\ud83d\udecd",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:"\ud83d\uded2",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"\ud83c\udf88",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"\ud83c\udf8f",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"\ud83c\udf80",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"\ud83c\udf81",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"\ud83c\udf8a",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"\ud83c\udf89",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"\ud83c\udf8e",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"\ud83c\udf90",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"\ud83c\udf8c",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"\ud83c\udfee",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:"\ud83e\udde7",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"\ud83d\udce9",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"\ud83d\udce8",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"\ud83d\udce7",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"\ud83d\udc8c",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"\ud83d\udcee",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"\ud83d\udcea",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"\ud83d\udceb",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"\ud83d\udcec",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"\ud83d\udced",fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"\ud83d\udce6",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"\ud83d\udcef",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"\ud83d\udce5",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"\ud83d\udce4",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"\ud83d\udcdc",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"\ud83d\udcc3",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"\ud83d\udcd1",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"\ud83e\uddfe",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"\ud83d\udcca",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"\ud83d\udcc8",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"\ud83d\udcc9",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"\ud83d\udcc4",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:"\ud83d\udcc5",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"\ud83d\udcc6",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"\ud83d\uddd3",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:"\ud83d\udcc7",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"\ud83d\uddc3",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:"\ud83d\uddf3",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"\ud83d\uddc4",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"\ud83d\udccb",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"\ud83d\uddd2",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"\ud83d\udcc1",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"\ud83d\udcc2",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"\ud83d\uddc2",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"\ud83d\uddde",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:"\ud83d\udcf0",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"\ud83d\udcd3",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"\ud83d\udcd5",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"\ud83d\udcd7",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"\ud83d\udcd8",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"\ud83d\udcd9",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"\ud83d\udcd4",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:"\ud83d\udcd2",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:"\ud83d\udcda",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"\ud83d\udcd6",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:"\ud83e\uddf7",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:"\ud83d\udd17",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"\ud83d\udcce",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"\ud83d\udd87",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"\ud83d\udcd0",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"\ud83d\udccf",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:"\ud83e\uddee",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"\ud83d\udccc",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"\ud83d\udccd",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"\ud83d\udea9",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"\ud83c\udff3",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:"\ud83c\udff4",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"\ud83c\udff3\ufe0f\u200d\ud83c\udf08",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"\ud83d\udd10",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:"\ud83d\udd12",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:"\ud83d\udd13",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"\ud83d\udd0f",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8a",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8b",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"\ud83d\udcdd",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"\ud83d\udd8d",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"\ud83d\udd8c",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0d",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0e",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"\ud83e\udde1",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9b",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9a",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc99",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9c",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:"\ud83d\udda4",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"\ud83d\udc94",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"\ud83d\udc95",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9e",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"\ud83d\udc93",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"\ud83d\udc97",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc96",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"\ud83d\udc98",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"\ud83d\udc9d",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"\ud83d\udc9f",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\ud83d\udd49",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"\ud83d\udd2f",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"\ud83d\udd4e",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"\ud83d\uded0",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:"\ud83c\udd94",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"\ud83c\ude33",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"\ud83c\ude39",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"\ud83d\udcf4",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"\ud83d\udcf3",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"\ud83c\ude36",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"\ud83c\ude1a",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"\ud83c\ude38",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"\ud83c\ude3a",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"\ud83c\ude37\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:"\ud83c\udd9a",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"\ud83c\ude51",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"\ud83d\udcae",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"\ud83c\ude50",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"\ud83c\ude34",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"\ud83c\ude35",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"\ud83c\ude32",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd70\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd71\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"\ud83c\udd8e",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"\ud83c\udd91",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"\ud83c\udd7e\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"\ud83c\udd98",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"\ud83d\udcdb",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"\ud83d\udeab",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:"\ud83d\uded1",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:"\ud83d\udca2",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"\ud83d\udeb7",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"\ud83d\udeaf",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"\ud83d\udeb3",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"\ud83d\udeb1",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"\ud83d\udd1e",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"\ud83d\udcf5",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"\ud83d\udcaf",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"\ud83d\udd05",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"\ud83d\udd06",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:"\ud83d\udd31",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"\ud83d\udeb8",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:"\ud83d\udd30",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"\ud83c\ude2f",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"\ud83d\udcb9",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"\ud83d\udca0",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"\ud83c\udf00",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"\ud83c\udf10",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"\ud83c\udfe7",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"\ud83c\ude02\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"\ud83d\udec2",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"\ud83d\udec3",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"\ud83d\udec4",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"\ud83d\udec5",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"\ud83d\udead",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"\ud83d\udebe",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"\ud83c\udd7f\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"\ud83d\udeb0",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"\ud83d\udeb9",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"\ud83d\udeba",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"\ud83d\udebc",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"\ud83d\udebb",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"\ud83d\udeae",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"\ud83c\udfa6",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"\ud83d\udcf6",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"\ud83c\ude01",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"\ud83c\udd96",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"\ud83c\udd97",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"\ud83c\udd99",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:"\ud83c\udd92",fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"\ud83c\udd95",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:"\ud83c\udd93",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"\ud83d\udd1f",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"\ud83d\udd22",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"\ud83d\udd00",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:"\ud83d\udd01",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"\ud83d\udd02",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"\ud83d\udd3c",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"\ud83d\udd3d",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"\ud83d\udd04",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"\ud83d\udd24",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"\ud83d\udd21",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"\ud83d\udd20",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"\ud83d\udd23",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"\ud83c\udfb5",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:"\ud83c\udfb6",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"\ud83d\udd03",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"\ud83d\udcb2",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"\ud83d\udcb1",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:"\ud83d\udd1a",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:"\ud83d\udd19",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:"\ud83d\udd1b",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:"\ud83d\udd1d",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:"\ud83d\udd1c",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"\ud83d\udd18",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"\ud83d\udd34",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"\ud83d\udd35",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd38",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd39",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd36",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd37",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"\ud83d\udd3a",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"\ud83d\udd3b",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"\ud83d\udd32",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"\ud83d\udd33",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"\ud83d\udd08",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"\ud83d\udd09",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"\ud83d\udd0a",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"\ud83d\udd07",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"\ud83d\udce3",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"\ud83d\udce2",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"\ud83d\udd14",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"\ud83d\udd15",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"\ud83c\udccf",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"\ud83c\udc04",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"\ud83c\udfb4",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"\ud83d\udcad",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"\ud83d\uddef",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"\ud83d\udcac",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"\ud83d\udde8",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"\ud83d\udd50",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"\ud83d\udd51",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"\ud83d\udd52",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"\ud83d\udd53",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"\ud83d\udd54",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"\ud83d\udd55",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"\ud83d\udd56",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"\ud83d\udd57",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"\ud83d\udd58",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"\ud83d\udd59",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5a",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"\ud83d\udd5b",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5c",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5d",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5e",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5f",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"\ud83d\udd60",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"\ud83d\udd61",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"\ud83d\udd62",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"\ud83d\udd63",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"\ud83d\udd64",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"\ud83d\udd65",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd66",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd67",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"\ud83c\udde8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"\ud83c\uddea\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"\ud83c\uddeb\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"\ud83c\udde9\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"\ud83c\uddef\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"\ud83c\uddfd\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"\ud83c\uddf4\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"\ud83c\uddf6\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"\ud83c\uddec\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"\ud83c\uddfa\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"\ud83c\udff4\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/emoticons/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 000000000..fbff5713f --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function r(){}function i(t){return function(){return t}}function t(t){return t}function n(){return c}var m,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=i(!1),a=i(!(m=null)),c={fold:function(t,n){return t()},isSome:l,isNone:a,getOr:t,getOrThunk:o,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:o,map:n,each:r,bind:n,exists:l,forall:a,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function o(t){return t()}function g(t){var n=t;return{get:function(){return n},set:function(t){n=t}}}function d(t,n){for(var e=k(t),o=0,r=e.length;o=(a="Could not load emoticons

    "}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(S),f.unblock()}))}function b(t){t.on("PreInit",function(){t.parser.addAttributeFilter("data-emoticon",function(t){!function(t){for(var n,e=0,o=t.length;e"),(r=c.getAll("title")[0])&&r.firstChild&&(s.title=r.firstChild.value),w.each(c.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?s[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(s.docencoding=t[1])}),(r=c.getAll("html")[0])&&(s.langcode=d(r,"lang")||d(r,"xml:lang")),s.stylesheets=[],w.each(c.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&s.stylesheets.push(e.attr("href"))}),(r=c.getAll("body")[0])&&(s.langdir=d(r,"dir"),s.style=d(r,"style"),s.visited_color=d(r,"vlink"),s.link_color=d(r,"link"),s.active_color=d(r,"alink")),o=s,e=g(g({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),o),l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:e,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){function n(e,t,n){e.attr(t,n||void 0)}function r(e){s.firstChild?s.insert(e,s.firstChild):s.append(e)}var a,l,i=e.dom,c=C(e,t),s=c.getAll("head")[0];s||(a=c.getAll("html")[0],s=new f("head",1),a.firstChild?a.insert(s,a.firstChild,!0):a.append(s)),a=c.firstChild,o.xml_pi?(l='version="1.0"',o.docencoding&&(l+=' encoding="'+o.docencoding+'"'),7!==a.type&&(a=new f("xml",7),c.insert(a,c.firstChild,!0)),a.value=l):a&&7===a.type&&a.remove(),a=c.getAll("#doctype")[0],o.doctype?(a||(a=new f("#doctype",10),o.xml_pi?c.insert(a,c.firstChild):r(a)),a.value=o.doctype.substring(9,o.doctype.length-1)):a&&a.remove(),a=null,w.each(c.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(a=e)}),o.docencoding?(a||((a=new f("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,r(a)),a.attr("content","text/html; charset="+o.docencoding)):a&&a.remove(),a=c.getAll("title")[0],o.title?(a?a.empty():r(a=new f("title",1)),a.append(new f("#text",3)).value=o.title):a&&a.remove(),w.each("keywords,description,author,copyright,robots".split(","),function(e){for(var t,n=c.getAll("meta"),l=o[e],i=0;i"))}(l,w.extend(o,t),i.get());i.set(n),e.close()}})})}function A(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})}function s(e,t,n,l){var i,o,r,a,c,s,d,u,m,g,f,p,h,y="",v=e.dom;l.selection||(a=e.getParam("protect"),c=l.content,w.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=c,"raw"===l.format&&t.get()||l.source_view&&_(e)||(-1!==(i=(r=(r=0!==r.length||l.source_view?r:w.trim(t.get())+"\n"+w.trim(r)+"\n"+w.trim(n.get())).replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(A(r.substring(0,i+1))),-1===(o=r.indexOf("\n'),p+=g.getParam("fullpage_default_doctype",""),p+="\n\n\n",(f=g.getParam("fullpage_default_title"))&&(p+=""+f+"\n"),(f=b(g))&&(p+='\n'),(f=x(g))&&(h+="font-family: "+f+";"),(f=k(g))&&(h+="font-size: "+f+";"),(f=g.getParam("fullpage_default_text_color"))&&(h+="color: "+f+";"),p+="\n\n")),n.set("\n\n")),s=C(e,t.get()),P(s.getAll("style"),function(e){e.firstChild&&(y+=e.firstChild.value)}),(d=s.getAll("body")[0])&&v.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),v.remove("fullpage_styles"),u=e.getDoc().getElementsByTagName("head")[0],y&&v.add(u,"style",{id:"fullpage_styles"}).appendChild(document.createTextNode(y)),m={},w.each(u.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),w.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||v.add(u,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),w.each(m,function(e){e.parentNode.removeChild(e)})))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=function(){return(g=Object.assign||function(e){for(var t,n=1,l=arguments.length;n/g,function(e,t){return unescape(t)}))})})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/fullscreen/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 000000000..3cf2ac817 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function a(e){var n=e;return{get:function(){return n},set:function(e){n=e}}}function e(t){return function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}}function n(n){return function(e){return typeof e===n}}function c(e){return!(null==e)}function s(){}function y(e){return function(){return e}}function r(e){return e}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=e("string"),d=e("array"),o=n("boolean"),h=n("function"),i=n("number");function u(){return m}var v=y(!1),f=y(!0),m={fold:function(e,n){return e()},isSome:v,isNone:f,getOr:r,getOrThunk:g,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(void 0),or:r,orThunk:g,map:u,each:s,bind:u,exists:v,forall:f,filter:function(){return m},toArray:function(){return[]},toString:y("none()")};function g(e){return e()}function p(e){function n(){return r.get().each(e)}var r=a(A.none());return{clear:function(){n(),r.set(A.none())},isSet:function(){return r.get().isSome()},get:function(){return r.get()},set:function(e){n(),r.set(A.some(e))}}}function w(){return p(function(e){return e.unbind()})}function C(e,n){for(var r=e.length,t=new Array(r),o=0;o'+e.name+""}var t,o,n,i,r,s,l,c;return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==e?"":'
    '+(s=b((i=w((n=o=e).plugins),void 0===(r=n.getParam("forced_plugins"))?i:m(i,function(e){return!(-1"+(t=o,n=e,function(e,t,n){for(var a=0,o=e.length;a";var t,n}),l=s.length,c=s.join(""),"

    "+T.translate(["Plugins installed ({0}):",l])+"

      "+c+"
    ")+"
    ",(t=b(m(d,function(e){var t=e.key,n=e.type;return"autocorrect"!==t&&"premium"===n}),function(e){return"
  • "+T.translate(e.name)+"
  • "}).join(""),'

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

    ")].join("")}]}}function l(d,y){return function(){var e,t,n,a,o,i,r,s,l,c,u,m=(e=d,t=y,r={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:b(x,function(e){var t=b(e.shortcuts,f).join(" or ");return[e.action,t]})}]},s={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

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

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

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

    \n\n

    Moving between UI sections

    \n\n

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

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

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

    \n\n

    Moving within UI sections

    \n\n

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

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

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

    \n\n

    Executing buttons

    \n\n

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

    \n\n

    Opening, navigating and closing menus

    \n\n

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

    \n\n

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

    \n\n

    Context toolbars and menus

    \n\n

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

    \n\n

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

    \n\n

    Dialog navigation

    \n\n

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

    \n\n

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

    \n\n

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

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

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

    ",presets:"document"}]},u=g(((n={})[r.name]=r,n[s.name]=s,n[l.name]=l,n[c.name]=c,n),t.get()),v.from(e.getParam("help_tabs")).fold(function(){return-1!==(n=(t=w(e=u)).indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=u,n={},a=b(e,function(e){return"string"==typeof e?(A(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})),h=m.tabs,p=function(e){for(var t=[],n=function(e){t.push(e)},a=0;a")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:e}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:e})})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/image/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/image/plugin.min.js new file mode 100644 index 000000000..c9307a257 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function D(e){return!(null==e)}function l(){}function a(e){return function(){return e}}function n(e){return e}function r(){return g}var i,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=function(){return(v=Object.assign||function(e){for(var t,n=1,r=arguments.length;n h1\" instead of mammoth.styleMapping(\"p[style-name='Title'] => h1\")");}},{"./document-to-html":3,"./docx/docx-reader":9,"./docx/style-map":14,"./images":20,"./options-reader":22,"./results":24,"./style-reader":25,"./transforms":29,"./underline":30,"./unzip":2,underscore:153}],22:[function(x,W,D){function n(l){return l?m.isString(l)?l.split("\n").map(function(a){return a.trim()}).filter(function(a){return""!== + a&&"#"!==a.charAt(0)}):l:[]}D.readOptions=function(l){l=l||{};return m.extend({},b,l,{customStyleMap:n(l.styleMap),readStyleMap:function(){var a=this.customStyleMap;this.includeEmbeddedStyleMap&&(a=a.concat(n(this.embeddedStyleMap)));this.includeDefaultStyleMap&&(a=a.concat(g));return a}})};var m=x("underscore"),g=D._defaultStyleMap="p.Heading1 => h1:fresh;p.Heading2 => h2:fresh;p.Heading3 => h3:fresh;p.Heading4 => h4:fresh;p.Heading5 => h5:fresh;p.Heading6 => h6:fresh;p[style-name='Heading 1'] => h1:fresh;p[style-name='Heading 2'] => h2:fresh;p[style-name='Heading 3'] => h3:fresh;p[style-name='Heading 4'] => h4:fresh;p[style-name='Heading 5'] => h5:fresh;p[style-name='Heading 6'] => h6:fresh;p[style-name='heading 1'] => h1:fresh;p[style-name='heading 2'] => h2:fresh;p[style-name='heading 3'] => h3:fresh;p[style-name='heading 4'] => h4:fresh;p[style-name='heading 5'] => h5:fresh;p[style-name='heading 6'] => h6:fresh;r[style-name='Strong'] => strong;p[style-name='footnote text'] => p:fresh;r[style-name='footnote reference'] =>;p[style-name='endnote text'] => p:fresh;r[style-name='endnote reference'] =>;p[style-name='annotation text'] => p:fresh;r[style-name='annotation reference'] =>;p[style-name='Footnote'] => p:fresh;r[style-name='Footnote anchor'] =>;p[style-name='Endnote'] => p:fresh;r[style-name='Endnote anchor'] =>;p:unordered-list(1) => ul > li:fresh;p:unordered-list(2) => ul|ol > li > ul > li:fresh;p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh;p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh;p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh;p:ordered-list(1) => ol > li:fresh;p:ordered-list(2) => ul|ol > li > ol > li:fresh;p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh;p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh;p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh;r[style-name='Hyperlink'] =>;p[style-name='Normal'] => p:fresh".split(";"), + b=D._standardOptions={transformDocument:function(l){return l},includeDefaultStyleMap:!0,includeEmbeddedStyleMap:!0}},{underscore:153}],23:[function(x,W,D){var n=x("underscore"),m=x("bluebird/js/release/promise")();D.defer=function(){var g,b,l=new m.Promise(function(a,c){g=a;b=c});return{resolve:g,reject:b,promise:l}};D.when=m.resolve;D.resolve=m.resolve;D.all=m.all;D.props=m.props;D.reject=m.reject;D.promisify=m.promisify;D.mapSeries=m.mapSeries;D.attempt=m.attempt;D.nfcall=function(g){var b=Array.prototype.slice.call(arguments, + 1);return m.promisify(g).apply(null,b)};m.prototype.fail=m.prototype.caught;m.prototype.also=function(g){return this.then(function(b){b=n.extend({},b,g(b));return m.props(b)})}},{"bluebird/js/release/promise":60,underscore:153}],24:[function(x,W,D){function n(l,a){this.value=l;this.messages=a||[]}function m(l){var a=[];b.flatten(b.pluck(l,"messages"),!0).forEach(function(c){void 0===b.find(a,g.bind(null,c))&&a.push(c)});return a}function g(l,a){return l.type===a.type&&l.message===a.message}var b= + x("underscore");D.Result=n;D.success=function(l){return new n(l,[])};D.warning=function(l){return{type:"warning",message:l}};D.error=function(l){return{type:"error",message:l.message,error:l}};n.prototype.map=function(l){return new n(l(this.value),this.messages)};n.prototype.flatMap=function(l){l=l(this.value);return new n(l.value,m([this,l]))};n.prototype.flatMapThen=function(l){var a=this;return l(this.value).then(function(c){return new n(c.value,m([a,c]))})};n.combine=function(l){var a=b.flatten(b.pluck(l, + "value"));l=m(l);return new n(a,l)}},{underscore:153}],25:[function(x,W,D){function n(){function f(R){R=c.rules.firstOf.apply(c.rules.firstOf,["matcher suffix"].concat(R));R=c.rules.zeroOrMore(R);return c.rules.then(R,function(Q){var B={};Q.forEach(function(H){a.extend(B,H)});return B})}var N=c.rules.sequence,T=function(R,Q){return c.rules.then(c.rules.token("identifier",R),function(){return Q})},q=T("p",t.paragraph),F=T("r",t.run);q=c.rules.firstOf("p or r or table",q,F);F=c.rules.then(z,function(R){return{styleId:R}}); + var G=c.rules.firstOf("style name matcher",c.rules.then(c.rules.sequence(c.rules.tokenOfType("equals"),c.rules.sequence.cut(),c.rules.sequence.capture(U)).head(),function(R){return{styleName:t.equalTo(R)}}),c.rules.then(c.rules.sequence(c.rules.tokenOfType("startsWith"),c.rules.sequence.cut(),c.rules.sequence.capture(U)).head(),function(R){return{styleName:t.startsWith(R)}}));G=c.rules.sequence(c.rules.tokenOfType("open-square-bracket"),c.rules.sequence.cut(),c.rules.token("identifier","style-name"), + c.rules.sequence.capture(G),c.rules.tokenOfType("close-square-bracket")).head();var k=c.rules.firstOf("list type",T("ordered-list",{isOrdered:!0}),T("unordered-list",{isOrdered:!1}));k=N(c.rules.tokenOfType("colon"),N.capture(k),N.cut(),c.rules.tokenOfType("open-paren"),N.capture(K),c.rules.tokenOfType("close-paren")).map(function(R,Q){return{list:{isOrdered:R.isOrdered,levelIndex:Q-1}}});q=N(N.capture(q),N.capture(f([F,G,k]))).map(function(R,Q){return R(Q)});F=N(c.rules.token("identifier","table"), + N.capture(f([F,G]))).map(function(R){return t.table(R)});G=T("b",t.bold);k=T("i",t.italic);var J=T("u",t.underline),I=T("strike",t.strikethrough),S=T("small-caps",t.smallCaps);T=T("comment-reference",t.commentReference);N=N(c.rules.token("identifier","br"),N.cut(),c.rules.tokenOfType("open-square-bracket"),c.rules.token("identifier","type"),c.rules.tokenOfType("equals"),N.capture(U),c.rules.tokenOfType("close-square-bracket")).map(function(R){switch(R){case "line":return t.lineBreak;case "page":return t.pageBreak; + case "column":return t.columnBreak}});return c.rules.firstOf("element type",q,F,G,k,J,I,S,T,N)}function m(){var f=c.rules.sequence.capture,N=c.rules.tokenOfType("whitespace"),T=c.rules.then(c.rules.optional(c.rules.sequence(c.rules.tokenOfType("colon"),c.rules.token("identifier","fresh"))),function(G){return G.map(function(){return!0}).valueOrElse(!1)}),q=c.rules.then(c.rules.optional(c.rules.sequence(c.rules.tokenOfType("colon"),c.rules.token("identifier","separator"),c.rules.tokenOfType("open-paren"), + f(U),c.rules.tokenOfType("close-paren")).head()),function(G){return G.valueOrElse("")}),F=c.rules.oneOrMoreWithSeparator(E,c.rules.tokenOfType("choice"));f=c.rules.sequence(f(F),f(c.rules.zeroOrMore(z)),f(T),f(q)).map(function(G,k,J,I){var S={},R={};0/},{name:"whitespace",regex:/\s+/},{name:"arrow",regex:/=>/},{name:"equals",regex:/=/},{name:"startsWith",regex:/\^=/},{name:"open-paren",regex:/\(/},{name:"close-paren",regex:/\)/}, + {name:"open-square-bracket",regex:/\[/},{name:"close-square-bracket",regex:/\]/},{name:"string",regex:new RegExp(m+"'")},{name:"unterminated-string",regex:new RegExp(m)},{name:"integer",regex:/([0-9]+)/},{name:"choice",regex:/\|/},{name:"bang",regex:/(!)/}])).tokenise(g)};var m="'((?:\\\\.|[^'])*)"},{lop:107}],29:[function(x,W,D){function n(a,c){return m(function(t){return t.type===a?c(t):t})}function m(a){return function p(t){if(t.children){var w=l.map(t.children,p);t=l.extend(t,{children:w})}return a(t)}} + function g(a){var c=[];b(a,function(t){c.push(t)});return c}function b(a,c){a.children&&a.children.forEach(function(t){b(t,c);c(t)})}var l=x("underscore");D.paragraph=function(a){return n("paragraph",a)};D.run=function(a){return n("run",a)};D._elements=m;D.getDescendantsOfType=function(a,c){return g(a).filter(function(t){return t.type===c})};D.getDescendants=g},{underscore:153}],30:[function(x,W,D){var n=x("./styles/html-paths"),m=x("./html");D.element=function(g){return function(b){return m.elementWithTag(n.element(g), + [b])}}},{"./html":18,"./styles/html-paths":27}],31:[function(x,W,D){function n(){function a(){r=!1;if(!w&&(0===p.length||l[p[p.length-1]])&&!c()){E._append("\n");for(var K=0;K/g,">"))}).join("")}var c=[];return{asString:function(){return c.join("")},open:function(t,p){p=a(p);c.push(g.format("<%s%s>",t,p))},close:function(t){c.push(g.format("",t))},text:function(t){c.push(t.replace(/&/g,"&").replace(//g,">"))},selfClosing:function(t, + p){p=a(p);c.push(g.format("<%s%s />",t,p))},_append:function(t){c.push(t)}}}var g=x("util"),b=x("underscore");D.writer=function(a){a=a||{};return a.prettyPrint?n():m()};var l={div:!0,p:!0,ul:!0,li:!0}},{underscore:153,util:157}],32:[function(x,W,D){var n=x("./html-writer"),m=x("./markdown-writer");D.writer=function(g){g=g||{};return"markdown"===g.outputFormat?m.writer():n.writer(g)}},{"./html-writer":31,"./markdown-writer":33}],33:[function(x,W,D){function n(a){return m(a,a)}function m(a,c){return function(){return{start:a, + end:c}}}function g(a){return function(c,t){return{start:t?"\n":"",end:t?"":"\n",list:{isOrdered:a.isOrdered,indent:t?t.indent+1:0,count:0}}}}var b=x("underscore"),l={p:m("","\n\n"),br:m(""," \n"),ul:g({isOrdered:!1}),ol:g({isOrdered:!0}),li:function(a,c,t){c=c||{indent:0,isOrdered:!1,count:0};c.count++;t.hasClosed=!1;a=c.isOrdered?c.count+".":"-";return{start:Array(c.indent+1).join("\t")+a+" ",end:function(){if(!t.hasClosed)return t.hasClosed=!0,"\n"}}},strong:n("__"),em:n("*"),a:function(a){return(a= + a.href||"")?{start:"[",end:"]("+a+")",anchorPosition:"before"}:{}},img:function(a){var c=a.src||"";a=a.alt||"";return c||a?{start:"!["+a+"]("+c+")"}:{}}};(function(){for(var a=1;6>=a;a++)l["h"+a]=m(Array(a+1).join("#")+" ","\n\n")})();D.writer=function(){function a(K,U){U=U||{};K=(l[K]||function(){return{}})(U,r,E);w.push({end:K.end,list:r});K.list&&(r=K.list);var O="before"===K.anchorPosition;O&&c(U);p.push(K.start||"");O||c(U)}function c(K){K.id&&p.push('')}function t(K){K= + w.pop();r=K.list;K=b.isFunction(K.end)?K.end():K.end;p.push(K||"")}var p=[],w=[],r=null,E={};return{asString:function(){return p.join("")},open:a,close:t,text:function(K){p.push(K.replace(/\\/g,"\\\\").replace(/([`\*_\{\}\[\]\(\)#\+\-\.!])/g,"\\$1"))},selfClosing:function(K,U){a(K,U);t(K)}}}},{underscore:153}],34:[function(x,W,D){W=x("./nodes");D.Element=W.Element;D.element=W.element;D.text=W.text;D.readString=x("./reader").readString;D.writeString=x("./writer").writeString},{"./nodes":35,"./reader":36, + "./writer":37}],35:[function(x,W,D){function n(l,a,c){this.type="element";this.name=l;this.attributes=a||{};this.children=c||[]}var m=x("underscore");D.Element=n;D.element=function(l,a,c){return new n(l,a,c)};D.text=function(l){return{type:"text",value:l}};var g={first:function(){return null},firstOrEmpty:function(){return g},attributes:{}};n.prototype.first=function(l){return m.find(this.children,function(a){return a.name===l})};n.prototype.firstOrEmpty=function(l){return this.first(l)||g};n.prototype.getElementsByTagName= + function(l){var a=m.filter(this.children,function(c){return c.name===l});return m.extend(a,b)};n.prototype.text=function(){if(0===this.children.length)return"";if(1!==this.children.length||"text"!==this.children[0].type)throw Error("Not implemented");return this.children[0].value};var b={getElementsByTagName:function(l){return m.extend(m.flatten(this.map(function(a){return a.getElementsByTagName(l)},!0)),b)}}},{underscore:153}],36:[function(x,W,D){function n(c,t,p){return b.reduce(c,function(w,r, + E){var K=p(r,E,c);w[K]=t(r,E,c);return w},{})}var m=x("../promises"),g=x("sax"),b=x("underscore"),l=x("./nodes"),a=l.Element;D.readString=function(c,t){function p(z){if(z.uri){var M=t[z.uri];return(M?M+":":"{"+z.uri+"}")+z.local}return z.local}t=t||{};var w=!1,r=g.parser(!0,{xmlns:!0,position:!1}),E={children:[]},K=E,U=[],O=m.defer();r.onopentag=function(z){var M=n(z.attributes,function(f){return f.value},p);z=new a(p(z),M);K.children.push(z);U.push(K);K=z};r.onclosetag=function(z){K=U.pop()};r.ontext= + function(z){K!==E&&K.children.push(l.text(z))};r.onend=function(){w||(w=!0,O.resolve(E.children[0]))};r.onerror=function(z){w||(w=!0,O.reject(z))};r.write(c).close();return O.promise}},{"../promises":23,"./nodes":35,sax:150,underscore:153}],37:[function(x,W,D){function n(b,l){b.text(l.value)}var m=x("underscore"),g=x("xmlbuilder");D.writeString=function(b,l){function a(p){var w=/^\{(.*)\}(.*)$/.exec(p);return w?(p=c[w[1]],p+(""===p?"":":")+w[2]):p}var c=m.invert(l),t={element:function(p,w){var r= + p.element(a(w.name),w.attributes);w.children.forEach(function(E){t[E.type](r,E)})},text:n};return function(p){var w=g.create(a(p.name),{version:"1.0",encoding:"UTF-8",standalone:!0});m.forEach(l,function(r,E){w.attribute("xmlns"+(""===E?"":":"+E),r)});p.children.forEach(function(r){t[r.type](w,r)});return w.end()}(b)}},{underscore:153,xmlbuilder:179}],38:[function(x,W,D){(function(n){var m=x("jszip"),g=x("./promises");D.openArrayBuffer=function(b){var l=new m(b);return{exists:function(a){return null!== + l.file(a)},read:function(a,c){a=l.file(a).asUint8Array();a=new n(a);return c?g.when(a.toString(c)):g.when(a)},write:function(a,c){l.file(a,c)},toBuffer:function(){return l.generate({type:"nodebuffer"})}}};D.splitPath=function(b){var l=b.lastIndexOf("/");return-1===l?{dirname:"",basename:b}:{dirname:b.substring(0,l),basename:b.substring(l+1)}};D.joinPath=function(){var b=[];Array.prototype.filter.call(arguments,function(l){return l}).forEach(function(l){/^\//.test(l)?b=[l]:b.push(l)});return b.join("/")}}).call(this, + x("buffer").Buffer)},{"./promises":23,buffer:77,jszip:92}],39:[function(x,W,D){function n(a){var c=a.length;if(0>18&63]+g[c>>12&63]+g[c>>6&63]+g[c&63]);return p.join("")}D.byteLength=function(a){return 3*a.length/4-n(a)};D.toByteArray=function(a){var c=a.length;var t=n(a);var p=new l(3*c/4-t);var w=0>16&255;p[r++]=E>>8&255;p[r++]=E&255}2===t?(E=b[a.charCodeAt(c)]<<2|b[a.charCodeAt(c+1)]>>4,p[r++]=E&255):1===t&&(E=b[a.charCodeAt(c)]<<10|b[a.charCodeAt(c+1)]<<4|b[a.charCodeAt(c+2)]>>2,p[r++]=E>>8&255,p[r++]=E&255);return p};D.fromByteArray=function(a){for(var c=a.length,t=c%3,p="",w=[],r=0,E=c-t;rE?E:r+16383));1===t?(a=a[c-1],p+= + g[a>>2],p+=g[a<<4&63],p+="=="):2===t&&(a=(a[c-2]<<8)+a[c-1],p+=g[a>>10],p+=g[a>>4&63],p+=g[a<<2&63],p+="=");w.push(p);return w.join("")};var g=[],b=[],l="undefined"!==typeof Uint8Array?Uint8Array:Array;for(x=0;64>x;++x)g[x]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[x],b["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(x)]=x;b[45]=62;b[95]=63},{}],40:[function(x,W,D){W.exports=function(n){function m(b){b=new g(b);var l=b.promise();b.setHowMany(1); + b.setUnwrap();b.init();return l}var g=n._SomePromiseArray;n.any=function(b){return m(b)};n.prototype.any=function(){return m(this)}}},{}],41:[function(x,W,D){(function(n){function m(){this._isTickUsed=this._customScheduler=!1;this._lateQueue=new t(16);this._normalQueue=new t(16);this._haveDrainedQueues=!1;this._trampolineEnabled=!0;var w=this;this.drainQueues=function(){w._drainQueues()};this._schedule=c}function g(w,r,E){this._lateQueue.push(w,r,E);this._queueTick()}function b(w,r,E){this._normalQueue.push(w, + r,E);this._queueTick()}function l(w){this._normalQueue._pushOne(w);this._queueTick()}try{throw Error();}catch(w){var a=w}var c=x("./schedule"),t=x("./queue"),p=x("./util");m.prototype.setScheduler=function(w){var r=this._schedule;this._schedule=w;this._customScheduler=!0;return r};m.prototype.hasCustomScheduler=function(){return this._customScheduler};m.prototype.enableTrampoline=function(){this._trampolineEnabled=!0};m.prototype.disableTrampolineIfNecessary=function(){p.hasDevTools&&(this._trampolineEnabled= + !1)};m.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues};m.prototype.fatalError=function(w,r){r?(n.stderr.write("Fatal "+(w instanceof Error?w.stack:w)+"\n"),n.exit(2)):this.throwLater(w)};m.prototype.throwLater=function(w,r){1===arguments.length&&(r=w,w=function(){throw r;});if("undefined"!==typeof setTimeout)setTimeout(function(){w(r)},0);else try{this._schedule(function(){w(r)})}catch(E){throw Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n"); + }};p.hasDevTools?(m.prototype.invokeLater=function(w,r,E){this._trampolineEnabled?g.call(this,w,r,E):this._schedule(function(){setTimeout(function(){w.call(r,E)},100)})},m.prototype.invoke=function(w,r,E){this._trampolineEnabled?b.call(this,w,r,E):this._schedule(function(){w.call(r,E)})},m.prototype.settlePromises=function(w){this._trampolineEnabled?l.call(this,w):this._schedule(function(){w._settlePromises()})}):(m.prototype.invokeLater=g,m.prototype.invoke=b,m.prototype.settlePromises=l);m.prototype._drainQueue= + function(w){for(;0M&&(M=Math.max(0,M+z.length));return z[M]}var t=x("./util"),p=t.canEvaluate,w=t.isIdentifier,r=function(z){return(new Function("ensureMethod", + " \n return function(obj) { \n 'use strict' \n var len = this.length; \n ensureMethod(obj, 'methodName'); \n switch(len) { \n case 1: return obj.methodName(this[0]); \n case 2: return obj.methodName(this[0], this[1]); \n case 3: return obj.methodName(this[0], this[1], this[2]); \n case 0: return obj.methodName(); \n default: \n return obj.methodName.apply(obj, this); \n } \n }; \n ".replace(/methodName/g, + z)))(b)},E=function(z){return new Function("obj"," \n 'use strict'; \n return obj.propertyName; \n ".replace("propertyName",z))},K=function(z,M,f){var N=f[z];if("function"!==typeof N){if(!w(z))return null;N=M(z);f[z]=N;f[" size"]++;if(512M;++M)delete f[z[M]];f[" size"]=z.length-256}}return N}; + var U=function(z){return K(z,r,n)};var O=function(z){return K(z,E,m)};g.prototype.call=function(z){for(var M=arguments.length,f=Array(Math.max(M-1,0)),N=1;N=this._branchesRemainingToCancel};n.prototype._cancelBy=function(p){if(p===this)return this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0;this._branchHasCancelled();return this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1};n.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&& + this._cancel()};n.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),t.invoke(this._cancelPromises,this,void 0))};n.prototype._cancelPromises=function(){0ba.length?ba:ba.substr(0,38)+"...";return"(<"+aa+">, no stack trace)"}function F(){return"function"===typeof la}function G(aa){if(aa=aa.match(ha))return{fileName:aa[1],line:parseInt(aa[2],10)}}function k(aa){this._parent=aa;this._promisesCreated=0;aa=this._length= + 1+(void 0===aa?0:aa._length);la(this,k);32aa)){var ba=[],ea={},da=0;for(aa=this;void 0!==aa;++da)ba.push(aa),aa=aa._parent; + aa=this._length=da;for(da=aa-1;0<=da;--da){var ia=ba[da].stack;void 0===ea[ia]&&(ea[ia]=da)}for(da=0;daea||0>da||!ia||!ka||ia!==ka||ea>= + da||(fa=function(oa){return X.test(oa)?!0:(oa=G(oa))&&oa.fileName===ia&&ea<=oa.line&&oa.line<=da?!0:!1})}},warn:O,deprecated:function(aa,ba){aa+=" is deprecated and will be removed in a future version.";ba&&(aa+=" Use "+ba+" instead.");return O(aa)},CapturedTrace:k,fireDomEvent:L,fireGlobalEvent:V}}}).call(this,x("_process"))},{"./errors":50,"./util":74,_process:138}],48:[function(x,W,D){W.exports=function(n){function m(){return this.value}function g(){throw this.reason;}n.prototype["return"]=n.prototype.thenReturn= + function(b){b instanceof n&&b.suppressUnhandledRejections();return this._then(m,void 0,void 0,{value:b},void 0)};n.prototype["throw"]=n.prototype.thenThrow=function(b){return this._then(g,void 0,void 0,{reason:b},void 0)};n.prototype.catchThrow=function(b){if(1>=arguments.length)return this._then(void 0,g,void 0,{reason:b},void 0);var l=arguments[1];return this.caught(b,function(){throw l;})};n.prototype.catchReturn=function(b){if(1>=arguments.length)return b instanceof n&&b.suppressUnhandledRejections(), + this._then(void 0,m,void 0,{value:b},void 0);var l=arguments[1];l instanceof n&&l.suppressUnhandledRejections();return this.caught(b,function(){return l})}}},{}],49:[function(x,W,D){W.exports=function(n,m){function g(){return l(this)}var b=n.reduce,l=n.all;n.prototype.each=function(a){return b(this,a,m,0)._then(g,void 0,void 0,this,void 0)};n.prototype.mapSeries=function(a){return b(this,a,m,m)};n.each=function(a,c){return b(a,c,m,0)._then(g,void 0,void 0,a,void 0)};n.mapSeries=function(a,c){return b(a, + c,m,m)}}},{}],50:[function(x,W,D){function n(U,O){function z(M){if(!(this instanceof z))return new z(M);l(this,"message","string"===typeof M?M:O);l(this,"name",U);Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this)}b(z,Error);return z}function m(U){if(!(this instanceof m))return new m(U);l(this,"name","OperationalError");l(this,"message",U);this.cause=U;this.isOperational=!0;U instanceof Error?(l(this,"message",U.message),l(this,"stack",U.stack)):Error.captureStackTrace&& + Error.captureStackTrace(this,this.constructor)}D=x("./es5");var g=D.freeze;x=x("./util");var b=x.inherits,l=x.notEnumerableProp;x=n("Warning","warning");var a=n("CancellationError","cancellation error"),c=n("TimeoutError","timeout error"),t=n("AggregateError","aggregate error");try{var p=TypeError;var w=RangeError}catch(U){p=n("TypeError","type error"),w=n("RangeError","range error")}for(var r="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "), + E=0;EO;++O)E.push(r(O+1)),K.push(new Function("value","holder"," \n 'use strict'; \n holder.pIndex = value; \n holder.checkFulfillment(this); \n ".replace(/Index/g, + O+1))),U.push(new Function("promise","holder"," \n 'use strict'; \n holder.pIndex = promise; \n ".replace(/Index/g,O+1)));var z=function(M){this._reject(M)}}n.join=function(){var M=arguments.length-1;if(0=M&&t){var N=new n(b);N._captureStackTrace();f=new E[M-1](f);for(var T=K, + q=0;qO){if(z[-1*O-1]=U,1<=N&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(1<=N&&this._inFlight>=N)return z[O]=U,this._queue.push(O),!1;null!==f&&(f[O]=U);var T=this._promise,q=this._callback,F=T._boundValue();T._pushContext();U=r(q).call(F,U,O,M);q=T._popContext();a.checkForgottenReturns(U,q,null!==f?"Promise.filter":"Promise.map",T);if(U=== + E)return this._reject(U.e),!0;T=b(U,this._promise);if(T instanceof n){T=T._target();U=T._bitField;if(0===(U&50397184))return 1<=N&&this._inFlight++,z[O]=T,T._proxy(this,-1*(O+1)),!1;if(0!==(U&33554432))U=T._value();else return 0!==(U&16777216)?this._reject(T._reason()):this._cancel(),!0}z[O]=U}return++this._totalResolved>=M?(null!==f?this._filter(z,f):this._resolve(z),!0):!1};c.prototype._drainQueue=function(){for(var U=this._queue,O=this._limit,z=this._values;0>>16)){if(B=== + this)return B=c(),this._attachExtraTrace(B),this._reject(B);this._setFulfilled();this._rejectionHandler0=B;0<(H&65535)&&(0!==(H&134217728)?this._settlePromises():O.settlePromises(this))}};g.prototype._reject=function(B){var H=this._bitField;if(!((H&117506048)>>>16)){this._setRejected();this._fulfillmentHandler0=B;if(this._isFinal())return O.fatalError(B,r.isNode);0<(H&65535)?O.settlePromises(this):this._ensurePossibleRejectionHandled()}};g.prototype._fulfillPromises=function(B,H){for(var X=1;X=this._length?(this._resolve(this._values),!0):!1};c.prototype._promiseCancelled=function(){this._cancel();return!0};c.prototype._promiseRejected=function(w){this._totalResolved++;this._reject(w);return!0};c.prototype._resultCancelled=function(){if(!this._isResolved()){var w= + this._values;this._cancel();if(w instanceof n)w.cancel();else for(var r=0;r=G;--k)F.push(k);for(k=q+1;3>=k;++k)F.push(k);return F};var N=function(q,F,G,k,J,I){G=Math.max(0,("number"=== + typeof k.length?Math.max(Math.min(k.length,1024),0):0)-1);var S=f(G),R="string"===typeof q||F===t;q="string"===typeof q?"this != null ? this['"+q+"'] : fn":"fn";I="'use strict'; \n var ret = function (Parameters) { \n 'use strict'; \n var len = arguments.length; \n var promise = new Promise(INTERNAL); \n promise._captureStackTrace(); \n var nodeback = nodebackForPromise(promise, "+ + I+"); \n var ret; \n var callback = tryCatch([GetFunctionCode]); \n switch(len) { \n [CodeForSwitchCase] \n } \n if (ret === errorObj) { \n promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n } \n if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n return promise; \n }; \n notEnumerableProp(ret, '__isPromisified__', true); \n return ret; \n ".replace("[CodeForSwitchCase]", + function(){for(var Q="",B=0;B=this._length){if(this._isMap){E=this._values;K=new w;for(var U=E.length/2|0,O=0;O>1};n.prototype.props=function(){return a(this)};n.props=function(E){return a(E)}}}, + {"./es5":51,"./util":74}],64:[function(x,W,D){function n(m){this._capacity=m;this._front=this._length=0}n.prototype._willBeOverCapacity=function(m){return this._capacity=this._length?(this._resolve(this._values),!0):!1};b.prototype._promiseFulfilled=function(a,c){var t=new l; + t._bitField=33554432;t._settledValueField=a;return this._promiseResolved(c,t)};b.prototype._promiseRejected=function(a,c){var t=new l;t._bitField=16777216;t._settledValueField=a;return this._promiseResolved(c,t)};n.settle=function(a){g.deprecated(".settle()",".reflect()");return(new b(a)).promise()};n.prototype.settle=function(){return n.settle(this)}}},{"./util":74}],69:[function(x,W,D){W.exports=function(n,m,g){function b(r){this.constructor$(r);this._howMany=0;this._initialized=this._unwrap=!1} + function l(r,E){if((E|0)!==E||0>E)return g("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");r=new b(r);var K=r.promise();r.setHowMany(E);r.init();return K}var a=x("./util"),c=x("./errors").RangeError,t=x("./errors").AggregateError,p=a.isArray,w={};a.inherits(b,m);b.prototype._init=function(){if(this._initialized)if(0===this._howMany)this._resolve([]);else{this._init$(void 0,-5);var r=p(this._values);!this._isResolved()&&r&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}}; + b.prototype.init=function(){this._initialized=!0;this._init()};b.prototype.setUnwrap=function(){this._unwrap=!0};b.prototype.howMany=function(){return this._howMany};b.prototype.setHowMany=function(r){this._howMany=r};b.prototype._promiseFulfilled=function(r){this._addFulfilled(r);return this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1};b.prototype._promiseRejected=function(r){this._addRejected(r); + return this._checkOutcome()};b.prototype._promiseCancelled=function(){if(this._values instanceof n||null==this._values)return this._cancel();this._addRejected(w);return this._checkOutcome()};b.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var r=new t,E=this.length();E=G)return k._fulfill();var J=N[F++];var I=g(J);I!==J&&"function"===typeof J._isDisposable&&"function"===typeof J._getDisposer&&J._isDisposable()&& + I._setDisposable(J._getDisposer());J=I;if(J instanceof n&&J._isDisposable()){try{J=g(J._getDisposer().tryDispose(T),N.promise)}catch(S){return c(S)}if(J instanceof n)return J._then(q,c,null,null,null)}q()}var F=0,G=N.length,k=new n(l);q();return k}function p(N,T,q){this._data=N;this._promise=T;this._context=q}function w(N,T,q){this.constructor$(N,T,q)}function r(N){return p.isDisposer(N)?(this.resources[this.index]._setDisposable(N),N.promise()):N}function E(N){this.length=N;this.promise=null;this[N- + 1]=null}var K=x("./util"),U=x("./errors").TypeError,O=x("./util").inherits,z=K.errorObj,M=K.tryCatch,f={};p.prototype.data=function(){return this._data};p.prototype.promise=function(){return this._promise};p.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():f};p.prototype.tryDispose=function(N){var T=this.resource(),q=this._context;void 0!==q&&q._pushContext();N=T!==f?this.doDispose(T,N):null;void 0!==q&&q._popContext();this._promise._unsetDisposable();this._data= + null;return N};p.isDisposer=function(N){return null!=N&&"function"===typeof N.resource&&"function"===typeof N.tryDispose};O(w,p);w.prototype.doDispose=function(N,T){return this.data().call(N,N,T)};E.prototype._resultCancelled=function(){for(var N=this.length,T=0;TN)return m("you must pass at least 2 arguments to Promise.using");var T=arguments[N-1];if("function"!==typeof T)return m("expecting a function but got "+ + K.classString(T));var q=!0;if(2===N&&Array.isArray(arguments[0])){var F=arguments[0];N=F.length;q=!1}else F=arguments,N--;for(var G=new E(N),k=0;k + l)throw new RangeError("size is too large");var p=c;void 0===p&&(t=void 0,p=0);c=new g(a);if("string"===typeof p){t=new g(p,t);p=t.length;for(var w=-1;++wl)throw new RangeError("size is too large");return new g(a)};D.from=function(a,c,t){if("function"===typeof g.from&&(!n.Uint8Array||Uint8Array.from!== + g.from))return g.from(a,c,t);if("number"===typeof a)throw new TypeError('"value" argument must not be a number');if("string"===typeof a)return new g(a,c);if("undefined"!==typeof ArrayBuffer&&a instanceof ArrayBuffer){var p=c;if(1===arguments.length)return new g(a);"undefined"===typeof p&&(p=0);var w=t;"undefined"===typeof w&&(w=a.byteLength-p);if(p>=a.byteLength)throw new RangeError("'offset' is out of bounds");if(w>a.byteLength-p)throw new RangeError("'length' is out of bounds");return new g(a.slice(p, + p+w))}if(g.isBuffer(a))return p=new g(a.length),a.copy(p,0,0,a.length),p;if(a){if(Array.isArray(a)||"undefined"!==typeof ArrayBuffer&&a.buffer instanceof ArrayBuffer||"length"in a)return new g(a);if("Buffer"===a.type&&Array.isArray(a.data))return new g(a.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.");};D.allocUnsafeSlow=function(a){if("function"===typeof g.allocUnsafeSlow)return g.allocUnsafeSlow(a);if("number"!==typeof a)throw new TypeError("size must be a number"); + if(a>=l)throw new RangeError("size is too large");return new b(a)}}).call(this,"undefined"!==typeof global?global:"undefined"!==typeof self?self:"undefined"!==typeof window?window:{})},{buffer:77}],77:[function(x,W,D){(function(n){function m(){try{var u=new Uint8Array(1);u.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}};return 42===u.foo()&&"function"===typeof u.subarray&&0===u.subarray(1,1).byteLength}catch(d){return!1}}function g(u,d){if((b.TYPED_ARRAY_SUPPORT?2147483647:1073741823)< + d)throw new RangeError("Invalid typed array length");b.TYPED_ARRAY_SUPPORT?(u=new Uint8Array(d),u.__proto__=b.prototype):(null===u&&(u=new b(d)),u.length=d);return u}function b(u,d,A){if(!(b.TYPED_ARRAY_SUPPORT||this instanceof b))return new b(u,d,A);if("number"===typeof u){if("string"===typeof d)throw Error("If encoding is specified then the first argument must be a string");return c(this,u)}return l(this,u,d,A)}function l(u,d,A,h){if("number"===typeof d)throw new TypeError('"value" argument must not be a number'); + if("undefined"!==typeof ArrayBuffer&&d instanceof ArrayBuffer){d.byteLength;if(0>A||d.byteLengthu)throw new RangeError('"size" argument must not be negative');}function c(u,d){a(d);u=g(u,0>d?0:w(d)|0);if(!b.TYPED_ARRAY_SUPPORT)for(var A=0;Ad.length?0:w(d.length)|0;u=g(u,A);for(var h=0;h=(b.TYPED_ARRAY_SUPPORT?2147483647:1073741823))throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+ + (b.TYPED_ARRAY_SUPPORT?2147483647:1073741823).toString(16)+" bytes");return u|0}function r(u,d){if(b.isBuffer(u))return u.length;if("undefined"!==typeof ArrayBuffer&&"function"===typeof ArrayBuffer.isView&&(ArrayBuffer.isView(u)||u instanceof ArrayBuffer))return u.byteLength;"string"!==typeof u&&(u=""+u);var A=u.length;if(0===A)return 0;for(var h=!1;;)switch(d){case "ascii":case "latin1":case "binary":return A;case "utf8":case "utf-8":case void 0:return J(u).length;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return 2* + A;case "hex":return A>>>1;case "base64":return R.toByteArray(k(u)).length;default:if(h)return J(u).length;d=(""+d).toLowerCase();h=!0}}function E(u,d,A){var h=!1;if(void 0===d||0>d)d=0;if(d>this.length)return"";if(void 0===A||A>this.length)A=this.length;if(0>=A)return"";A>>>=0;d>>>=0;if(A<=d)return"";for(u||(u="utf8");;)switch(u){case "hex":u=d;d=A;A=this.length;if(!u||0>u)u=0;if(!d||0>d||d>A)d=A;h="";for(A=u;Ah?"0"+h.toString(16):h.toString(16),h=u+h;return h;case "utf8":case "utf-8":return z(this, + d,A);case "ascii":u="";for(A=Math.min(this.length,A);dA&&(A=-2147483648);A=+A;isNaN(A)&&(A=v?0:u.length-1);0>A&&(A=u.length+A);if(A>=u.length){if(v)return-1;A=u.length-1}else if(0>A)if(v)A=0;else return-1;"string"===typeof d&&(d=b.from(d,h));if(b.isBuffer(d))return 0===d.length?-1:O(u,d,A,h,v);if("number"===typeof d)return d&=255,b.TYPED_ARRAY_SUPPORT&&"function"=== + typeof Uint8Array.prototype.indexOf?v?Uint8Array.prototype.indexOf.call(u,d,A):Uint8Array.prototype.lastIndexOf.call(u,d,A):O(u,[d],A,h,v);throw new TypeError("val must be string, number or Buffer");}function O(u,d,A,h,v){function P(L,V){return 1===e?L[V]:L.readUInt16BE(V*e)}var e=1,y=u.length,C=d.length;if(void 0!==h&&(h=String(h).toLowerCase(),"ucs2"===h||"ucs-2"===h||"utf16le"===h||"utf-16le"===h)){if(2>u.length||2>d.length)return-1;e=2;y/=2;C/=2;A/=2}if(v)for(h=-1;Ay&&(A=y-C);0<=A;A--){y=!0;for(h=0;hv&&(P=v);break;case 2:var y=u[d+1];128===(y&192)&&(v=(v&31)<<6|y&63,127v||57343v&&(P=v))}null===P?(P=65533,e=1):65535>>10&1023|55296),P=56320|P&1023);h.push(P);d+=e}u=h.length;if(u<=H)h=String.fromCharCode.apply(String,h);else{A="";for(d=0;du)throw new RangeError("offset is not uint"); + if(u+d>A)throw new RangeError("Trying to access beyond buffer length");}function f(u,d,A,h,v,P){if(!b.isBuffer(u))throw new TypeError('"buffer" argument must be a Buffer instance');if(d>v||du.length)throw new RangeError("Index out of range");}function N(u,d,A,h){0>d&&(d=65535+d+1);for(var v=0,P=Math.min(u.length-A,2);v>>8*(h?v:1-v)}function T(u,d,A,h){0>d&&(d=4294967295+d+1);for(var v=0,P=Math.min(u.length- + A,4);v>>8*(h?v:3-v)&255}function q(u,d,A,h,v,P){if(A+h>u.length)throw new RangeError("Index out of range");if(0>A)throw new RangeError("Index out of range");}function F(u,d,A,h,v){v||q(u,d,A,4,3.4028234663852886E38,-3.4028234663852886E38);Q.write(u,d,A,h,23,4);return A+4}function G(u,d,A,h,v){v||q(u,d,A,8,1.7976931348623157E308,-1.7976931348623157E308);Q.write(u,d,A,h,52,8);return A+8}function k(u){u=u.trim?u.trim():u.replace(/^\s+|\s+$/g,"");u=u.replace(X,"");if(2>u.length)return""; + for(;0!==u.length%4;)u+="=";return u}function J(u,d){d=d||Infinity;for(var A,h=u.length,v=null,P=[],e=0;eA){if(!v){if(56319A){-1<(d-=3)&&P.push(239,191,189);v=A;continue}A=(v-55296<<10|A-56320)+65536}else v&&-1<(d-=3)&&P.push(239,191,189);v=null;if(128>A){if(0>--d)break;P.push(A)}else if(2048>A){if(0>(d-=2))break;P.push(A>>6|192,A&63| + 128)}else if(65536>A){if(0>(d-=3))break;P.push(A>>12|224,A>>6&63|128,A&63|128)}else if(1114112>A){if(0>(d-=4))break;P.push(A>>18|240,A>>12&63|128,A>>6&63|128,A&63|128)}else throw Error("Invalid code point");}return P}function I(u){for(var d=[],A=0;A=d.length||v>=u.length);++v)d[v+A]=u[v];return v}var R=x("base64-js"),Q=x("ieee754"),B=x("isarray");D.Buffer=b;D.SlowBuffer=function(u){+u!=u&&(u=0);return b.alloc(+u)}; + D.INSPECT_MAX_BYTES=50;b.TYPED_ARRAY_SUPPORT=void 0!==n.TYPED_ARRAY_SUPPORT?n.TYPED_ARRAY_SUPPORT:m();D.kMaxLength=b.TYPED_ARRAY_SUPPORT?2147483647:1073741823;b.poolSize=8192;b._augment=function(u){u.__proto__=b.prototype;return u};b.from=function(u,d,A){return l(null,u,d,A)};b.TYPED_ARRAY_SUPPORT&&(b.prototype.__proto__=Uint8Array.prototype,b.__proto__=Uint8Array,"undefined"!==typeof Symbol&&Symbol.species&&b[Symbol.species]===b&&Object.defineProperty(b,Symbol.species,{value:null,configurable:!0})); + b.alloc=function(u,d,A){a(u);u=0>=u?g(null,u):void 0!==d?"string"===typeof A?g(null,u).fill(d,A):g(null,u).fill(d):g(null,u);return u};b.allocUnsafe=function(u){return c(null,u)};b.allocUnsafeSlow=function(u){return c(null,u)};b.isBuffer=function(u){return!(null==u||!u._isBuffer)};b.compare=function(u,d){if(!b.isBuffer(u)||!b.isBuffer(d))throw new TypeError("Arguments must be Buffers");if(u===d)return 0;for(var A=u.length,h=d.length,v=0,P=Math.min(A,h);vd&&(u+=" ... "));return""};b.prototype.compare=function(u,d,A,h,v){if(!b.isBuffer(u))throw new TypeError("Argument must be a Buffer");void 0===d&&(d=0);void 0===A&&(A=u?u.length:0);void 0===h&&(h=0);void 0===v&&(v=this.length);if(0>d||A>u.length||0>h||v>this.length)throw new RangeError("out of range index");if(h>=v&&d>=A)return 0;if(h>=v)return-1; + if(d>=A)return 1;d>>>=0;A>>>=0;h>>>=0;v>>>=0;if(this===u)return 0;var P=v-h,e=A-d,y=Math.min(P,e);h=this.slice(h,v);u=u.slice(d,A);for(d=0;dv)A=v;if(0A||0>d)||d>this.length)throw new RangeError("Attempt to write outside buffer bounds");h||(h="utf8");for(v=!1;;)switch(h){case "hex":a:{d=Number(d)||0;h=this.length-d;A?(A=Number(A),A>h&&(A=h)):A=h;h=u.length;if(0!==h%2)throw new TypeError("Invalid hex string"); + A>h/2&&(A=h/2);for(h=0;h(v-=2));++e){var y=h.charCodeAt(e);u=y>>8;y%=256;P.push(y);P.push(u)}return S(P, + this,d,A);default:if(v)throw new TypeError("Unknown encoding: "+h);h=(""+h).toLowerCase();v=!0}};b.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var H=4096;b.prototype.slice=function(u,d){var A=this.length;u=~~u;d=void 0===d?A:~~d;0>u?(u+=A,0>u&&(u=0)):u>A&&(u=A);0>d?(d+=A,0>d&&(d=0)):d>A&&(d=A);d=128*h&&(A-=Math.pow(2,8*d));return A};b.prototype.readIntBE=function(u,d,A){u|=0;d|=0;A||M(u, + d,this.length);A=d;for(var h=1,v=this[u+--A];0=128*h&&(v-=Math.pow(2,8*d));return v};b.prototype.readInt8=function(u,d){d||M(u,1,this.length);return this[u]&128?-1*(255-this[u]+1):this[u]};b.prototype.readInt16LE=function(u,d){d||M(u,2,this.length);u=this[u]|this[u+1]<<8;return u&32768?u|4294901760:u};b.prototype.readInt16BE=function(u,d){d||M(u,2,this.length);u=this[u+1]|this[u]<<8;return u&32768?u|4294901760:u};b.prototype.readInt32LE=function(u,d){d||M(u,4,this.length); + return this[u]|this[u+1]<<8|this[u+2]<<16|this[u+3]<<24};b.prototype.readInt32BE=function(u,d){d||M(u,4,this.length);return this[u]<<24|this[u+1]<<16|this[u+2]<<8|this[u+3]};b.prototype.readFloatLE=function(u,d){d||M(u,4,this.length);return Q.read(this,u,!0,23,4)};b.prototype.readFloatBE=function(u,d){d||M(u,4,this.length);return Q.read(this,u,!1,23,4)};b.prototype.readDoubleLE=function(u,d){d||M(u,8,this.length);return Q.read(this,u,!0,52,8)};b.prototype.readDoubleBE=function(u,d){d||M(u,8,this.length); + return Q.read(this,u,!1,52,8)};b.prototype.writeUIntLE=function(u,d,A,h){u=+u;d|=0;A|=0;h||f(this,u,d,A,Math.pow(2,8*A)-1,0);h=1;var v=0;for(this[d]=u&255;++v>>8):N(this,u,d,!0);return d+2};b.prototype.writeUInt16BE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>8,this[d+1]=u&255):N(this,u,d,!1);return d+2};b.prototype.writeUInt32LE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[d+3]=u>>>24,this[d+2]=u>>>16,this[d+1]=u>>>8,this[d]=u&255): + T(this,u,d,!0);return d+4};b.prototype.writeUInt32BE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>24,this[d+1]=u>>>16,this[d+2]=u>>>8,this[d+3]=u&255):T(this,u,d,!1);return d+4};b.prototype.writeIntLE=function(u,d,A,h){u=+u;d|=0;h||(h=Math.pow(2,8*A-1),f(this,u,d,A,h-1,-h));h=0;var v=1,P=0;for(this[d]=u&255;++hu&&0===P&&0!==this[d+h-1]&&(P=1),this[d+h]=(u/v>>0)-P&255;return d+A};b.prototype.writeIntBE=function(u,d,A,h){u=+u;d|=0;h||(h= + Math.pow(2,8*A-1),f(this,u,d,A,h-1,-h));h=A-1;var v=1,P=0;for(this[d+h]=u&255;0<=--h&&(v*=256);)0>u&&0===P&&0!==this[d+h+1]&&(P=1),this[d+h]=(u/v>>0)-P&255;return d+A};b.prototype.writeInt8=function(u,d,A){u=+u;d|=0;A||f(this,u,d,1,127,-128);b.TYPED_ARRAY_SUPPORT||(u=Math.floor(u));0>u&&(u=255+u+1);this[d]=u&255;return d+1};b.prototype.writeInt16LE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[d]=u&255,this[d+1]=u>>>8):N(this,u,d,!0);return d+2};b.prototype.writeInt16BE= + function(u,d,A){u=+u;d|=0;A||f(this,u,d,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>8,this[d+1]=u&255):N(this,u,d,!1);return d+2};b.prototype.writeInt32LE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,2147483647,-2147483648);b.TYPED_ARRAY_SUPPORT?(this[d]=u&255,this[d+1]=u>>>8,this[d+2]=u>>>16,this[d+3]=u>>>24):T(this,u,d,!0);return d+4};b.prototype.writeInt32BE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,2147483647,-2147483648);0>u&&(u=4294967295+u+1);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>24,this[d+ + 1]=u>>>16,this[d+2]=u>>>8,this[d+3]=u&255):T(this,u,d,!1);return d+4};b.prototype.writeFloatLE=function(u,d,A){return F(this,u,d,!0,A)};b.prototype.writeFloatBE=function(u,d,A){return F(this,u,d,!1,A)};b.prototype.writeDoubleLE=function(u,d,A){return G(this,u,d,!0,A)};b.prototype.writeDoubleBE=function(u,d,A){return G(this,u,d,!1,A)};b.prototype.copy=function(u,d,A,h){A||(A=0);h||0===h||(h=this.length);d>=u.length&&(d=u.length);d||(d=0);0d)throw new RangeError("targetStart out of bounds");if(0>A||A>=this.length)throw new RangeError("sourceStart out of bounds");if(0>h)throw new RangeError("sourceEnd out of bounds");h>this.length&&(h=this.length);u.length-dv||!b.TYPED_ARRAY_SUPPORT)for(h=0;hv&&(u=v)}if(void 0!==h&&"string"!==typeof h)throw new TypeError("encoding must be a string");if("string"===typeof h&&!b.isEncoding(h))throw new TypeError("Unknown encoding: "+h);}else"number"===typeof u&&(u&=255);if(0>d||this.length>>=0;A=void 0===A?this.length:A>>>0;u||(u=0);if("number"=== + typeof u)for(h=d;hb||isNaN(b))throw TypeError("n must be a positive number");this._maxListeners=b;return this};n.prototype.emit=function(b){var l;this._events||(this._events={});if("error"===b&&(!this._events.error||g(this._events.error)&&!this._events.error.length)){var a= + arguments[1];if(a instanceof Error)throw a;var c=Error('Uncaught, unspecified "error" event. ('+a+")");c.context=a;throw c;}c=this._events[b];if(void 0===c)return!1;if(m(c))switch(arguments.length){case 1:c.call(this);break;case 2:c.call(this,arguments[1]);break;case 3:c.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),c.apply(this,a)}else if(g(c)){a=Array.prototype.slice.call(arguments,1);var t=c.slice();c=t.length;for(l=0;ll&&(this._events[b].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", + this._events[b].length),"function"===typeof console.trace&&console.trace());return this};n.prototype.on=n.prototype.addListener;n.prototype.once=function(b,l){function a(){this.removeListener(b,a);c||(c=!0,l.apply(this,arguments))}if(!m(l))throw TypeError("listener must be a function");var c=!1;a.listener=l;this.on(b,a);return this};n.prototype.removeListener=function(b,l){if(!m(l))throw TypeError("listener must be a function");if(!this._events||!this._events[b])return this;var a=this._events[b]; + var c=a.length;var t=-1;if(a===l||m(a.listener)&&a.listener===l)delete this._events[b],this._events.removeListener&&this.emit("removeListener",b,l);else if(g(a)){for(;0t)return this;1===a.length?(a.length=0,delete this._events[b]):a.splice(t,1);this._events.removeListener&&this.emit("removeListener",b,l)}return this};n.prototype.removeAllListeners=function(b){if(!this._events)return this;if(!this._events.removeListener)return 0=== + arguments.length?this._events={}:this._events[b]&&delete this._events[b],this;if(0===arguments.length){for(l in this._events)"removeListener"!==l&&this.removeAllListeners(l);this.removeAllListeners("removeListener");this._events={};return this}var l=this._events[b];if(m(l))this.removeListener(b,l);else if(l)for(;l.length;)this.removeListener(b,l[l.length-1]);delete this._events[b];return this};n.prototype.listeners=function(b){return this._events&&this._events[b]?m(this._events[b])?[this._events[b]]: + this._events[b].slice():[]};n.prototype.listenerCount=function(b){if(this._events){b=this._events[b];if(m(b))return 1;if(b)return b.length}return 0};n.listenerCount=function(b,l){return b.listenerCount(l)}},{}],80:[function(x,W,D){D.read=function(n,m,g,b,l){var a=8*l-b-1;var c=(1<>1,p=-7;l=g?l-1:0;var w=g?-1:1,r=n[m+l];l+=w;g=r&(1<<-p)-1;r>>=-p;for(p+=a;0>=-p;for(p+=b;0>1,r=23===l?Math.pow(2,-24)-Math.pow(2,-77):0;a=b?0:a-1;var E=b?1:-1,K=0>m||0===m&&0>1/m?1:0;m=Math.abs(m);isNaN(m)||Infinity===m?(m=isNaN(m)?1:0,b=p):(b=Math.floor(Math.log(m)/Math.LN2),1>m*(c=Math.pow(2,-b))&&(b--,c*=2),m=1<=b+w?m+r/c:m+r*Math.pow(2,1-w),2<=m*c&&(b++,c/=2),b+w>=p?(m=0,b=p):1<=b+w?(m=(m*c-1)*Math.pow(2,l),b+=w):(m=m*Math.pow(2,w-1)*Math.pow(2,l),b=0));for(;8<= + l;n[g+a]=m&255,a+=E,m/=256,l-=8);b=b<>2,g=(g&3)<<4|b>>4,c=(b&15)<<2|l>>6,t=l&63,isNaN(b)?c=t=64:isNaN(l)&& + (t=64),m=m+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(a)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(g)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(t);return m};D.decode=function(n,m){m="";var g=0;for(n=n.replace(/[^A-Za-z0-9\+\/=]/g,"");g>4;l=(l&15)<<4|a>>2;var t=(a&3)<<6|c;m+=String.fromCharCode(b);64!=a&&(m+=String.fromCharCode(l));64!=c&&(m+=String.fromCharCode(t))}return m}},{}],85:[function(x,W,D){function n(){this.crc32=this.uncompressedSize= + this.compressedSize=0;this.compressedContent=this.compressionMethod=null}n.prototype={getContent:function(){return null},getCompressedContent:function(){return null}};W.exports=n},{}],86:[function(x,W,D){D.STORE={magic:"\x00\x00",compress:function(n,m){return n},uncompress:function(n){return n},compressInputType:null,uncompressInputType:null};D.DEFLATE=x("./flate")},{"./flate":91}],87:[function(x,W,D){var n=x("./utils"),m=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035, + 249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705, + 3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311, + 2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245, + 2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498, + 2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552, + 615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];W.exports=function(g,b){if("undefined"===typeof g||!g.length)return 0;var l="string"!==n.getTypeOf(g);"undefined"==typeof b&&(b=0);b^=-1;for(var a=0,c=g.length;a>>8^t}return b^-1}},{"./utils":104}],88:[function(x,W,D){function n(g){this.data=null;this.index=this.length=0}var m=x("./utils");n.prototype= + {checkOffset:function(g){this.checkIndex(this.index+g)},checkIndex:function(g){if(this.lengthg)throw Error("End of data reached (data length = "+this.length+", asked index = "+g+"). Corrupted zip ?");},setIndex:function(g){this.checkIndex(g);this.index=g},skip:function(g){this.setIndex(this.index+g)},byteAt:function(g){},readInt:function(g){var b=0,l;this.checkOffset(g);for(l=this.index+g-1;l>=this.index;l--)b=(b<<8)+this.byteAt(l);this.index+=g;return b},readString:function(g){return m.transformTo("string", + this.readData(g))},readData:function(g){},lastIndexOfSignature:function(g){},readDate:function(){var g=this.readInt(4);return new Date((g>>25&127)+1980,(g>>21&15)-1,g>>16&31,g>>11&31,g>>5&63,(g&31)<<1)}};W.exports=n},{"./utils":104}],89:[function(x,W,D){D.base64=!1;D.binary=!1;D.dir=!1;D.createFolders=!1;D.date=null;D.compression=null;D.compressionOptions=null;D.comment=null;D.unixPermissions=null;D.dosPermissions=null},{}],90:[function(x,W,D){var n=x("./utils");D.string2binary=function(m){return n.string2binary(m)}; + D.string2Uint8Array=function(m){return n.transformTo("uint8array",m)};D.uint8Array2String=function(m){return n.transformTo("string",m)};D.string2Blob=function(m){m=n.transformTo("arraybuffer",m);return n.arrayBuffer2Blob(m)};D.arrayBuffer2Blob=function(m){return n.arrayBuffer2Blob(m)};D.transformTo=function(m,g){return n.transformTo(m,g)};D.getTypeOf=function(m){return n.getTypeOf(m)};D.checkSupport=function(m){return n.checkSupport(m)};D.MAX_VALUE_16BITS=n.MAX_VALUE_16BITS;D.MAX_VALUE_32BITS=n.MAX_VALUE_32BITS; + D.pretty=function(m){return n.pretty(m)};D.findCompression=function(m){return n.findCompression(m)};D.isRegExp=function(m){return n.isRegExp(m)}},{"./utils":104}],91:[function(x,W,D){W="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;var n=x("pako");D.uncompressInputType=W?"uint8array":"array";D.compressInputType=W?"uint8array":"array";D.magic="\b\x00";D.compress=function(m,g){return n.deflateRaw(m,{level:g.level||-1})};D.uncompress=function(m){return n.inflateRaw(m)}}, + {pako:120}],92:[function(x,W,D){function n(g,b){if(!(this instanceof n))return new n(g,b);this.files={};this.comment=null;this.root="";g&&this.load(g,b);this.clone=function(){var l=new n,a;for(a in this)"function"!==typeof this[a]&&(l[a]=this[a]);return l}}var m=x("./base64");n.prototype=x("./object");n.prototype.load=x("./load");n.support=x("./support");n.defaults=x("./defaults");n.utils=x("./deprecatedPublicUtils");n.base64={encode:function(g){return m.encode(g)},decode:function(g){return m.decode(g)}}; + n.compressions=x("./compressions");W.exports=n},{"./base64":84,"./compressions":86,"./defaults":89,"./deprecatedPublicUtils":90,"./load":93,"./object":96,"./support":100}],93:[function(x,W,D){var n=x("./base64"),m=x("./zipEntries");W.exports=function(g,b){var l;b=b||{};b.base64&&(g=n.decode(g));var a=new m(g,b);g=a.files;for(l=0;l>>=8;return J},f=function(){var G={},k,J;for(k=0;kx;x++)b[x]=252<=x?6:248<=x?5:240<=x?4:224<=x?3:192<=x?2:1;b[254]=b[254]=1;var l=function(a){var c,t,p=a.length,w=Array(2*p);for(c=t=0;cr)w[t++]= + r;else{var E=b[r];if(4r?w[t++]=r:(r-=65536,w[t++]=55296|r>>10&1023,w[t++]=56320|r&1023)}}}w.length!==t&&(w.subarray?w=w.subarray(0,t):w.length=t);return n.applyFromCharCode(w)};D.utf8encode=function(a){if(m.nodebuffer)return g(a,"utf-8");var c,t,p=a.length,w=0;for(c=0;cr?1:2048>r?2:65536>r?3:4}var K=m.uint8array?new Uint8Array(w):Array(w);for(c=t=0;tr?K[t++]=r:(2048>r?K[t++]=192|r>>>6:(65536>r?K[t++]=224|r>>>12:(K[t++]=240|r>>>18,K[t++]=128|r>>>12&63),K[t++]=128|r>>>6&63),K[t++]=128|r&63);return K};D.utf8decode=function(a){if(m.nodebuffer)return n.transformTo("nodebuffer",a).toString("utf-8");a=n.transformTo(m.uint8array? + "uint8array":"array",a);for(var c=[],t=0,p=a.length;ta.length&&(r=a.length);for(w=r-1;0<=w&&128===(a[w]&192);)w--;w=0>w?r:0===w?r:w+b[a[w]]>r?w:r;m.uint8array?c.push(l(a.subarray(t,w))):c.push(l(a.slice(t,w)));t=w}return c.join("")}},{"./nodeBuffer":94,"./support":100,"./utils":104}],104:[function(x,W,D){function n(p){return p}function m(p,w){for(var r=0;rE?"0":"")+E.toString(16).toUpperCase()}return w};D.findCompression=function(p){for(var w in a)if(a.hasOwnProperty(w)&&a[w].magic===p)return a[w];return null};D.isRegExp=function(p){return"[object RegExp]"===Object.prototype.toString.call(p)}},{"./compressions":86,"./nodeBuffer":94,"./support":100}],105:[function(x,W, + D){function n(w,r){this.files=[];this.loadOptions=r;w&&this.load(w)}var m=x("./stringReader"),g=x("./nodeBufferReader"),b=x("./uint8ArrayReader"),l=x("./utils"),a=x("./signature"),c=x("./zipEntry"),t=x("./support"),p=x("./object");n.prototype={checkSignature:function(w){var r=this.reader.readString(4);if(r!==w)throw Error("Corrupted zip or bug : unexpected signature ("+l.pretty(r)+", expected "+l.pretty(w)+")");},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2);this.diskWithCentralDirStart= + this.reader.readInt(2);this.centralDirRecordsOnThisDisk=this.reader.readInt(2);this.centralDirRecords=this.reader.readInt(2);this.centralDirSize=this.reader.readInt(4);this.centralDirOffset=this.reader.readInt(4);this.zipCommentLength=this.reader.readInt(2);this.zipComment=this.reader.readString(this.zipCommentLength);this.zipComment=p.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8);this.versionMadeBy=this.reader.readString(2);this.versionNeeded= + this.reader.readInt(2);this.diskNumber=this.reader.readInt(4);this.diskWithCentralDirStart=this.reader.readInt(4);this.centralDirRecordsOnThisDisk=this.reader.readInt(8);this.centralDirRecords=this.reader.readInt(8);this.centralDirSize=this.reader.readInt(8);this.centralDirOffset=this.reader.readInt(8);this.zip64ExtensibleData={};for(var w=this.zip64EndOfCentralSize-44,r,E,K;0>8;this.dir=this.externalFileAttributes&16?!0:!1;0===a&&(this.dosPermissions=this.externalFileAttributes& + 63);3===a&&(this.unixPermissions=this.externalFileAttributes>>16&65535);this.dir||"/"!==this.fileName.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){this.extraFields[1]&&(a=new m(this.extraFields[1].value),this.uncompressedSize===g.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===g.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===g.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===g.MAX_VALUE_32BITS&& + (this.diskNumberStart=a.readInt(4)))},readExtraFields:function(a){var c=a.index;for(this.extraFields=this.extraFields||{};a.indexm.length)throw Error("Failure must have errors");return new n({status:"failure",remaining:g,errors:m})},error:function(m,g){if(1>m.length)throw Error("Failure must have errors");return new n({status:"error",remaining:g,errors:m})},success:function(m,g,b){return new n({status:"success",value:m,source:b,remaining:g,errors:[]})},cut:function(m){return new n({status:"cut",remaining:m,errors:[]})}}; + var n=function(m){this._value=m.value;this._status=m.status;this._hasValue=void 0!==m.value;this._remaining=m.remaining;this._source=m.source;this._errors=m.errors};n.prototype.map=function(m){return this._hasValue?new n({value:m(this._value,this._source),status:this._status,remaining:this._remaining,source:this._source,errors:this._errors}):this};n.prototype.changeRemaining=function(m){return new n({value:this._value,status:this._status,remaining:m,source:this._source,errors:this._errors})};n.prototype.isSuccess= + function(){return"success"===this._status||"cut"===this._status};n.prototype.isFailure=function(){return"failure"===this._status};n.prototype.isError=function(){return"error"===this._status};n.prototype.isCut=function(){return"cut"===this._status};n.prototype.value=function(){return this._value};n.prototype.remaining=function(){return this._remaining};n.prototype.source=function(){return this._source};n.prototype.errors=function(){return this._errors}},{}],116:[function(x,W,D){var n=x("./Token"), + m=x("./StringSource");D.RegexTokeniser=function(g){g=g.map(function(b){return{name:b.name,regex:new RegExp(b.regex.source,"g")}});return{tokenise:function(b,l){l=new m(b,l);var a=0;for(var c=[];ap)){t=new n(g[r].name,E[1],w.range(p,a));break a}}a=p+1;t=new n("unrecognisedCharacter",t.substring(p,a),w.range(p,a))}c.push(t)}c.push(new n("end",null,l.range(b.length, + b.length)));return c}}}},{"./StringSource":108,"./Token":109}],117:[function(x,W,D){function n(E){return l.success(null,E)}function m(E,K){var U=E.head();K=U?a.error({expected:K,actual:r(U),location:U.source}):a.error({expected:K,actual:"end of tokens"});return l.failure([K],E)}var g=x("underscore"),b=x("option"),l=x("./parsing-results"),a=x("./errors"),c=x("./lazy-iterators");D.token=function(E,K){var U=void 0!==K;return function(O){var z=O.head();return!z||z.name!==E||U&&z.value!==K?(z=r({name:E, + value:K}),m(O,z)):l.success(z.value,O.tail(),z.source)}};D.tokenOfType=function(E){return D.token(E)};D.firstOf=function(E,K){g.isArray(K)||(K=Array.prototype.slice.call(arguments,1));return function(U){return c.fromArray(K).map(function(O){return O(U)}).filter(function(O){return O.isSuccess()||O.isError()}).first()||m(U,E)}};D.then=function(E,K){return function(U){U=E(U);U.map||console.log(U);return U.map(K)}};D.sequence=function(){function E(O){return O.isCaptured}var K=Array.prototype.slice.call(arguments, + 0),U=function(O){var z=g.foldl(K,function(f,N){var T=f.result;f=f.hasCut;if(!T.isSuccess())return{result:T,hasCut:f};var q=N(T.remaining());return q.isCut()?{result:T,hasCut:!0}:q.isSuccess()?(N=N.isCaptured?T.value().withValue(N,q.value()):T.value(),T=q.remaining(),q=O.to(T),{result:l.success(N,T,q),hasCut:f}):f?{result:l.error(q.errors(),q.remaining()),hasCut:f}:{result:q,hasCut:f}},{result:l.success(new t,O),hasCut:!1}).result,M=O.to(z.remaining());return z.map(function(f){return f.withValue(D.sequence.source, + M)})};U.head=function(){var O=g.find(K,E);return D.then(U,D.sequence.extract(O))};U.map=function(O){return D.then(U,function(z){return O.apply(this,z.toArray())})};return U};var t=function(E,K){this._values=E||{};this._valuesArray=K||[]};t.prototype.withValue=function(E,K){if(E.captureName&&E.captureName in this._values)throw Error('Cannot add second value for capture "'+E.captureName+'"');var U=g.clone(this._values);U[E.captureName]=K;E=this._valuesArray.concat([K]);return new t(U,E)};t.prototype.get= + function(E){if(E.captureName in this._values)return this._values[E.captureName];throw Error('No value for capture "'+E.captureName+'"');};t.prototype.toArray=function(){return this._valuesArray};D.sequence.capture=function(E,K){var U=function(){return E.apply(this,arguments)};U.captureName=K;U.isCaptured=!0;return U};D.sequence.extract=function(E){return function(K){return K.get(E)}};D.sequence.applyValues=function(E){var K=Array.prototype.slice.call(arguments,1);return function(U){var O=K.map(function(z){return U.get(z)}); + return E.apply(this,O)}};D.sequence.source={captureName:"\u2603source\u2603"};D.sequence.cut=function(){return function(E){return l.cut(E)}};D.optional=function(E){return function(K){var U=E(K);return U.isSuccess()?U.map(b.some):U.isFailure()?l.success(b.none,K):U}};D.zeroOrMoreWithSeparator=function(E,K){return w(E,K,!1)};D.oneOrMoreWithSeparator=function(E,K){return w(E,K,!0)};var p=D.zeroOrMore=function(E){return function(K){for(var U=[],O;(O=E(K))&&O.isSuccess();)K=O.remaining(),U.push(O.value()); + return O.isError()?O:l.success(U,K)}};D.oneOrMore=function(E){return D.oneOrMoreWithSeparator(E,n)};var w=function(E,K,U){return function(O){var z=E(O);return z.isSuccess()?(O=D.sequence.capture(E,"main"),O=p(D.then(D.sequence(K,O),D.sequence.extract(O)))(z.remaining()),l.success([z.value()].concat(O.value()),O.remaining())):U||z.isError()?z:l.success([],O)}};D.leftAssociative=function(E,K,U){K=U?[{func:U,rule:K}]:K;K=K.map(function(z){return D.then(z.rule,function(M){return function(f,N){return z.func(f, + M,N)}})});var O=D.firstOf.apply(null,["rules"].concat(K));return function(z){var M=E(z);if(!M.isSuccess())return M;for(var f=O(M.remaining());f.isSuccess();){var N=f.remaining(),T=z.to(f.remaining());f=f.value();M=l.success(f(M.value(),T),N,T);f=O(M.remaining())}return f.isError()?f:M}};D.leftAssociative.firstOf=function(){return Array.prototype.slice.call(arguments,0)};D.nonConsuming=function(E){return function(K){return E(K).changeRemaining(K)}};var r=function(E){return E.value?E.name+' "'+E.value+ + '"':E.name}},{"./errors":112,"./lazy-iterators":113,"./parsing-results":115,option:119,underscore:118}],118:[function(x,W,D){(function(){var n=this,m=n._,g={},b=Array.prototype,l=Object.prototype,a=b.push,c=b.slice,t=b.concat,p=l.toString,w=l.hasOwnProperty,r=b.forEach,E=b.map,K=b.reduce,U=b.reduceRight,O=b.filter,z=b.every,M=b.some,f=b.indexOf,N=b.lastIndexOf;l=Array.isArray;var T=Object.keys,q=Function.prototype.bind,F=function(h){if(h instanceof F)return h;if(!(this instanceof F))return new F(h); + this._wrapped=h};"undefined"!==typeof D?("undefined"!==typeof W&&W.exports&&(D=W.exports=F),D._=F):n._=F;F.VERSION="1.4.4";var G=F.each=F.forEach=function(h,v,P){if(null!=h)if(r&&h.forEach===r)h.forEach(v,P);else if(h.length===+h.length)for(var e=0,y=h.length;eh.length)return Math.max.apply(Math,h);if(!v&&F.isEmpty(h))return-Infinity; + var e={computed:-Infinity,value:-Infinity};G(h,function(y,C,L){C=v?v.call(P,y,C,L):y;C>=e.computed&&(e={value:y,computed:C})});return e.value};F.min=function(h,v,P){if(!v&&F.isArray(h)&&h[0]===+h[0]&&65535>h.length)return Math.min.apply(Math,h);if(!v&&F.isEmpty(h))return Infinity;var e={computed:Infinity,value:Infinity};G(h,function(y,C,L){C=v?v.call(P,y,C,L):y;CV||void 0===L)return 1;if(L>>1;P.call(e,h[L])P?Math.max(0,y+P):P;else return e=F.sortedIndex(h,v),h[e]===v?e:-1; + if(f&&h.indexOf===f)return h.indexOf(v,P);for(;e=arguments.length&&(v=h||0,h=0);P=arguments[2]||1;for(var e=Math.max(Math.ceil((v-h)/P),0),y=0,C=Array(e);y=Z?(clearTimeout(y),y=null,L=Y,C=h.apply(P,e)):y||(y=setTimeout(V,Z));return C}};F.debounce=function(h,v,P){var e,y;return function(){var C=this,L=arguments,V=P&&!e;clearTimeout(e); + e=setTimeout(function(){e=null;P||(y=h.apply(C,L))},v);V&&(y=h.apply(C,L));return y}};F.once=function(h){var v=!1,P;return function(){if(v)return P;v=!0;P=h.apply(this,arguments);h=null;return P}};F.wrap=function(h,v){return function(){var P=[h];a.apply(P,arguments);return v.apply(this,P)}};F.compose=function(){var h=arguments;return function(){for(var v=arguments,P=h.length-1;0<=P;P--)v=[h[P].apply(this,v)];return v[0]}};F.after=function(h,v){return 0>=h?v():function(){if(1>--h)return v.apply(this, + arguments)}};F.keys=T||function(h){if(h!==Object(h))throw new TypeError("Invalid object");var v=[],P;for(P in h)F.has(h,P)&&(v[v.length]=P);return v};F.values=function(h){var v=[],P;for(P in h)F.has(h,P)&&v.push(h[P]);return v};F.pairs=function(h){var v=[],P;for(P in h)F.has(h,P)&&v.push([P,h[P]]);return v};F.invert=function(h){var v={},P;for(P in h)F.has(h,P)&&(v[h[P]]=P);return v};F.functions=F.methods=function(h){var v=[],P;for(P in h)F.isFunction(h[P])&&v.push(P);return v.sort()};F.extend=function(h){G(c.call(arguments, + 1),function(v){if(v)for(var P in v)h[P]=v[P]});return h};F.pick=function(h){var v={},P=t.apply(b,c.call(arguments,1));G(P,function(e){e in h&&(v[e]=h[e])});return v};F.omit=function(h){var v={},P=t.apply(b,c.call(arguments,1)),e;for(e in h)F.contains(P,e)||(v[e]=h[e]);return v};F.defaults=function(h){G(c.call(arguments,1),function(v){if(v)for(var P in v)null==h[P]&&(h[P]=v[P])});return h};F.clone=function(h){return F.isObject(h)?F.isArray(h)?h.slice():F.extend({},h):h};F.tap=function(h,v){v(h);return h}; + var R=function(h,v,P,e){if(h===v)return 0!==h||1/h==1/v;if(null==h||null==v)return h===v;h instanceof F&&(h=h._wrapped);v instanceof F&&(v=v._wrapped);var y=p.call(h);if(y!=p.call(v))return!1;switch(y){case "[object String]":return h==String(v);case "[object Number]":return h!=+h?v!=+v:0==h?1/h==1/v:h==+v;case "[object Date]":case "[object Boolean]":return+h==+v;case "[object RegExp]":return h.source==v.source&&h.global==v.global&&h.multiline==v.multiline&&h.ignoreCase==v.ignoreCase}if("object"!= + typeof h||"object"!=typeof v)return!1;for(var C=P.length;C--;)if(P[C]==h)return e[C]==v;P.push(h);e.push(v);C=0;var L=!0;if("[object Array]"==y){if(C=h.length,L=C==v.length)for(;C--&&(L=R(h[C],v[C],P,e)););}else{y=h.constructor;var V=v.constructor;if(y!==V&&!(F.isFunction(y)&&y instanceof y&&F.isFunction(V)&&V instanceof V))return!1;for(var Y in h)if(F.has(h,Y)&&(C++,!(L=F.has(v,Y)&&R(h[Y],v[Y],P,e))))break;if(L){for(Y in v)if(F.has(v,Y)&&!C--)break;L=!C}}P.pop();e.pop();return L};F.isEqual=function(h, + v){return R(h,v,[],[])};F.isEmpty=function(h){if(null==h)return!0;if(F.isArray(h)||F.isString(h))return 0===h.length;for(var v in h)if(F.has(h,v))return!1;return!0};F.isElement=function(h){return!(!h||1!==h.nodeType)};F.isArray=l||function(h){return"[object Array]"==p.call(h)};F.isObject=function(h){return h===Object(h)};G("Arguments Function String Number Date RegExp".split(" "),function(h){F["is"+h]=function(v){return p.call(v)=="[object "+h+"]"}});F.isArguments(arguments)||(F.isArguments=function(h){return!(!h|| + !F.has(h,"callee"))});"function"!==typeof/./&&(F.isFunction=function(h){return"function"===typeof h});F.isFinite=function(h){return isFinite(h)&&!isNaN(parseFloat(h))};F.isNaN=function(h){return F.isNumber(h)&&h!=+h};F.isBoolean=function(h){return!0===h||!1===h||"[object Boolean]"==p.call(h)};F.isNull=function(h){return null===h};F.isUndefined=function(h){return void 0===h};F.has=function(h,v){return w.call(h,v)};F.noConflict=function(){n._=m;return this};F.identity=function(h){return h};F.times= + function(h,v,P){for(var e=Array(h),y=0;y":">",'"':""","'":"'","/":"/"}};Q.unescape=F.invert(Q.escape);var B={escape:new RegExp("["+F.keys(Q.escape).join("")+"]","g"),unescape:new RegExp("("+F.keys(Q.unescape).join("|")+")","g")};F.each(["escape","unescape"],function(h){F[h]=function(v){return null==v?"":(""+v).replace(B[h], + function(P){return Q[h][P]})}});F.result=function(h,v){if(null==h)return null;v=h[v];return F.isFunction(v)?v.call(h):v};F.mixin=function(h){G(F.functions(h),function(v){var P=F[v]=h[v];F.prototype[v]=function(){var e=[this._wrapped];a.apply(e,arguments);return A.call(this,P.apply(F,e))}})};var H=0;F.uniqueId=function(h){var v=++H+"";return h?h+v:v};F.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var X=/(.)^/,u={"'":"'","\\":"\\","\r":"r","\n":"n", + "\t":"t","\u2028":"u2028","\u2029":"u2029"},d=/\\|'|\r|\n|\t|\u2028|\u2029/g;F.template=function(h,v,P){P=F.defaults({},P,F.templateSettings);var e=new RegExp([(P.escape||X).source,(P.interpolate||X).source,(P.evaluate||X).source].join("|")+"|$","g"),y=0,C="__p+='";h.replace(e,function(V,Y,Z,ca,fa){C+=h.slice(y,fa).replace(d,function(ha){return"\\"+u[ha]});Y&&(C+="'+\n((__t=("+Y+"))==null?'':_.escape(__t))+\n'");Z&&(C+="'+\n((__t=("+Z+"))==null?'':__t)+\n'");ca&&(C+="';\n"+ca+"\n__p+='");y=fa+V.length; + return V});C+="';\n";P.variable||(C="with(obj||{}){\n"+C+"}\n");C="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+C+"return __p;\n";try{var L=new Function(P.variable||"obj","_",C)}catch(V){throw V.source=C,V;}if(v)return L(v,F);v=function(V){return L.call(this,V,F)};v.source="function("+(P.variable||"obj")+"){\n"+C+"}";return v};F.chain=function(h){return F(h).chain()};var A=function(h){return this._chain?F(h).chain():h};F.mixin(F);G("pop push reverse shift sort splice unshift".split(" "), + function(h){var v=b[h];F.prototype[h]=function(){var P=this._wrapped;v.apply(P,arguments);"shift"!=h&&"splice"!=h||0!==P.length||delete P[0];return A.call(this,P)}});G(["concat","join","slice"],function(h){var v=b[h];F.prototype[h]=function(){return A.call(this,v.apply(this._wrapped,arguments))}});F.extend(F.prototype,{chain:function(){this._chain=!0;return this},value:function(){return this._wrapped}})}).call(this)},{}],119:[function(x,W,D){function n(g){return"function"==typeof g?g():g}D.none=Object.create({value:function(){throw Error("Called value on none"); + },isNone:function(){return!0},isSome:function(){return!1},map:function(){return D.none},flatMap:function(){return D.none},toArray:function(){return[]},orElse:n,valueOrElse:n});D.some=function(g){return new m(g)};var m=function(g){this._value=g};m.prototype.value=function(){return this._value};m.prototype.isNone=function(){return!1};m.prototype.isSome=function(){return!0};m.prototype.map=function(g){return new m(g(this._value))};m.prototype.flatMap=function(g){return g(this._value)};m.prototype.toArray= + function(){return[this._value]};m.prototype.orElse=function(g){return this};m.prototype.valueOrElse=function(g){return this._value};D.isOption=function(g){return g===D.none||g instanceof m};D.fromNullable=function(g){return null==g?D.none:new m(g)}},{}],120:[function(x,W,D){D=x("./lib/utils/common").assign;var n=x("./lib/deflate"),m=x("./lib/inflate");x=x("./lib/zlib/constants");var g={};D(g,n,m,x);W.exports=g},{"./lib/deflate":121,"./lib/inflate":122,"./lib/utils/common":123,"./lib/zlib/constants":126}], + 121:[function(x,W,D){function n(p){if(!(this instanceof n))return new n(p);p=this.options=b.assign({level:-1,method:8,chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:""},p||{});p.raw&&0p.windowBits&&(p.windowBits+=16);this.err=0;this.msg="";this.ended=!1;this.chunks=[];this.strm=new c;this.strm.avail_out=0;var w=g.deflateInit2(this.strm,p.level,p.method,p.windowBits,p.memLevel,p.strategy);if(0!==w)throw Error(a[w]);p.header&& + g.deflateSetHeader(this.strm,p.header);if(p.dictionary){p="string"===typeof p.dictionary?l.string2buf(p.dictionary):"[object ArrayBuffer]"===t.call(p.dictionary)?new Uint8Array(p.dictionary):p.dictionary;w=g.deflateSetDictionary(this.strm,p);if(0!==w)throw Error(a[w]);this._dict_set=!0}}function m(p,w){w=new n(w);w.push(p,!0);if(w.err)throw w.msg;return w.result}var g=x("./zlib/deflate"),b=x("./utils/common"),l=x("./utils/strings"),a=x("./zlib/messages"),c=x("./zlib/zstream"),t=Object.prototype.toString; + n.prototype.push=function(p,w){var r=this.strm,E=this.options.chunkSize;if(this.ended)return!1;w=w===~~w?w:!0===w?4:0;"string"===typeof p?r.input=l.string2buf(p):"[object ArrayBuffer]"===t.call(p)?r.input=new Uint8Array(p):r.input=p;r.next_in=0;r.avail_in=r.input.length;do{0===r.avail_out&&(r.output=new b.Buf8(E),r.next_out=0,r.avail_out=E);p=g.deflate(r,w);if(1!==p&&0!==p)return this.onEnd(p),this.ended=!0,!1;if(0===r.avail_out||0===r.avail_in&&(4===w||2===w))if("string"===this.options.to)this.onData(l.buf2binstring(b.shrinkBuf(r.output, + r.next_out)));else this.onData(b.shrinkBuf(r.output,r.next_out))}while((0E.windowBits&&(E.windowBits=-E.windowBits,0===E.windowBits&&(E.windowBits=-15));!(0<=E.windowBits&&16>E.windowBits)|| + r&&r.windowBits||(E.windowBits+=32);15E.windowBits&&0===(E.windowBits&15)&&(E.windowBits|=15);this.err=0;this.msg="";this.ended=!1;this.chunks=[];this.strm=new t;this.strm.avail_out=0;r=g.inflateInit2(this.strm,E.windowBits);if(r!==a.Z_OK)throw Error(c[r]);this.header=new p;g.inflateGetHeader(this.strm,this.header)}function m(r,E){E=new n(E);E.push(r,!0);if(E.err)throw E.msg;return E.result}var g=x("./zlib/inflate"),b=x("./utils/common"),l=x("./utils/strings"),a=x("./zlib/constants"), + c=x("./zlib/messages"),t=x("./zlib/zstream"),p=x("./zlib/gzheader"),w=Object.prototype.toString;n.prototype.push=function(r,E){var K=this.strm,U=this.options.chunkSize,O=this.options.dictionary,z=!1;if(this.ended)return!1;E=E===~~E?E:!0===E?a.Z_FINISH:a.Z_NO_FLUSH;"string"===typeof r?K.input=l.binstring2buf(r):"[object ArrayBuffer]"===w.call(r)?K.input=new Uint8Array(r):K.input=r;K.next_in=0;K.avail_in=K.input.length;do{0===K.avail_out&&(K.output=new b.Buf8(U),K.next_out=0,K.avail_out=U);r=g.inflate(K, + a.Z_NO_FLUSH);r===a.Z_NEED_DICT&&O&&(r="string"===typeof O?l.string2buf(O):"[object ArrayBuffer]"===w.call(O)?new Uint8Array(O):O,r=g.inflateSetDictionary(this.strm,r));r===a.Z_BUF_ERROR&&!0===z&&(r=a.Z_OK,z=!1);if(r!==a.Z_STREAM_END&&r!==a.Z_OK)return this.onEnd(r),this.ended=!0,!1;if(K.next_out&&(0===K.avail_out||r===a.Z_STREAM_END||0===K.avail_in&&(E===a.Z_FINISH||E===a.Z_SYNC_FLUSH)))if("string"===this.options.to){var M=l.utf8border(K.output,K.next_out);var f=K.next_out-M;var N=l.buf2string(K.output, + M);K.next_out=f;K.avail_out=U-f;f&&b.arraySet(K.output,K.output,M,f,0);this.onData(N)}else this.onData(b.shrinkBuf(K.output,K.next_out));0===K.avail_in&&0===K.avail_out&&(z=!0)}while((0c&&(a.subarray&& + b||!a.subarray&&g))return String.fromCharCode.apply(null,m.shrinkBuf(a,c));for(var t="",p=0;px;x++)l[x]=252<=x?6:248<=x?5:240<=x?4:224<=x?3:192<=x?2:1;l[254]=l[254]=1;D.string2buf=function(a){var c,t,p=a.length,w=0;for(c=0;cr?1:2048>r?2:65536>r?3:4}var K=new m.Buf8(w);for(c=t=0;tr?K[t++]=r:(2048>r?K[t++]=192|r>>>6:(65536>r?K[t++]=224|r>>>12:(K[t++]=240|r>>>18,K[t++]=128|r>>>12&63),K[t++]=128|r>>>6&63),K[t++]=128|r&63);return K};D.buf2binstring=function(a){return n(a,a.length)};D.binstring2buf= + function(a){for(var c=new m.Buf8(a.length),t=0,p=c.length;tr)w[t++]=r;else{var E=l[r];if(4r?w[t++]=r:(r-=65536,w[t++]=55296|r>>10&1023,w[t++]=56320|r&1023)}}}return n(w,t)};D.utf8border=function(a,c){var t;c=c||a.length;c>a.length&&(c=a.length);for(t=c-1;0<= + t&&128===(a[t]&192);)t--;return 0>t||0===t?c:t+l[a[t]]>c?t:c}},{"./common":123}],125:[function(x,W,D){W.exports=function(n,m,g,b){var l=n&65535|0;n=n>>>16&65535|0;for(var a;0!==g;){a=2E3b;b++){m=b;for(var l=0;8>l;l++)m=m&1?3988292384^m>>>1:m>>>1;g[b]=m}return g}();W.exports=function(m,g,b,l){b=l+b;for(m^=-1;l>>8^n[(m^g[l])&255];return m^-1}},{}],128:[function(x,W,D){function n(k,J){k.msg=F[J];return J}function m(k){for(var J=k.length;0<= + --J;)k[J]=0}function g(k){var J=k.state,I=J.pending;I>k.avail_out&&(I=k.avail_out);0!==I&&(f.arraySet(k.output,J.pending_buf,J.pending_out,I,k.next_out),k.next_out+=I,J.pending_out+=I,k.total_out+=I,k.avail_out-=I,J.pending-=I,0===J.pending&&(J.pending_out=0))}function b(k,J){N._tr_flush_block(k,0<=k.block_start?k.block_start:-1,k.strstart-k.block_start,J);k.block_start=k.strstart;g(k.strm)}function l(k,J){k.pending_buf[k.pending++]=J}function a(k,J){k.pending_buf[k.pending++]=J>>>8&255;k.pending_buf[k.pending++]= + J&255}function c(k,J){var I=k.max_chain_length,S=k.strstart,R=k.prev_length,Q=k.nice_match,B=k.strstart>k.w_size-262?k.strstart-(k.w_size-262):0,H=k.window,X=k.w_mask,u=k.prev,d=k.strstart+258,A=H[S+R-1],h=H[S+R];k.prev_length>=k.good_match&&(I>>=2);Q>k.lookahead&&(Q=k.lookahead);do{var v=J;if(H[v+R]===h&&H[v+R-1]===A&&H[v]===H[S]&&H[++v]===H[S+1]){S+=2;for(v++;H[++S]===H[++v]&&H[++S]===H[++v]&&H[++S]===H[++v]&&H[++S]===H[++v]&&H[++S]===H[++v]&&H[++S]===H[++v]&&H[++S]===H[++v]&&H[++S]===H[++v]&&S< + d;);v=258-(d-S);S=d-258;if(v>R){k.match_start=J;R=v;if(v>=Q)break;A=H[S+R-1];h=H[S+R]}}}while((J=u[J&X])>B&&0!==--I);return R<=k.lookahead?R:k.lookahead}function t(k){var J=k.w_size,I;do{var S=k.window_size-k.lookahead-k.strstart;if(k.strstart>=J+(J-262)){f.arraySet(k.window,k.window,J,J,0);k.match_start-=J;k.strstart-=J;k.block_start-=J;var R=I=k.hash_size;do{var Q=k.head[--R];k.head[R]=Q>=J?Q-J:0}while(--I);R=I=J;do Q=k.prev[--R],k.prev[R]=Q>=J?Q-J:0;while(--I);S+=J}if(0===k.strm.avail_in)break; + R=k.strm;I=k.window;Q=k.strstart+k.lookahead;var B=R.avail_in;B>S&&(B=S);0===B?I=0:(R.avail_in-=B,f.arraySet(I,R.input,R.next_in,B,Q),1===R.state.wrap?R.adler=T(R.adler,I,B,Q):2===R.state.wrap&&(R.adler=q(R.adler,I,B,Q)),R.next_in+=B,R.total_in+=B,I=B);k.lookahead+=I;if(3<=k.lookahead+k.insert)for(S=k.strstart-k.insert,k.ins_h=k.window[S],k.ins_h=(k.ins_h<k.lookahead+k.insert););}while(262>k.lookahead&&0!==k.strm.avail_in)}function p(k,J){for(var I;;){if(262>k.lookahead){t(k);if(262>k.lookahead&&0===J)return 1;if(0===k.lookahead)break}I=0;3<=k.lookahead&&(k.ins_h=(k.ins_h<k.strstart?k.strstart:2;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function w(k,J){for(var I,S;;){if(262>k.lookahead){t(k);if(262>k.lookahead&&0===J)return 1;if(0===k.lookahead)break}I=0;3<=k.lookahead&&(k.ins_h=(k.ins_h<=k.match_length&&(1===k.strategy||3===k.match_length&&4096k.strstart?k.strstart: + 2;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function r(k,J){for(var I,S,R,Q=k.window;;){if(258>=k.lookahead){t(k);if(258>=k.lookahead&&0===J)return 1;if(0===k.lookahead)break}k.match_length=0;if(3<=k.lookahead&&0 + k.lookahead&&(k.match_length=k.lookahead)}3<=k.match_length?(I=N._tr_tally(k,1,k.match_length-3),k.lookahead-=k.match_length,k.strstart+=k.match_length,k.match_length=0):(I=N._tr_tally(k,0,k.window[k.strstart]),k.lookahead--,k.strstart++);if(I&&(b(k,!1),0===k.strm.avail_out))return 1}k.insert=0;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function E(k,J){for(var I;;){if(0===k.lookahead&&(t(k),0===k.lookahead)){if(0===J)return 1;break}k.match_length= + 0;I=N._tr_tally(k,0,k.window[k.strstart]);k.lookahead--;k.strstart++;if(I&&(b(k,!1),0===k.strm.avail_out))return 1}k.insert=0;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function K(k,J,I,S,R){this.good_length=k;this.max_lazy=J;this.nice_length=I;this.max_chain=S;this.func=R}function U(){this.strm=null;this.status=0;this.pending_buf=null;this.wrap=this.pending=this.pending_out=this.pending_buf_size=0;this.gzhead=null;this.gzindex=0;this.method=8;this.last_flush= + -1;this.w_mask=this.w_bits=this.w_size=0;this.window=null;this.window_size=0;this.head=this.prev=null;this.nice_match=this.good_match=this.strategy=this.level=this.max_lazy_match=this.max_chain_length=this.prev_length=this.lookahead=this.match_start=this.strstart=this.match_available=this.prev_match=this.match_length=this.block_start=this.hash_shift=this.hash_mask=this.hash_bits=this.hash_size=this.ins_h=0;this.dyn_ltree=new f.Buf16(1146);this.dyn_dtree=new f.Buf16(122);this.bl_tree=new f.Buf16(78); + m(this.dyn_ltree);m(this.dyn_dtree);m(this.bl_tree);this.bl_desc=this.d_desc=this.l_desc=null;this.bl_count=new f.Buf16(16);this.heap=new f.Buf16(573);m(this.heap);this.heap_max=this.heap_len=0;this.depth=new f.Buf16(573);m(this.depth);this.bi_valid=this.bi_buf=this.insert=this.matches=this.static_len=this.opt_len=this.d_buf=this.last_lit=this.lit_bufsize=this.l_buf=0}function O(k){if(!k||!k.state)return n(k,-2);k.total_in=k.total_out=0;k.data_type=2;var J=k.state;J.pending=0;J.pending_out=0;0>J.wrap&& + (J.wrap=-J.wrap);J.status=J.wrap?42:113;k.adler=2===J.wrap?0:1;J.last_flush=0;N._tr_init(J);return 0}function z(k){var J=O(k);0===J&&(k=k.state,k.window_size=2*k.w_size,m(k.head),k.max_lazy_match=G[k.level].max_lazy,k.good_match=G[k.level].good_length,k.nice_match=G[k.level].nice_length,k.max_chain_length=G[k.level].max_chain,k.strstart=0,k.block_start=0,k.lookahead=0,k.insert=0,k.match_length=k.prev_length=2,k.match_available=0,k.ins_h=0);return J}function M(k,J,I,S,R,Q){if(!k)return-2;var B=1;-1=== + J&&(J=6);0>S?(B=0,S=-S):15R||9S||15J||9Q||4k.pending_buf_size-5&&(I=k.pending_buf_size-5);;){if(1>=k.lookahead){t(k);if(0===k.lookahead&&0===J)return 1;if(0===k.lookahead)break}k.strstart+=k.lookahead;k.lookahead=0;var S=k.block_start+I;if(0===k.strstart||k.strstart>=S)if(k.lookahead=k.strstart-S,k.strstart= + S,b(k,!1),0===k.strm.avail_out)return 1;if(k.strstart-k.block_start>=k.w_size-262&&(b(k,!1),0===k.strm.avail_out))return 1}k.insert=0;if(4===J)return b(k,!0),0===k.strm.avail_out?3:4;k.strstart>k.block_start&&b(k,!1);return 1}),new K(4,4,8,4,p),new K(4,5,16,8,p),new K(4,6,32,32,p),new K(4,4,16,16,w),new K(8,16,32,32,w),new K(8,16,128,128,w),new K(8,32,128,256,w),new K(32,128,258,1024,w),new K(32,258,258,4096,w)];D.deflateInit=function(k,J){return M(k,J,8,15,8,0)};D.deflateInit2=M;D.deflateReset=z; + D.deflateResetKeep=O;D.deflateSetHeader=function(k,J){if(!k||!k.state||2!==k.state.wrap)return-2;k.state.gzhead=J;return 0};D.deflate=function(k,J){if(!k||!k.state||5J)return k?n(k,-2):-2;var I=k.state;if(!k.output||!k.input&&0!==k.avail_in||666===I.status&&4!==J)return n(k,0===k.avail_out?-5:-2);I.strm=k;var S=I.last_flush;I.last_flush=J;if(42===I.status)if(2===I.wrap)k.adler=0,l(I,31),l(I,139),l(I,8),I.gzhead?(l(I,(I.gzhead.text?1:0)+(I.gzhead.hcrc?2:0)+(I.gzhead.extra?4:0)+(I.gzhead.name? + 8:0)+(I.gzhead.comment?16:0)),l(I,I.gzhead.time&255),l(I,I.gzhead.time>>8&255),l(I,I.gzhead.time>>16&255),l(I,I.gzhead.time>>24&255),l(I,9===I.level?2:2<=I.strategy||2>I.level?4:0),l(I,I.gzhead.os&255),I.gzhead.extra&&I.gzhead.extra.length&&(l(I,I.gzhead.extra.length&255),l(I,I.gzhead.extra.length>>8&255)),I.gzhead.hcrc&&(k.adler=q(k.adler,I.pending_buf,I.pending,0)),I.gzindex=0,I.status=69):(l(I,0),l(I,0),l(I,0),l(I,0),l(I,0),l(I,9===I.level?2:2<=I.strategy||2>I.level?4:0),l(I,3),I.status=113);else{var R= + 8+(I.w_bits-8<<4)<<8;R|=(2<=I.strategy||2>I.level?0:6>I.level?1:6===I.level?2:3)<<6;0!==I.strstart&&(R|=32);I.status=113;a(I,R+(31-R%31));0!==I.strstart&&(a(I,k.adler>>>16),a(I,k.adler&65535));k.adler=1}if(69===I.status)if(I.gzhead.extra){for(R=I.pending;I.gzindex<(I.gzhead.extra.length&65535)&&(I.pending!==I.pending_buf_size||(I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R)),g(k),R=I.pending,I.pending!==I.pending_buf_size));)l(I,I.gzhead.extra[I.gzindex]&255),I.gzindex++; + I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R));I.gzindex===I.gzhead.extra.length&&(I.gzindex=0,I.status=73)}else I.status=73;if(73===I.status)if(I.gzhead.name){R=I.pending;do{if(I.pending===I.pending_buf_size&&(I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R)),g(k),R=I.pending,I.pending===I.pending_buf_size)){var Q=1;break}Q=I.gzindex + R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R));0===Q&&(I.gzindex=0,I.status=91)}else I.status=91;if(91===I.status)if(I.gzhead.comment){R=I.pending;do{if(I.pending===I.pending_buf_size&&(I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R)),g(k),R=I.pending,I.pending===I.pending_buf_size)){Q=1;break}Q=I.gzindexR&&(k.adler=q(k.adler,I.pending_buf,I.pending- + R,R));0===Q&&(I.status=103)}else I.status=103;103===I.status&&(I.gzhead.hcrc?(I.pending+2>I.pending_buf_size&&g(k),I.pending+2<=I.pending_buf_size&&(l(I,k.adler&255),l(I,k.adler>>8&255),k.adler=0,I.status=113)):I.status=113);if(0!==I.pending){if(g(k),0===k.avail_out)return I.last_flush=-1,0}else if(0===k.avail_in&&(J<<1)-(4=I.wrap)return 1;2===I.wrap?(l(I,k.adler&255),l(I,k.adler>>8&255),l(I,k.adler>>16&255),l(I,k.adler>>24&255),l(I,k.total_in&255),l(I,k.total_in>>8&255), + l(I,k.total_in>>16&255),l(I,k.total_in>>24&255)):(a(I,k.adler>>>16),a(I,k.adler&65535));g(k);0=S.w_size){0===R&&(m(S.head),S.strstart=0,S.block_start=0,S.insert=0);var Q=new f.Buf8(S.w_size);f.arraySet(Q,J,I-S.w_size,S.w_size,0);J=Q;I=S.w_size}Q=k.avail_in;var B=k.next_in;var H=k.input;k.avail_in=I;k.next_in=0;k.input=J;for(t(S);3<=S.lookahead;){J=S.strstart;I=S.lookahead-2;do S.ins_h=(S.ins_h<z&&(O+=l[b++]<>>24;O>>>=F;z-=F;F=q>>>16&255;if(0===F)t[c++]=q&65535;else if(F&16){var G=q&65535;if(F&= + 15)z>>=F,z-=F;15>z&&(O+=l[b++]<>>24;O>>>=F;z-=F;F=q>>>16&255;if(F&16){q&=65535;F&=15;zw){n.msg="invalid distance too far back";g.mode=30;break a}O>>>=F;z-=F;F=c-m;if(q>F){F=q-F;if(F>E&&g.sane){n.msg="invalid distance too far back";g.mode=30;break a}var k=0;var J=U;if(0===K){if(k+=r-F,F>3;b-=G;z-=G<<3;n.next_in=b;n.next_out=c;n.avail_in=b>>24&255)+(z>>>8&65280)+((z&65280)<<8)+((z&255)<<24)}function m(){this.mode=0;this.last=!1;this.wrap=0;this.havedict=!1;this.total=this.check=this.dmax=this.flags=0;this.head= + null;this.wnext=this.whave=this.wsize=this.wbits=0;this.window=null;this.extra=this.offset=this.length=this.bits=this.hold=0;this.distcode=this.lencode=null;this.have=this.ndist=this.nlen=this.ncode=this.distbits=this.lenbits=0;this.next=null;this.lens=new t.Buf16(320);this.work=new t.Buf16(288);this.distdyn=this.lendyn=null;this.was=this.back=this.sane=0}function g(z){if(!z||!z.state)return-2;var M=z.state;z.total_in=z.total_out=M.total=0;z.msg="";M.wrap&&(z.adler=M.wrap&1);M.mode=1;M.last=0;M.havedict= + 0;M.dmax=32768;M.head=null;M.hold=0;M.bits=0;M.lencode=M.lendyn=new t.Buf32(852);M.distcode=M.distdyn=new t.Buf32(592);M.sane=1;M.back=-1;return 0}function b(z){if(!z||!z.state)return-2;var M=z.state;M.wsize=0;M.whave=0;M.wnext=0;return g(z)}function l(z,M){if(!z||!z.state)return-2;var f=z.state;if(0>M){var N=0;M=-M}else N=(M>>4)+1,48>M&&(M&=15);if(M&&(8>M||15=T.wsize?(t.arraySet(T.window,M,f-T.wsize,T.wsize,0),T.wnext=0,T.whave=T.wsize):(z=T.wsize-T.wnext,z>N&&(z=N),t.arraySet(T.window,M,f-N,z,T.wnext),(N-=z)?(t.arraySet(T.window,M,f-N,N,0),T.wnext=N,T.whave=T.wsize):(T.wnext+=z,T.wnext===T.wsize&&(T.wnext=0),T.whaveQ;){if(0===S)break a;S--;R+=I[J++]<>>8&255;q.check=w(q.check,N,2,0);Q=R=0;q.mode=2;break}q.flags=0;q.head&&(q.head.done=!1);if(!(q.wrap&1)||(((R&255)<<8)+(R>>8))%31){z.msg="incorrect header check";q.mode=30;break}if(8!==(R&15)){z.msg="unknown compression method";q.mode=30;break}R>>>=4;Q-=4;var u=(R&15)+8;if(0===q.wbits)q.wbits=u;else if(u> + q.wbits){z.msg="invalid window size";q.mode=30;break}q.dmax=1<Q;){if(0===S)break a;S--;R+=I[J++]<>8&1);q.flags&512&&(N[0]=R&255,N[1]=R>>>8&255,q.check=w(q.check,N,2,0));Q=R=0;q.mode=3;case 3:for(;32>Q;){if(0===S)break a;S--;R+=I[J++]<>>8&255,N[2]=R>>>16&255,N[3]=R>>>24&255,q.check=w(q.check,N,4,0));Q=R=0;q.mode=4;case 4:for(;16>Q;){if(0===S)break a;S--;R+=I[J++]<>8);q.flags&512&&(N[0]=R&255,N[1]=R>>>8&255,q.check=w(q.check,N,2,0));Q=R=0;q.mode=5;case 5:if(q.flags&1024){for(;16>Q;){if(0===S)break a;S--;R+=I[J++]<>>8&255,q.check=w(q.check,N,2,0));Q=R=0}else q.head&&(q.head.extra= + null);q.mode=6;case 6:if(q.flags&1024){var d=q.length;d>S&&(d=S);d&&(q.head&&(u=q.head.extra_len-q.length,q.head.extra||(q.head.extra=Array(q.head.extra_len)),t.arraySet(q.head.extra,I,J,d,u)),q.flags&512&&(q.check=w(q.check,I,d,J)),S-=d,J+=d,q.length-=d);if(q.length)break a}q.length=0;q.mode=7;case 7:if(q.flags&2048){if(0===S)break a;d=0;do u=I[J+d++],q.head&&u&&65536>q.length&&(q.head.name+=String.fromCharCode(u));while(u&&dq.length&&(q.head.comment+=String.fromCharCode(u));while(u&&dQ;){if(0===S)break a;S--;R+=I[J++]<>9&1,q.head.done=!0);z.adler=q.check= + 0;q.mode=12;break;case 10:for(;32>Q;){if(0===S)break a;S--;R+=I[J++]<>>=Q&7;Q-=Q&7;q.mode=27;break}for(;3>Q;){if(0===S)break a;S--;R+=I[J++]<>>=1;--Q;switch(R&3){case 0:q.mode=14;break;case 1:u=q;if(K){U=new t.Buf32(512);O=new t.Buf32(32);for(d=0;144> + d;)u.lens[d++]=8;for(;256>d;)u.lens[d++]=9;for(;280>d;)u.lens[d++]=7;for(;288>d;)u.lens[d++]=8;E(1,u.lens,0,288,U,0,u.work,{bits:9});for(d=0;32>d;)u.lens[d++]=5;E(2,u.lens,0,32,O,0,u.work,{bits:5});K=!1}u.lencode=U;u.lenbits=9;u.distcode=O;u.distbits=5;q.mode=20;if(6===M){R>>>=2;Q-=2;break a}break;case 2:q.mode=17;break;case 3:z.msg="invalid block type",q.mode=30}R>>>=2;Q-=2;break;case 14:R>>>=Q&7;for(Q-=Q&7;32>Q;){if(0===S)break a;S--;R+=I[J++]<>>16^65535)){z.msg="invalid stored block lengths"; + q.mode=30;break}q.length=R&65535;Q=R=0;q.mode=15;if(6===M)break a;case 15:q.mode=16;case 16:if(d=q.length){d>S&&(d=S);d>k&&(d=k);if(0===d)break a;t.arraySet(G,I,J,d,F);S-=d;J+=d;k-=d;F+=d;q.length-=d;break}q.mode=12;break;case 17:for(;14>Q;){if(0===S)break a;S--;R+=I[J++]<>>=5;Q-=5;q.ndist=(R&31)+1;R>>>=5;Q-=5;q.ncode=(R&15)+4;R>>>=4;Q-=4;if(286 + Q;){if(0===S)break a;S--;R+=I[J++]<>>=3;Q-=3}for(;19>q.have;)q.lens[T[q.have++]]=0;q.lencode=q.lendyn;q.lenbits=7;d={bits:q.lenbits};X=E(0,q.lens,0,19,q.lencode,0,q.work,d);q.lenbits=d.bits;if(X){z.msg="invalid code lengths set";q.mode=30;break}q.have=0;q.mode=19;case 19:for(;q.have>>24;A&=65535;if(d<=Q)break;if(0===S)break a;S--;R+=I[J++]<A)R>>>=d,Q-=d,q.lens[q.have++]=A;else{if(16=== + A){for(u=d+2;Q>>=d;Q-=d;if(0===q.have){z.msg="invalid bit length repeat";q.mode=30;break}u=q.lens[q.have-1];d=3+(R&3);R>>>=2;Q-=2}else if(17===A){for(u=d+3;Q>>=d;Q-=d;u=0;d=3+(R&7);R>>>=3;Q-=3}else{for(u=d+7;Q>>=d;Q-=d;u=0;d=11+(R&127);R>>>=7;Q-=7}if(q.have+d>q.nlen+q.ndist){z.msg="invalid bit length repeat";q.mode=30;break}for(;d--;)q.lens[q.have++]=u}}if(30=== + q.mode)break;if(0===q.lens[256]){z.msg="invalid code -- missing end-of-block";q.mode=30;break}q.lenbits=9;d={bits:q.lenbits};X=E(1,q.lens,0,q.nlen,q.lencode,0,q.work,d);q.lenbits=d.bits;if(X){z.msg="invalid literal/lengths set";q.mode=30;break}q.distbits=6;q.distcode=q.distdyn;d={bits:q.distbits};X=E(2,q.lens,q.nlen,q.ndist,q.distcode,0,q.work,d);q.distbits=d.bits;if(X){z.msg="invalid distances set";q.mode=30;break}q.mode=20;if(6===M)break a;case 20:q.mode=21;case 21:if(6<=S&&258<=k){z.next_out=F; + z.avail_out=k;z.next_in=J;z.avail_in=S;q.hold=R;q.bits=Q;r(z,H);F=z.next_out;G=z.output;k=z.avail_out;J=z.next_in;I=z.input;S=z.avail_in;R=q.hold;Q=q.bits;12===q.mode&&(q.back=-1);break}for(q.back=0;;){A=q.lencode[R&(1<>>24;u=A>>>16&255;A&=65535;if(d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>h)];d=A>>>24;u=A>>>16&255;A&=65535;if(h+d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>>=h;Q-=h;q.back+= + h}R>>>=d;Q-=d;q.back+=d;q.length=A;if(0===u){q.mode=26;break}if(u&32){q.back=-1;q.mode=12;break}if(u&64){z.msg="invalid literal/length code";q.mode=30;break}q.extra=u&15;q.mode=22;case 22:if(q.extra){for(u=q.extra;Q>>=q.extra;Q-=q.extra;q.back+=q.extra}q.was=q.length;q.mode=23;case 23:for(;;){A=q.distcode[R&(1<>>24;u=A>>>16&255;A&=65535;if(d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>h)];d=A>>>24;u=A>>>16&255;A&=65535;if(h+d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>>=h;Q-=h;q.back+=h}R>>>=d;Q-=d;q.back+=d;if(u&64){z.msg="invalid distance code";q.mode=30;break}q.offset=A;q.extra=u&15;q.mode=24;case 24:if(q.extra){for(u=q.extra;Q>>=q.extra;Q-=q.extra;q.back+=q.extra}if(q.offset>q.dmax){z.msg="invalid distance too far back";q.mode=30;break}q.mode=25; + case 25:if(0===k)break a;d=H-k;if(q.offset>d){d=q.offset-d;if(d>q.whave&&q.sane){z.msg="invalid distance too far back";q.mode=30;break}d>q.wnext?(d-=q.wnext,u=q.wsize-d):u=q.wnext-d;d>q.length&&(d=q.length);h=q.window}else h=G,u=F-q.offset,d=q.length;d>k&&(d=k);k-=d;q.length-=d;do G[F++]=h[u++];while(--d);0===q.length&&(q.mode=21);break;case 26:if(0===k)break a;G[F++]=q.length;k--;q.mode=21;break;case 27:if(q.wrap){for(;32>Q;){if(0===S)break a;S--;R|=I[J++]<Q;){if(0===S)break a;S--;R+=I[J++]<q.mode&&(27>q.mode||4!==M))&&c(z,z.output,z.next_out,H-z.avail_out))return q.mode=31,-4;B-=z.avail_in;H-=z.avail_out;z.total_in+=B;z.total_out+=H;q.total+=H;q.wrap&&H&&(z.adler=q.check=q.flags?w(q.check,G,H,z.next_out-H):p(q.check,G,H,z.next_out-H));z.data_type=q.bits+(q.last?64:0)+(12===q.mode?128:0)+(20===q.mode||15===q.mode?256:0);(0===B&&0===H||4===M)&&0===X&&(X=-5);return X};D.inflateEnd=function(z){if(!z||!z.state)return-2;var M=z.state;M.window&&(M.window=null);z.state=null;return 0};D.inflateGetHeader= + function(z,M){if(!z||!z.state)return-2;z=z.state;if(0===(z.wrap&2))return-2;z.head=M;M.done=!1;return 0};D.inflateSetDictionary=function(z,M){var f=M.length;if(!z||!z.state)return-2;var N=z.state;if(0!==N.wrap&&11!==N.mode)return-2;if(11===N.mode){var T=p(1,M,f,0);if(T!==N.check)return-3}if(c(z,M,f,f))return N.mode=31,-4;N.havedict=1;return 0};D.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":123,"./adler32":125,"./crc32":127,"./inffast":130,"./inftrees":132}],132:[function(x, + W,D){var n=x("../utils/common"),m=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],g=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],b=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],l=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];W.exports=function(a,c,t,p,w,r,E,K){var U=K.bits,O,z,M,f,N, + T,q=0,F=new n.Buf16(16);var G=new n.Buf16(16);var k,J=0;for(O=0;15>=O;O++)F[O]=0;for(z=0;zM&&(I=M);if(0===M)return w[r++]=20971520,w[r++]=20971520,K.bits=1,0;for(U=1;U=O;O++)if(f<<=1,f-=F[O],0>f)return-1;if(0O;O++)G[O+1]=G[O]+F[O];for(z=0;zR?(A=k[J+E[z]],h=S[q+E[z]]):(A=96,h=0);f=1<>G)+T]=d<<24|A<<16|h|0;while(0!==T);for(f=1<>=1;0!==f?(N&=f-1,N+=f):N=0;z++;if(0===--F[O]){if(O===M)break;O=c[t+E[z]]}if(O>I&&(N&X)!==B){0===G&&(G=I);Q+=U;p=O-G;for(f=1<=f)break;p++;f<<=1}H+=1<>>8&255}function l(d,A,h){d.bi_valid>16-h?(d.bi_buf|=A<>16-d.bi_valid,d.bi_valid+=h-16):(d.bi_buf|=A<>>=1,h<<=1;while(0<--A);return h>>>1}function t(d,A,h){var v=Array(16),P=0,e; + for(e=1;15>=e;e++)v[e]=P=P+h[e-1]<<1;for(h=0;h<=A;h++)P=d[2*h+1],0!==P&&(d[2*h]=c(v[P]++,P))}function p(d){var A;for(A=0;286>A;A++)d.dyn_ltree[2*A]=0;for(A=0;30>A;A++)d.dyn_dtree[2*A]=0;for(A=0;19>A;A++)d.bl_tree[2*A]=0;d.dyn_ltree[512]=1;d.opt_len=d.static_len=0;d.last_lit=d.matches=0}function w(d){8P?I[P]:I[256+(P>>>7)];a(d,y,h);C=q[y];0!==C&&(P-=Q[y],l(d,P,C))}}while(vd.heap_len;){var L=d.heap[++d.heap_len]=2>C?++C:0;h[2*L]=1;d.depth[L]=0;d.opt_len--;P&&(d.static_len-=v[2*L+1])}A.max_code=C;for(y=d.heap_len>>1;1<=y;y--)E(d,h,y);L=e;do y=d.heap[1],d.heap[1]=d.heap[d.heap_len--],E(d,h,1),v=d.heap[1],d.heap[--d.heap_max]=y,d.heap[--d.heap_max]= + v,h[2*L]=h[2*y]+h[2*v],d.depth[L]=(d.depth[y]>=d.depth[v]?d.depth[y]:d.depth[v])+1,h[2*y+1]=h[2*v+1]=L,d.heap[1]=L++,E(d,h,1);while(2<=d.heap_len);d.heap[--d.heap_max]=d.heap[1];y=A.dyn_tree;L=A.max_code;v=A.stat_desc.static_tree;P=A.stat_desc.has_stree;e=A.stat_desc.extra_bits;var V=A.stat_desc.extra_base,Y=A.stat_desc.max_length,Z,ca=0;for(Z=0;15>=Z;Z++)d.bl_count[Z]=0;y[2*d.heap[d.heap_max]+1]=0;for(A=d.heap_max+1;573>A;A++){var fa=d.heap[A];Z=y[2*y[2*fa+1]+1]+1;Z>Y&&(Z=Y,ca++);y[2*fa+1]=Z;if(!(fa> + L)){d.bl_count[Z]++;var ha=0;fa>=V&&(ha=e[fa-V]);var la=y[2*fa];d.opt_len+=la*(Z+ha);P&&(d.static_len+=la*(v[2*fa+1]+ha))}}if(0!==ca){do{for(Z=Y-1;0===d.bl_count[Z];)Z--;d.bl_count[Z]--;d.bl_count[Z+1]+=2;d.bl_count[Y]--;ca-=2}while(0L||(y[2*v+1]!==Z&&(d.opt_len+=(Z-y[2*v+1])*y[2*v],y[2*v+1]=Z),fa--)}t(h,C,d.bl_count)}function O(d,A,h){var v,P=-1,e=A[1],y=0,C=7,L=4;0===e&&(C=138,L=3);A[2*(h+1)+1]=65535;for(v=0;v<=h;v++){var V=e;e= + A[2*(v+1)+1];++y=y?d.bl_tree[34]++:d.bl_tree[36]++,y=0,P=V,0===e?(C=138,L=3):V===e?(C=6,L=3):(C=7,L=4))}}function z(d,A,h){var v,P=-1,e=A[1],y=0,C=7,L=4;0===e&&(C=138,L=3);for(v=0;v<=h;v++){var V=e;e=A[2*(v+1)+1];if(!(++y=y?(a(d,17,d.bl_tree),l(d,y-3,3)):(a(d,18,d.bl_tree),l(d,y-11,7)); + y=0;P=V;0===e?(C=138,L=3):V===e?(C=6,L=3):(C=7,L=4)}}}function M(d){var A=4093624447,h;for(h=0;31>=h;h++,A>>>=1)if(A&1&&0!==d.dyn_ltree[2*h])return 0;if(0!==d.dyn_ltree[18]||0!==d.dyn_ltree[20]||0!==d.dyn_ltree[26])return 1;for(h=32;256>h;h++)if(0!==d.dyn_ltree[2*h])return 1;return 0}function f(d,A,h,v){l(d,v?1:0,3);w(d);b(d,h);b(d,~h);N.arraySet(d.pending_buf,d.window,A,h,d.pending);d.pending+=h}var N=x("../utils/common"),T=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],q=[0,0,0,0,1, + 1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],F=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],G=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],k=Array(576);n(k);var J=Array(60);n(J);var I=Array(512);n(I);var S=Array(256);n(S);var R=Array(29);n(R);var Q=Array(30);n(Q);var B,H,X,u=!1;D._tr_init=function(d){if(!u){var A,h,v,P=Array(16);for(v=h=0;28>v;v++)for(R[v]=h,A=0;A<1<v;v++)for(Q[v]=h,A=0;A<1<>=7;30>v;v++)for(Q[v]=h<<7,A= + 0;A<1<=A;A++)P[A]=0;for(A=0;143>=A;)k[2*A+1]=8,A++,P[8]++;for(;255>=A;)k[2*A+1]=9,A++,P[9]++;for(;279>=A;)k[2*A+1]=7,A++,P[7]++;for(;287>=A;)k[2*A+1]=8,A++,P[8]++;t(k,287,P);for(A=0;30>A;A++)J[2*A+1]=5,J[2*A]=c(A,5);B=new m(k,T,257,286,15);H=new m(J,q,0,30,15);X=new m([],F,0,19,7);u=!0}d.l_desc=new g(d.dyn_ltree,B);d.d_desc=new g(d.dyn_dtree,H);d.bl_desc=new g(d.bl_tree,X);d.bi_buf=0;d.bi_valid=0;p(d)};D._tr_stored_block=f;D._tr_flush_block=function(d,A,h,v){var P= + 0;if(0>>3;var y=d.static_len+3+7>>>3;y<=e&&(e=y)}else e=y=h+5;if(h+4<=e&&-1!==A)f(d,A,h,v);else if(4===d.strategy||y===e)l(d,2+(v?1:0),3),K(d,k,J);else{l(d,4+(v?1:0),3);A=d.l_desc.max_code+1;h=d.d_desc.max_code+1;P+=1;l(d,A-257,5);l(d,h-1,5);l(d, + P-4,4);for(e=0;e>>8&255;d.pending_buf[d.d_buf+2*d.last_lit+1]=A&255;d.pending_buf[d.l_buf+d.last_lit]=h&255;d.last_lit++;0===A?d.dyn_ltree[2*h]++:(d.matches++,A--,d.dyn_ltree[2*(S[h]+256+1)]++,d.dyn_dtree[2*(256>A?I[A]:I[256+(A>>>7)])]++);return d.last_lit===d.lit_bufsize-1};D._tr_align=function(d){l(d,2,3);a(d,256, + k);16===d.bi_valid?(b(d,d.bi_buf),d.bi_buf=0,d.bi_valid=0):8<=d.bi_valid&&(d.pending_buf[d.pending++]=d.bi_buf&255,d.bi_buf>>=8,d.bi_valid-=8)}},{"../utils/common":123}],135:[function(x,W,D){W.exports=function(){this.input=null;this.total_in=this.avail_in=this.next_in=0;this.output=null;this.total_out=this.avail_out=this.next_out=0;this.msg="";this.state=null;this.data_type=2;this.adler=0}},{}],136:[function(x,W,D){(function(n){function m(a,c){for(var t=0,p=a.length-1;0<=p;p--){var w=a[p];"."===w? + a.splice(p,1):".."===w?(a.splice(p,1),t++):t&&(a.splice(p,1),t--)}if(c)for(;t--;t)a.unshift("..");return a}function g(a,c){if(a.filter)return a.filter(c);for(var t=[],p=0;pU?[]:E.slice(K,U-K+1)}a=D.resolve(a).substr(1);c=D.resolve(c).substr(1);a=t(a.split("/"));c=t(c.split("/"));for(var p=Math.min(a.length,c.length),w=p,r=0;rc&&(c=a.length+c);return a.substr(c,t)}}).call(this,x("_process"))},{_process:138}],137:[function(x,W,D){(function(n){function m(g,b,l,a){if("function"!==typeof g)throw new TypeError('"callback" argument must be a function'); + var c=arguments.length;switch(c){case 0:case 1:return n.nextTick(g);case 2:return n.nextTick(function(){g.call(null,b)});case 3:return n.nextTick(function(){g.call(null,b,l)});case 4:return n.nextTick(function(){g.call(null,b,l,a)});default:var t=Array(c-1);for(c=0;c=B||0===H.length&&H.ended)return 0;if(H.objectMode)return 1;if(B!==B)return H.flowing&&H.length?H.buffer.head.data.length:H.length;if(B>H.highWaterMark){var X=B;8388608<=X?X=8388608:(X--,X|=X>>>1,X|=X>>>2,X|=X>>>4,X|=X>>>8,X|=X>>> + 16,X++);H.highWaterMark=X}return B<=H.length?B:H.ended?H.length:(H.needReadable=!0,0)}function c(B){var H=B._readableState;H.needReadable=!1;H.emittedReadable||(S("emitReadable",H.flowing),H.emittedReadable=!0,H.sync?N(t,B):t(B))}function t(B){S("emit readable");B.emit("readable");K(B)}function p(B,H){for(var X=H.length;!H.reading&&!H.flowing&&!H.ended&&H.length=H.length)X=H.decoder?H.buffer.join(""):1===H.buffer.length?H.buffer.head.data:H.buffer.concat(H.length),H.buffer.clear();else{X=H.buffer;H=H.decoder;if(BA.length?A.length:B;d=h===A.length?d+A:d+A.slice(0,B);B-=h;if(0===B){h===A.length?(++u,X.head=H.next?H.next:X.tail=null):(X.head=H, + H.data=A.slice(h));break}++u}X.length-=u;X=d}else{H=k.allocUnsafe(B);u=X.head;d=1;u.data.copy(H);for(B-=u.data.length;u=u.next;){A=u.data;h=B>A.length?A.length:B;A.copy(H,H.length-B,0,h);B-=h;if(0===B){h===A.length?(++d,X.head=u.next?u.next:X.tail=null):(X.head=u,u.data=A.slice(h));break}++d}X.length-=d;X=H}H=X}X=H}return X}function O(B){var H=B._readableState;if(0=H.highWaterMark||H.ended))return S("read: emitReadable",H.length,H.ended),0===H.length&&H.ended?O(this):c(this),null;B=a(B,H);if(0===B&&H.ended)return 0===H.length&&O(this),null;var u=H.needReadable;S("need readable",u);if(0===H.length||H.length-B>>0);for(var b=this.head,l=0;b;)b.data.copy(g,l),l+=b.data.length,b=b.next;return g}},{buffer:77,"buffer-shims":76}],146:[function(x,W,D){W.exports=x("./lib/_stream_passthrough.js")}, + {"./lib/_stream_passthrough.js":141}],147:[function(x,W,D){var n=x("_process");a:{try{var m=x("stream");break a}catch(g){}m=void 0}D=W.exports=x("./lib/_stream_readable.js");D.Stream=m||D;D.Readable=D;D.Writable=x("./lib/_stream_writable.js");D.Duplex=x("./lib/_stream_duplex.js");D.Transform=x("./lib/_stream_transform.js");D.PassThrough=x("./lib/_stream_passthrough.js");!n.browser&&"disable"===n.env.READABLE_STREAM&&m&&(W.exports=m)},{"./lib/_stream_duplex.js":140,"./lib/_stream_passthrough.js":141, + "./lib/_stream_readable.js":142,"./lib/_stream_transform.js":143,"./lib/_stream_writable.js":144,_process:138}],148:[function(x,W,D){W.exports=x("./lib/_stream_transform.js")},{"./lib/_stream_transform.js":143}],149:[function(x,W,D){W.exports=x("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":144}],150:[function(x,W,D){(function(n){(function(m){function g(e,y){if(!(this instanceof g))return new g(e,y);for(var C=0,L=T.length;Ce.indexOf(":")? + ["",e]:e.split(":"),L=C[0];C=C[1];y&&"xmlns"===e&&(L="xmlns",C="");return{prefix:L,local:C}}function U(e){e.strict||(e.attribName=e.attribName[e.looseCase]());if(-1===e.attribList.indexOf(e.attribName)&&!e.tag.attributes.hasOwnProperty(e.attribName))if(e.opt.xmlns){var y=K(e.attribName,!0),C=y.local;if("xmlns"===y.prefix)if("xml"===C&&e.attribValue!==B)E(e,"xml: prefix must be bound to "+B+"\nActual: "+e.attribValue);else if("xmlns"===C&&e.attribValue!==H)E(e,"xmlns: prefix must be bound to "+H+"\nActual: "+ + e.attribValue);else{y=e.tag;var L=e.tags[e.tags.length-1]||e;y.ns===L.ns&&(y.ns=Object.create(L.ns));y.ns[C]=e.attribValue}e.attribList.push([e.attribName,e.attribValue])}else e.tag.attributes[e.attribName]=e.attribValue,c(e,"onattribute",{name:e.attribName,value:e.attribValue});e.attribName=e.attribValue=""}function O(e,y){if(e.opt.xmlns){var C=e.tag,L=K(e.tagName);C.prefix=L.prefix;C.local=L.local;C.uri=C.ns[L.prefix]||"";C.prefix&&!C.uri&&(E(e,"Unbound namespace prefix: "+JSON.stringify(e.tagName)), + C.uri=L.prefix);L=e.tags[e.tags.length-1]||e;C.ns&&L.ns!==C.ns&&Object.keys(C.ns).forEach(function(la){c(e,"onopennamespace",{prefix:la,uri:C.ns[la]})});L=0;for(var V=e.attribList.length;L";e.tagName="";e.state=v.SCRIPT;return}c(e,"onscript",e.script);e.script=""}var y=e.tags.length,C=e.tagName;e.strict||(C=C[e.looseCase]());for(var L=C;y--;)if(e.tags[y].name!==L)E(e,"Unexpected close tag"); + else break;if(0>y)E(e,"Unmatched closing tag: "+e.tagName),e.textNode+="";else{e.tagName=C;for(C=e.tags.length;C-- >y;){var V=e.tag=e.tags.pop();e.tagName=e.tag.name;c(e,"onclosetag",e.tagName);for(var Y in V.ns);L=e.tags[e.tags.length-1]||e;e.opt.xmlns&&V.ns!==L.ns&&Object.keys(V.ns).forEach(function(Z){c(e,"onclosenamespace",{prefix:Z,uri:V.ns[Z]})})}0===y&&(e.closedRoot=!0);e.tagName=e.attribValue=e.attribName="";e.attribList.length=0}}else E(e,"Weird empty close tag."),e.textNode+= + "";e.state=v.TEXT}function M(e){var y=e.entity,C=y.toLowerCase(),L="";if(e.ENTITIES[y])return e.ENTITIES[y];if(e.ENTITIES[C])return e.ENTITIES[C];y=C;if("#"===y.charAt(0))if("x"===y.charAt(1)){y=y.slice(2);var V=parseInt(y,16);L=V.toString(16)}else y=y.slice(1),V=parseInt(y,10),L=V.toString(10);y=y.replace(/^0+/,"");return L.toLowerCase()!==y?(E(e,"Invalid character entity"),"&"+e.entity+";"):String.fromCodePoint(V)}function f(e,y){"<"===y?(e.state=v.OPEN_WAKA,e.startTagPosition=e.position):a(G, + y)||(E(e,"Non-whitespace before first tag."),e.textNode=y,e.state=v.TEXT)}function N(e,y){var C="";y"===C?(c(this,"onsgmldeclaration",this.sgmlDecl),this.sgmlDecl="",this.state=v.TEXT):(a(I,C)&&(this.state=v.SGML_DECL_QUOTED),this.sgmlDecl+=C);continue;case v.SGML_DECL_QUOTED:C===this.q&&(this.state=v.SGML_DECL,this.q="");this.sgmlDecl+=C;continue;case v.DOCTYPE:">"===C?(this.state=v.TEXT,c(this,"ondoctype",this.doctype),this.doctype=!0):(this.doctype+=C,"["===C?this.state=v.DOCTYPE_DTD: + a(I,C)&&(this.state=v.DOCTYPE_QUOTED,this.q=C));continue;case v.DOCTYPE_QUOTED:this.doctype+=C;C===this.q&&(this.q="",this.state=v.DOCTYPE);continue;case v.DOCTYPE_DTD:this.doctype+=C;"]"===C?this.state=v.DOCTYPE:a(I,C)&&(this.state=v.DOCTYPE_DTD_QUOTED,this.q=C);continue;case v.DOCTYPE_DTD_QUOTED:this.doctype+=C;C===this.q&&(this.state=v.DOCTYPE_DTD,this.q="");continue;case v.COMMENT:"-"===C?this.state=v.COMMENT_ENDING:this.comment+=C;continue;case v.COMMENT_ENDING:"-"===C?(this.state=v.COMMENT_ENDED, + (this.comment=p(this.opt,this.comment))&&c(this,"oncomment",this.comment),this.comment=""):(this.comment+="-"+C,this.state=v.COMMENT);continue;case v.COMMENT_ENDED:">"!==C?(E(this,"Malformed comment"),this.comment+="--"+C,this.state=v.COMMENT):this.state=v.TEXT;continue;case v.CDATA:"]"===C?this.state=v.CDATA_ENDING:this.cdata+=C;continue;case v.CDATA_ENDING:"]"===C?this.state=v.CDATA_ENDING_2:(this.cdata+="]"+C,this.state=v.CDATA);continue;case v.CDATA_ENDING_2:">"===C?(this.cdata&&c(this,"oncdata", + this.cdata),c(this,"onclosecdata"),this.cdata="",this.state=v.TEXT):"]"===C?this.cdata+="]":(this.cdata+="]]"+C,this.state=v.CDATA);continue;case v.PROC_INST:"?"===C?this.state=v.PROC_INST_ENDING:a(G,C)?this.state=v.PROC_INST_BODY:this.procInstName+=C;continue;case v.PROC_INST_BODY:if(!this.procInstBody&&a(G,C))continue;else"?"===C?this.state=v.PROC_INST_ENDING:this.procInstBody+=C;continue;case v.PROC_INST_ENDING:">"===C?(c(this,"onprocessinginstruction",{name:this.procInstName,body:this.procInstBody}), + this.procInstName=this.procInstBody="",this.state=v.TEXT):(this.procInstBody+="?"+C,this.state=v.PROC_INST_BODY);continue;case v.OPEN_TAG:if(a(d,C))this.tagName+=C;else{this.strict||(this.tagName=this.tagName[this.looseCase]());L=this.tags[this.tags.length-1]||this;var V=this.tag={name:this.tagName,attributes:{}};this.opt.xmlns&&(V.ns=L.ns);this.attribList.length=0;">"===C?O(this):"/"===C?this.state=v.OPEN_TAG_SLASH:(a(G,C)||E(this,"Invalid character in tag name"),this.state=v.ATTRIB)}continue;case v.OPEN_TAG_SLASH:">"=== + C?(O(this,!0),z(this)):(E(this,"Forward-slash in opening tag not followed by >"),this.state=v.ATTRIB);continue;case v.ATTRIB:if(a(G,C))continue;else">"===C?O(this):"/"===C?this.state=v.OPEN_TAG_SLASH:a(u,C)?(this.attribName=C,this.attribValue="",this.state=v.ATTRIB_NAME):E(this,"Invalid attribute name");continue;case v.ATTRIB_NAME:"="===C?this.state=v.ATTRIB_VALUE:">"===C?(E(this,"Attribute without value"),this.attribValue=this.attribName,U(this),O(this)):a(G,C)?this.state=v.ATTRIB_NAME_SAW_WHITE: + a(d,C)?this.attribName+=C:E(this,"Invalid attribute name");continue;case v.ATTRIB_NAME_SAW_WHITE:if("="===C)this.state=v.ATTRIB_VALUE;else if(a(G,C))continue;else E(this,"Attribute without value"),this.attribValue=this.tag.attributes[this.attribName]="",c(this,"onattribute",{name:this.attribName,value:""}),this.attribName="",">"===C?O(this):a(u,C)?(this.attribName=C,this.state=v.ATTRIB_NAME):(E(this,"Invalid attribute name"),this.state=v.ATTRIB);continue;case v.ATTRIB_VALUE:if(a(G,C))continue;else a(I, + C)?(this.q=C,this.state=v.ATTRIB_VALUE_QUOTED):(E(this,"Unquoted attribute value"),this.state=v.ATTRIB_VALUE_UNQUOTED,this.attribValue=C);continue;case v.ATTRIB_VALUE_QUOTED:if(C!==this.q){"&"===C?this.state=v.ATTRIB_VALUE_ENTITY_Q:this.attribValue+=C;continue}U(this);this.q="";this.state=v.ATTRIB_VALUE_CLOSED;continue;case v.ATTRIB_VALUE_CLOSED:a(G,C)?this.state=v.ATTRIB:">"===C?O(this):"/"===C?this.state=v.OPEN_TAG_SLASH:a(u,C)?(E(this,"No whitespace between attributes"),this.attribName=C,this.attribValue= + "",this.state=v.ATTRIB_NAME):E(this,"Invalid attribute name");continue;case v.ATTRIB_VALUE_UNQUOTED:if(!a(S,C)){"&"===C?this.state=v.ATTRIB_VALUE_ENTITY_U:this.attribValue+=C;continue}U(this);">"===C?O(this):this.state=v.ATTRIB;continue;case v.CLOSE_TAG:if(this.tagName)">"===C?z(this):a(d,C)?this.tagName+=C:this.script?(this.script+=""===C?z(this):E(this,"Invalid characters in closing tag");continue;case v.TEXT_ENTITY:case v.ATTRIB_VALUE_ENTITY_Q:case v.ATTRIB_VALUE_ENTITY_U:switch(this.state){case v.TEXT_ENTITY:var Y=v.TEXT;var Z="textNode";break;case v.ATTRIB_VALUE_ENTITY_Q:Y=v.ATTRIB_VALUE_QUOTED;Z="attribValue";break;case v.ATTRIB_VALUE_ENTITY_U:Y=v.ATTRIB_VALUE_UNQUOTED, + Z="attribValue"}";"===C?(this[Z]+=M(this),this.entity="",this.state=Y):a(this.entity.length?h:A,C)?this.entity+=C:(E(this,"Invalid character in entity name"),this[Z]+="&"+this.entity+C,this.entity="",this.state=Y);continue;default:throw Error(this,"Unknown state: "+this.state);}}if(this.position>=this.bufferCheckPosition){e=Math.max(m.MAX_BUFFER_LENGTH,10);C=y=0;for(Y=T.length;Ce)switch(T[C]){case "textNode":t(this);break;case "cdata":c(this,"oncdata",this.cdata); + this.cdata="";break;case "script":c(this,"onscript",this.script);this.script="";break;default:w(this,"Max buffer length exceeded: "+T[C])}y=Math.max(y,Z)}this.bufferCheckPosition=m.MAX_BUFFER_LENGTH-y+this.position}return this},resume:function(){this.error=null;return this},close:function(){return this.write(null)},flush:function(){t(this);""!==this.cdata&&(c(this,"oncdata",this.cdata),this.cdata="");""!==this.script&&(c(this,"onscript",this.script),this.script="")}};try{var q=x("stream").Stream}catch(e){q= + function(){}}var F=m.EVENTS.filter(function(e){return"error"!==e&&"end"!==e});b.prototype=Object.create(q.prototype,{constructor:{value:b}});b.prototype.write=function(e){"function"===typeof n&&"function"===typeof n.isBuffer&&n.isBuffer(e)&&(this._decoder||(this._decoder=new (x("string_decoder").StringDecoder)("utf8")),e=this._decoder.write(e));this._parser.write(e.toString());this.emit("data",e);return!0};b.prototype.end=function(e){e&&e.length&&this.write(e);this._parser.end();return!0};b.prototype.on= + function(e,y){var C=this;C._parser["on"+e]||-1===F.indexOf(e)||(C._parser["on"+e]=function(){var L=1===arguments.length?[arguments[0]]:Array.apply(null,arguments);L.splice(0,0,e);C.emit.apply(C,L)});return q.prototype.on.call(C,e,y)};var G="\r\n\t ",k="0124356789",J="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",I="'\"",S=G+">",R="[CDATA[",Q="DOCTYPE",B="http://www.w3.org/XML/1998/namespace",H="http://www.w3.org/2000/xmlns/",X={xml:B,xmlns:H};G=l(G);k=l(k);J=l(J);var u=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, + d=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/,A=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,h=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/; + I=l(I);S=l(S);var v=0;m.STATE={BEGIN:v++,BEGIN_WHITESPACE:v++,TEXT:v++,TEXT_ENTITY:v++,OPEN_WAKA:v++,SGML_DECL:v++,SGML_DECL_QUOTED:v++,DOCTYPE:v++,DOCTYPE_QUOTED:v++,DOCTYPE_DTD:v++,DOCTYPE_DTD_QUOTED:v++,COMMENT_STARTING:v++,COMMENT:v++,COMMENT_ENDING:v++,COMMENT_ENDED:v++,CDATA:v++,CDATA_ENDING:v++,CDATA_ENDING_2:v++,PROC_INST:v++,PROC_INST_BODY:v++,PROC_INST_ENDING:v++,OPEN_TAG:v++,OPEN_TAG_SLASH:v++,ATTRIB:v++,ATTRIB_NAME:v++,ATTRIB_NAME_SAW_WHITE:v++,ATTRIB_VALUE:v++,ATTRIB_VALUE_QUOTED:v++, + ATTRIB_VALUE_CLOSED:v++,ATTRIB_VALUE_UNQUOTED:v++,ATTRIB_VALUE_ENTITY_Q:v++,ATTRIB_VALUE_ENTITY_U:v++,CLOSE_TAG:v++,CLOSE_TAG_SAW_WHITE:v++,SCRIPT:v++,SCRIPT_ENDING:v++};m.XML_ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'"};m.ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'",AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216, + Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167, + uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934, + Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240, + prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,"int":8747,there4:8756,sim:8764,cong:8773,asymp:8776, + ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830};Object.keys(m.ENTITIES).forEach(function(e){var y=m.ENTITIES[e];y="number"===typeof y?String.fromCharCode(y):y;m.ENTITIES[e]=y});for(var P in m.STATE)m.STATE[m.STATE[P]]=P;v=m.STATE;String.fromCodePoint||function(){var e=String.fromCharCode,y=Math.floor, + C=function(){var L=[],V=-1,Y=arguments.length;if(!Y)return"";for(var Z="";++Vca||1114111=ca)L.push(ca);else{ca-=65536;var fa=(ca>>10)+55296;ca=ca%1024+56320;L.push(fa,ca)}if(V+1===Y||16384=this.charLength-this.charReceived?this.charLength-this.charReceived:a.length;a.copy(this.charBuffer,this.charReceived,0,c);this.charReceived+=c;if(this.charReceived=t)this.charLength+=this.surrogateSize,c="";else{this.charReceived=this.charLength=0;if(0===a.length)return c;break}}this.detectIncompleteChar(a);var p=a.length;this.charLength&&(a.copy(this.charBuffer,0,a.length-this.charReceived,p),p-=this.charReceived);c+=a.toString(this.encoding,0,p);p=c.length-1;t=c.charCodeAt(p);return 55296<=t&&56319>=t?(t=this.surrogateSize, + this.charLength+=t,this.charReceived+=t,this.charBuffer.copy(this.charBuffer,t,0,t),a.copy(this.charBuffer,0,0,t),c.substring(0,p)):c};x.prototype.detectIncompleteChar=function(a){for(var c=3<=a.length?3:a.length;0>5){this.charLength=2;break}if(2>=c&&14==t>>4){this.charLength=3;break}if(3>=c&&30==t>>3){this.charLength=4;break}}this.charReceived=c};x.prototype.end=function(a){var c="";a&&a.length&&(c=this.write(a));this.charReceived&&(a=this.encoding,c+=this.charBuffer.slice(0, + this.charReceived).toString(a));return c}},{buffer:77}],153:[function(x,W,D){(function(){function n(e){return function(y,C,L,V){C=N(C,V,4);var Y=!I(y)&&f.keys(y),Z=(Y||y).length,ca=0arguments.length&&(L=y[Y?Y[ca]:ca],ca+=e);for(var fa=C,ha=L;0<=ca&&caL||null==C)return C;for(var V=1;VL&&(L=C)}else y=T(y,C),f.each(e,function(fa,ha,la){Y=y(fa,ha,la);if(Y>V||-Infinity===Y&&-Infinity===L)L=fa,V=Y});return L};f.min=function(e,y,C){var L=Infinity,V=Infinity,Y;if(null==y&& + null!=e){e=I(e)?e:f.values(e);for(var Z=0,ca=e.length;ZZ||void 0===Y)return 1;if(Y=C)throw Error("bindAll must be passed function names");for(y=1;y=la||la>y?(Z&&(clearTimeout(Z),Z=null),ca=ha,Y=e.apply(L,V),Z||(L=V=null)):Z||!1===C.trailing||(Z=setTimeout(fa,la));return Y}};f.debounce=function(e,y,C){var L,V,Y,Z,ca,fa=function(){var ha=f.now()-Z;ha--e)return y.apply(this,arguments)}};f.before=function(e,y){var C;return function(){0<--e&&(C=y.apply(this,arguments));1>=e&&(y=null);return C}};f.once=f.partial(f.before,2);var B=!{toString:null}.propertyIsEnumerable("toString"),H="valueOf isPrototypeOf toString propertyIsEnumerable hasOwnProperty toLocaleString".split(" "); + f.keys=function(e){if(!f.isObject(e))return[];if(U)return U(e);var y=[],C;for(C in e)f.has(e,C)&&y.push(C);B&&b(e,y);return y};f.allKeys=function(e){if(!f.isObject(e))return[];var y=[],C;for(C in e)y.push(C);B&&b(e,y);return y};f.values=function(e){for(var y=f.keys(e),C=y.length,L=Array(C),V=0;V":">",'"':""","'":"'","`":"`"};q=f.invert(K);G=function(e){var y=function(Y){return e[Y]},C="(?:"+f.keys(e).join("|")+")",L=RegExp(C),V=RegExp(C,"g");return function(Y){Y=null==Y?"":""+Y;return L.test(Y)?Y.replace(V,y):Y}};f.escape=G(K);f.unescape= + G(q);f.result=function(e,y,C){y=null==e?void 0:e[y];void 0===y&&(y=C);return f.isFunction(y)?y.call(e):y};var u=0;f.uniqueId=function(e){var y=++u+"";return e?e+y:y};f.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var d=/(.)^/,A={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},h=/\\|'|\r|\n|\u2028|\u2029/g,v=function(e){return"\\"+A[e]};f.template=function(e,y,C){!y&&C&&(y=C);y=f.defaults({},y,f.templateSettings);C=RegExp([(y.escape|| + d).source,(y.interpolate||d).source,(y.evaluate||d).source].join("|")+"|$","g");var L=0,V="__p+='";e.replace(C,function(Z,ca,fa,ha,la){V+=e.slice(L,la).replace(h,v);L=la+Z.length;ca?V+="'+\n((__t=("+ca+"))==null?'':_.escape(__t))+\n'":fa?V+="'+\n((__t=("+fa+"))==null?'':__t)+\n'":ha&&(V+="';\n"+ha+"\n__p+='");return Z});V+="';\n";y.variable||(V="with(obj||{}){\n"+V+"}\n");V="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+V+"return __p;\n";try{var Y=new Function(y.variable|| + "obj","_",V)}catch(Z){throw Z.source=V,Z;}C=function(Z){return Y.call(this,Z,f)};C.source="function("+(y.variable||"obj")+"){\n"+V+"}";return C};f.chain=function(e){e=f(e);e._chain=!0;return e};var P=function(e,y){return e._chain?f(y).chain():y};f.mixin=function(e){f.each(f.functions(e),function(y){var C=f[y]=e[y];f.prototype[y]=function(){var L=[this._wrapped];p.apply(L,arguments);return P(this,C.apply(f,L))}})};f.mixin(f);f.each("pop push reverse shift sort splice unshift".split(" "),function(e){var y= + c[e];f.prototype[e]=function(){var C=this._wrapped;y.apply(C,arguments);"shift"!==e&&"splice"!==e||0!==C.length||delete C[0];return P(this,C)}});f.each(["concat","join","slice"],function(e){var y=c[e];f.prototype[e]=function(){return P(this,y.apply(this._wrapped,arguments))}});f.prototype.value=function(){return this._wrapped};f.prototype.valueOf=f.prototype.toJSON=f.prototype.value;f.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],154:[function(x,W,D){(function(n){function m(g){try{if(!n.localStorage)return!1}catch(b){return!1}g= + n.localStorage[g];return null==g?!1:"true"===String(g).toLowerCase()}W.exports=function(g,b){if(m("noDeprecation"))return g;var l=!1;return function(){if(!l){if(m("throwDeprecation"))throw Error(b);m("traceDeprecation")?console.trace(b):console.warn(b);l=!0}return g.apply(this,arguments)}}}).call(this,"undefined"!==typeof global?global:"undefined"!==typeof self?self:"undefined"!==typeof window?window:{})},{}],155:[function(x,W,D){arguments[4][81][0].apply(D,arguments)},{dup:81}],156:[function(x,W, + D){W.exports=function(n){return n&&"object"===typeof n&&"function"===typeof n.copy&&"function"===typeof n.fill&&"function"===typeof n.readUInt8}},{}],157:[function(x,W,D){(function(n,m){function g(Q,B){var H={seen:[],stylize:l};3<=arguments.length&&(H.depth=arguments[2]);4<=arguments.length&&(H.colors=arguments[3]);U(B)?H.showHidden=B:B&&D._extend(H,B);M(H.showHidden)&&(H.showHidden=!1);M(H.depth)&&(H.depth=2);M(H.colors)&&(H.colors=!1);M(H.customInspect)&&(H.customInspect=!0);H.colors&&(H.stylize= + b);return c(H,Q,H.depth)}function b(Q,B){return(B=g.styles[B])?"\u001b["+g.colors[B][0]+"m"+Q+"\u001b["+g.colors[B][1]+"m":Q}function l(Q,B){return Q}function a(Q){var B={};Q.forEach(function(H,X){B[H]=!0});return B}function c(Q,B,H){if(Q.customInspect&&B&&F(B.inspect)&&B.inspect!==D.inspect&&(!B.constructor||B.constructor.prototype!==B)){var X=B.inspect(H,Q);z(X)||(X=c(Q,X,H));return X}if(X=t(Q,B))return X;var u=Object.keys(B),d=a(u);Q.showHidden&&(u=Object.getOwnPropertyNames(B));if(q(B)&&(0<=u.indexOf("message")|| + 0<=u.indexOf("description")))return p(B);if(0===u.length){if(F(B))return Q.stylize("[Function"+(B.name?": "+B.name:"")+"]","special");if(f(B))return Q.stylize(RegExp.prototype.toString.call(B),"regexp");if(T(B))return Q.stylize(Date.prototype.toString.call(B),"date");if(q(B))return p(B)}X="";var A=!1,h=["{","}"];K(B)&&(A=!0,h=["[","]"]);F(B)&&(X=" [Function"+(B.name?": "+B.name:"")+"]");f(B)&&(X=" "+RegExp.prototype.toString.call(B));T(B)&&(X=" "+Date.prototype.toUTCString.call(B));q(B)&&(X=" "+p(B)); + if(0===u.length&&(!A||0==B.length))return h[0]+X+h[1];if(0>H)return f(B)?Q.stylize(RegExp.prototype.toString.call(B),"regexp"):Q.stylize("[Object]","special");Q.seen.push(B);u=A?w(Q,B,H,d,u):u.map(function(v){return r(Q,B,H,d,v,A)});Q.seen.pop();return E(u,X,h)}function t(Q,B){if(M(B))return Q.stylize("undefined","undefined");if(z(B))return B="'"+JSON.stringify(B).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'",Q.stylize(B,"string");if(O(B))return Q.stylize(""+B,"number");if(U(B))return Q.stylize(""+ + B,"boolean");if(null===B)return Q.stylize("null","null")}function p(Q){return"["+Error.prototype.toString.call(Q)+"]"}function w(Q,B,H,X,u){for(var d=[],A=0,h=B.length;AQ.seen.indexOf(B.value)?(h=null===H?c(Q,B.value,null):c(Q,B.value,H-1),-1Q?"0"+Q.toString(10):Q.toString(10)}function k(){var Q=new Date,B=[G(Q.getHours()), + G(Q.getMinutes()),G(Q.getSeconds())].join(":");return[Q.getDate(),R[Q.getMonth()],B].join(" ")}var J=/%[sdj%]/g;D.format=function(Q){if(!z(Q)){for(var B=[],H=0;H=u)return A;switch(A){case "%s":return String(X[H++]);case "%d":return Number(X[H++]);case "%j":try{return JSON.stringify(X[H++])}catch(h){return"[Circular]"}default:return A}});for(var d= + X[H];H":null!=(b=this.parent)&&b.name?"attribute: {"+m+"}, parent: <"+this.parent.name+">":"attribute: {"+m+"}":""};return n}()}).call(this)},{}],160:[function(x,W,D){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c){l.__super__.constructor.call(this, + a);if(null==c)throw Error("Missing CDATA text. "+this.debugInfo());this.text=this.stringify.cdata(c)}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).cdata(this)};return l}(g)}).call(this)},{"./XMLNode":171}],161:[function(x,W,D){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty; + var g=x("./XMLNode");W.exports=function(b){function l(a,c){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing comment text. "+this.debugInfo());this.text=this.stringify.comment(c)}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).comment(this)};return l}(g)}).call(this)},{"./XMLNode":171}],162:[function(x,W,D){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&& + (b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t,p,w,r){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing DTD element name. "+this.debugInfo());if(null==t)throw Error("Missing DTD attribute name. "+this.debugInfo(c));if(!p)throw Error("Missing DTD attribute type. "+this.debugInfo(c));if(!w)throw Error("Missing DTD attribute default. "+this.debugInfo(c));0!==w.indexOf("#")&& + (w="#"+w);if(!w.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/))throw Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. "+this.debugInfo(c));if(r&&!w.match(/^(#FIXED|#DEFAULT)$/))throw Error("Default value only applies to #FIXED or #DEFAULT. "+this.debugInfo(c));this.elementName=this.stringify.eleName(c);this.attributeName=this.stringify.attName(t);this.attributeType=this.stringify.dtdAttType(p);this.defaultValue=this.stringify.dtdAttDefault(r);this.defaultValueType= + w}n(l,b);l.prototype.toString=function(a){return this.options.writer.set(a).dtdAttList(this)};return l}(g)}).call(this)},{"./XMLNode":171}],163:[function(x,W,D){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing DTD element name. "+ + this.debugInfo());t||(t="(#PCDATA)");Array.isArray(t)&&(t="("+t.join(",")+")");this.name=this.stringify.eleName(c);this.value=this.stringify.dtdElementValue(t)}n(l,b);l.prototype.toString=function(a){return this.options.writer.set(a).dtdElement(this)};return l}(g)}).call(this)},{"./XMLNode":171}],164:[function(x,W,D){(function(){var n=function(l,a){function c(){this.constructor=l}for(var t in a)m.call(a,t)&&(l[t]=a[t]);c.prototype=a.prototype;l.prototype=new c;l.__super__=a.prototype;return l},m= + {}.hasOwnProperty;var g=x("./Utility").isObject;var b=x("./XMLNode");W.exports=function(l){function a(c,t,p,w){a.__super__.constructor.call(this,c);if(null==p)throw Error("Missing DTD entity name. "+this.debugInfo(p));if(null==w)throw Error("Missing DTD entity value. "+this.debugInfo(p));this.pe=!!t;this.name=this.stringify.eleName(p);if(g(w)){if(!w.pubID&&!w.sysID)throw Error("Public and/or system identifiers are required for an external entity. "+this.debugInfo(p));if(w.pubID&&!w.sysID)throw Error("System identifier is required for a public external entity. "+ + this.debugInfo(p));null!=w.pubID&&(this.pubID=this.stringify.dtdPubID(w.pubID));null!=w.sysID&&(this.sysID=this.stringify.dtdSysID(w.sysID));null!=w.nData&&(this.nData=this.stringify.dtdNData(w.nData));if(this.pe&&this.nData)throw Error("Notation declaration is not allowed in a parameter entity. "+this.debugInfo(p));}else this.value=this.stringify.dtdEntityValue(w)}n(a,l);a.prototype.toString=function(c){return this.options.writer.set(c).dtdEntity(this)};return a}(b)}).call(this)},{"./Utility":158, + "./XMLNode":171}],165:[function(x,W,D){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing DTD notation name. "+this.debugInfo(c));if(!t.pubID&&!t.sysID)throw Error("Public or system identifiers are required for an external entity. "+ + this.debugInfo(c));this.name=this.stringify.eleName(c);null!=t.pubID&&(this.pubID=this.stringify.dtdPubID(t.pubID));null!=t.sysID&&(this.sysID=this.stringify.dtdSysID(t.sysID))}n(l,b);l.prototype.toString=function(a){return this.options.writer.set(a).dtdNotation(this)};return l}(g)}).call(this)},{"./XMLNode":171}],166:[function(x,W,D){(function(){var n=function(l,a){function c(){this.constructor=l}for(var t in a)m.call(a,t)&&(l[t]=a[t]);c.prototype=a.prototype;l.prototype=new c;l.__super__=a.prototype; + return l},m={}.hasOwnProperty;var g=x("./Utility").isObject;var b=x("./XMLNode");W.exports=function(l){function a(c,t,p,w){a.__super__.constructor.call(this,c);g(t)&&(c=t,t=c.version,p=c.encoding,w=c.standalone);t||(t="1.0");this.version=this.stringify.xmlVersion(t);null!=p&&(this.encoding=this.stringify.xmlEncoding(p));null!=w&&(this.standalone=this.stringify.xmlStandalone(w))}n(a,l);a.prototype.toString=function(c){return this.options.writer.set(c).declaration(this)};return a}(b)}).call(this)}, + {"./Utility":158,"./XMLNode":171}],167:[function(x,W,D){(function(){var n=function(p,w){function r(){this.constructor=p}for(var E in w)m.call(w,E)&&(p[E]=w[E]);r.prototype=w.prototype;p.prototype=new r;p.__super__=w.prototype;return p},m={}.hasOwnProperty;var g=x("./Utility").isObject;var b=x("./XMLNode");var l=x("./XMLDTDAttList");var a=x("./XMLDTDEntity");var c=x("./XMLDTDElement");var t=x("./XMLDTDNotation");W.exports=function(p){function w(r,E,K){w.__super__.constructor.call(this,r);this.name= + "!DOCTYPE";this.documentObject=r;g(E)&&(K=E,E=K.pubID,K=K.sysID);null==K&&(E=[E,K],K=E[0],E=E[1]);null!=E&&(this.pubID=this.stringify.dtdPubID(E));null!=K&&(this.sysID=this.stringify.dtdSysID(K))}n(w,p);w.prototype.element=function(r,E){r=new c(this,r,E);this.children.push(r);return this};w.prototype.attList=function(r,E,K,U,O){r=new l(this,r,E,K,U,O);this.children.push(r);return this};w.prototype.entity=function(r,E){r=new a(this,!1,r,E);this.children.push(r);return this};w.prototype.pEntity=function(r, + E){r=new a(this,!0,r,E);this.children.push(r);return this};w.prototype.notation=function(r,E){r=new t(this,r,E);this.children.push(r);return this};w.prototype.toString=function(r){return this.options.writer.set(r).docType(this)};w.prototype.ele=function(r,E){return this.element(r,E)};w.prototype.att=function(r,E,K,U,O){return this.attList(r,E,K,U,O)};w.prototype.ent=function(r,E){return this.entity(r,E)};w.prototype.pent=function(r,E){return this.pEntity(r,E)};w.prototype.not=function(r,E){return this.notation(r, + E)};w.prototype.up=function(){return this.root()||this.documentObject};return w}(b)}).call(this)},{"./Utility":158,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLNode":171}],168:[function(x,W,D){(function(){var n=function(c,t){function p(){this.constructor=c}for(var w in t)m.call(t,w)&&(c[w]=t[w]);p.prototype=t.prototype;c.prototype=new p;c.__super__=t.prototype;return c},m={}.hasOwnProperty;var g=x("./Utility").isPlainObject;var b=x("./XMLNode");var l= + x("./XMLStringifier");var a=x("./XMLStringWriter");W.exports=function(c){function t(p){t.__super__.constructor.call(this,null);this.name="?xml";p||(p={});p.writer||(p.writer=new a);this.options=p;this.stringify=new l(p);this.isDocument=!0}n(t,c);t.prototype.end=function(p){p?g(p)&&(p=this.options.writer.set(p)):p=this.options.writer;return p.document(this)};t.prototype.toString=function(p){return this.options.writer.set(p).document(this)};return t}(b)}).call(this)},{"./Utility":158,"./XMLNode":171, + "./XMLStringWriter":175,"./XMLStringifier":176}],169:[function(x,W,D){(function(){var n={}.hasOwnProperty;var m=x("./Utility");var g=m.isObject;var b=m.isFunction;var l=m.isPlainObject;var a=m.getValue;var c=x("./XMLElement");var t=x("./XMLCData");var p=x("./XMLComment");var w=x("./XMLRaw");var r=x("./XMLText");var E=x("./XMLProcessingInstruction");var K=x("./XMLDeclaration");var U=x("./XMLDocType");var O=x("./XMLDTDAttList");var z=x("./XMLDTDEntity");var M=x("./XMLDTDElement");var f=x("./XMLDTDNotation"); + var N=x("./XMLAttribute");var T=x("./XMLStringifier");var q=x("./XMLStringWriter");W.exports=function(){function F(G,k,J){this.name="?xml";G||(G={});if(!G.writer)G.writer=new q(G);else if(l(G.writer)){var I=G.writer;G.writer=new q(I)}this.options=G;this.writer=G.writer;this.stringify=new T(G);this.onDataCallback=k||function(){};this.onEndCallback=J||function(){};this.currentNode=null;this.currentLevel=-1;this.openTags={};this.documentCompleted=this.documentStarted=!1;this.root=null}F.prototype.node= + function(G,k,J){if(null==G)throw Error("Missing node name.");if(this.root&&-1===this.currentLevel)throw Error("Document can only have one root node. "+this.debugInfo(G));this.openCurrent();G=a(G);null==k&&(k={});k=a(k);g(k)||(k=[k,J],J=k[0],k=k[1]);this.currentNode=new c(this,G,k);this.currentNode.children=!1;this.currentLevel++;this.openTags[this.currentLevel]=this.currentNode;null!=J&&this.text(J);return this};F.prototype.element=function(G,k,J){return this.currentNode&&this.currentNode instanceof + U?this.dtdElement.apply(this,arguments):this.node(G,k,J)};F.prototype.attribute=function(G,k){var J;if(!this.currentNode||this.currentNode.children)throw Error("att() can only be used immediately after an ele() call in callback mode. "+this.debugInfo(G));null!=G&&(G=a(G));if(g(G))for(J in G)n.call(G,J)&&(k=G[J],this.attribute(J,k));else b(k)&&(k=k.apply()),this.options.skipNullAttributes&&null==k||(this.currentNode.attributes[G]=new N(this,G,k));return this};F.prototype.text=function(G){this.openCurrent(); + G=new r(this,G);this.onData(this.writer.text(G,this.currentLevel+1),this.currentLevel+1);return this};F.prototype.cdata=function(G){this.openCurrent();G=new t(this,G);this.onData(this.writer.cdata(G,this.currentLevel+1),this.currentLevel+1);return this};F.prototype.comment=function(G){this.openCurrent();G=new p(this,G);this.onData(this.writer.comment(G,this.currentLevel+1),this.currentLevel+1);return this};F.prototype.raw=function(G){this.openCurrent();G=new w(this,G);this.onData(this.writer.raw(G, + this.currentLevel+1),this.currentLevel+1);return this};F.prototype.instruction=function(G,k){var J;this.openCurrent();null!=G&&(G=a(G));null!=k&&(k=a(k));if(Array.isArray(G))for(k=0,J=G.length;kthis.currentLevel)throw Error("The document node has no parent.");this.currentNode?(this.currentNode.children? + this.closeNode(this.currentNode):this.openNode(this.currentNode),this.currentNode=null):this.closeNode(this.openTags[this.currentLevel]);delete this.openTags[this.currentLevel];this.currentLevel--;return this};F.prototype.end=function(){for(;0<=this.currentLevel;)this.up();return this.onEnd()};F.prototype.openCurrent=function(){if(this.currentNode)return this.currentNode.children=!0,this.openNode(this.currentNode)};F.prototype.openNode=function(G){if(!G.isOpen)return!this.root&&0===this.currentLevel&& + G instanceof c&&(this.root=G),this.onData(this.writer.openNode(G,this.currentLevel),this.currentLevel),G.isOpen=!0};F.prototype.closeNode=function(G){if(!G.isClosed)return this.onData(this.writer.closeNode(G,this.currentLevel),this.currentLevel),G.isClosed=!0};F.prototype.onData=function(G,k){this.documentStarted=!0;return this.onDataCallback(G,k+1)};F.prototype.onEnd=function(){this.documentCompleted=!0;return this.onEndCallback()};F.prototype.debugInfo=function(G){return null==G?"":"node: <"+G+ + ">"};F.prototype.ele=function(){return this.element.apply(this,arguments)};F.prototype.nod=function(G,k,J){return this.node(G,k,J)};F.prototype.txt=function(G){return this.text(G)};F.prototype.dat=function(G){return this.cdata(G)};F.prototype.com=function(G){return this.comment(G)};F.prototype.ins=function(G,k){return this.instruction(G,k)};F.prototype.dec=function(G,k,J){return this.declaration(G,k,J)};F.prototype.dtd=function(G,k,J){return this.doctype(G,k,J)};F.prototype.e=function(G,k,J){return this.element(G, + k,J)};F.prototype.n=function(G,k,J){return this.node(G,k,J)};F.prototype.t=function(G){return this.text(G)};F.prototype.d=function(G){return this.cdata(G)};F.prototype.c=function(G){return this.comment(G)};F.prototype.r=function(G){return this.raw(G)};F.prototype.i=function(G,k){return this.instruction(G,k)};F.prototype.att=function(){return this.currentNode&&this.currentNode instanceof U?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)};F.prototype.a=function(){return this.currentNode&& + this.currentNode instanceof U?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)};F.prototype.ent=function(G,k){return this.entity(G,k)};F.prototype.pent=function(G,k){return this.pEntity(G,k)};F.prototype.not=function(G,k){return this.notation(G,k)};return F}()}).call(this)},{"./Utility":158,"./XMLAttribute":159,"./XMLCData":160,"./XMLComment":161,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLDeclaration":166,"./XMLDocType":167, + "./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLStringWriter":175,"./XMLStringifier":176,"./XMLText":177}],170:[function(x,W,D){(function(){var n=function(t,p){function w(){this.constructor=t}for(var r in p)m.call(p,r)&&(t[r]=p[r]);w.prototype=p.prototype;t.prototype=new w;t.__super__=p.prototype;return t},m={}.hasOwnProperty;var g=x("./Utility");var b=g.isObject;var l=g.isFunction;var a=g.getValue;g=x("./XMLNode");var c=x("./XMLAttribute");W.exports=function(t){function p(w, + r,E){p.__super__.constructor.call(this,w);if(null==r)throw Error("Missing element name. "+this.debugInfo());this.name=this.stringify.eleName(r);this.attributes={};null!=E&&this.attribute(E);w.isDocument&&(this.isRoot=!0,this.documentObject=w,w.rootObject=this)}n(p,t);p.prototype.clone=function(){var w;var r=Object.create(this);r.isRoot&&(r.documentObject=null);r.attributes={};var E=this.attributes;for(w in E)if(m.call(E,w)){var K=E[w];r.attributes[w]=K.clone()}r.children=[];this.children.forEach(function(U){U= + U.clone();U.parent=r;return r.children.push(U)});return r};p.prototype.attribute=function(w,r){var E;null!=w&&(w=a(w));if(b(w))for(E in w)m.call(w,E)&&(r=w[E],this.attribute(E,r));else l(r)&&(r=r.apply()),this.options.skipNullAttributes&&null==r||(this.attributes[w]=new c(this,w,r));return this};p.prototype.removeAttribute=function(w){var r;if(null==w)throw Error("Missing attribute name. "+this.debugInfo());w=a(w);if(Array.isArray(w)){var E=0;for(r=w.length;Ez)throw Error("Already at the first node. "+this.debugInfo());return this.parent.children[z-1]};O.prototype.next=function(){var z=this.parent.children.indexOf(this); + if(-1===z||z===this.parent.children.length-1)throw Error("Already at the last node. "+this.debugInfo());return this.parent.children[z+1]};O.prototype.importDocument=function(z){z=z.root().clone();z.parent=this;z.isRoot=!1;this.children.push(z);return this};O.prototype.debugInfo=function(z){var M,f;z=z||this.name;return null!=z||null!=(M=this.parent)&&M.name?null==z?"parent: <"+this.parent.name+">":null!=(f=this.parent)&&f.name?"node: <"+z+">, parent: <"+this.parent.name+">":"node: <"+z+">":""};O.prototype.ele= + function(z,M,f){return this.element(z,M,f)};O.prototype.nod=function(z,M,f){return this.node(z,M,f)};O.prototype.txt=function(z){return this.text(z)};O.prototype.dat=function(z){return this.cdata(z)};O.prototype.com=function(z){return this.comment(z)};O.prototype.ins=function(z,M){return this.instruction(z,M)};O.prototype.doc=function(){return this.document()};O.prototype.dec=function(z,M,f){return this.declaration(z,M,f)};O.prototype.dtd=function(z,M){return this.doctype(z,M)};O.prototype.e=function(z, + M,f){return this.element(z,M,f)};O.prototype.n=function(z,M,f){return this.node(z,M,f)};O.prototype.t=function(z){return this.text(z)};O.prototype.d=function(z){return this.cdata(z)};O.prototype.c=function(z){return this.comment(z)};O.prototype.r=function(z){return this.raw(z)};O.prototype.i=function(z,M){return this.instruction(z,M)};O.prototype.u=function(){return this.up()};O.prototype.importXMLBuilder=function(z){return this.importDocument(z)};return O}()}).call(this)},{"./Utility":158,"./XMLCData":160, + "./XMLComment":161,"./XMLDeclaration":166,"./XMLDocType":167,"./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLText":177}],172:[function(x,W,D){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing instruction target. "+ + this.debugInfo());this.target=this.stringify.insTarget(c);t&&(this.value=this.stringify.insValue(t))}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).processingInstruction(this)};return l}(g)}).call(this)},{"./XMLNode":171}],173:[function(x,W,D){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b}, + m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing raw text. "+this.debugInfo());this.value=this.stringify.raw(c)}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).raw(this)};return l}(g)}).call(this)},{"./XMLNode":171}],174:[function(x,W,D){(function(){var n=function(z,M){function f(){this.constructor=z}for(var N in M)m.call(M, + N)&&(z[N]=M[N]);f.prototype=M.prototype;z.prototype=new f;z.__super__=M.prototype;return z},m={}.hasOwnProperty;var g=x("./XMLDeclaration");var b=x("./XMLDocType");var l=x("./XMLCData");var a=x("./XMLComment");var c=x("./XMLElement");var t=x("./XMLRaw");var p=x("./XMLText");var w=x("./XMLProcessingInstruction");var r=x("./XMLDTDAttList");var E=x("./XMLDTDElement");var K=x("./XMLDTDEntity");var U=x("./XMLDTDNotation");var O=x("./XMLWriterBase");W.exports=function(z){function M(f,N){M.__super__.constructor.call(this, + N);this.stream=f}n(M,z);M.prototype.document=function(f){var N;var T=f.children;var q=0;for(N=T.length;q");return this.stream.write(this.endline(f))};M.prototype.docType=function(f,N){var T;N||(N=0);this.stream.write(this.space(N));this.stream.write("");return this.stream.write(this.endline(f))};M.prototype.element=function(f,N){N||(N=0);var T=this.space(N);this.stream.write(T+"<"+f.name);var q=f.attributes;for(k in q)if(m.call(q,k)){var F=q[k];this.attribute(F)}if(0===f.children.length||f.children.every(function(J){return""===J.value}))this.allowEmpty?this.stream.write(">"):this.stream.write(this.spacebeforeslash+"/>");else if(this.pretty&&1===f.children.length&& + null!=f.children[0].value)this.stream.write(">"),this.stream.write(f.children[0].value),this.stream.write("");else{this.stream.write(">"+this.newline);var G=f.children;var k=0;for(q=G.length;k")}return this.stream.write(this.endline(f))};M.prototype.processingInstruction=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.raw=function(f,N){return this.stream.write(this.space(N)+f.value+this.endline(f))};M.prototype.text=function(f,N){return this.stream.write(this.space(N)+ + f.value+this.endline(f))};M.prototype.dtdAttList=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.dtdElement=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.dtdEntity=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.dtdNotation=function(f,N){this.stream.write(this.space(N)+ + ""+this.endline(f))};M.prototype.endline=function(f){return f.isLastRootNode?"":this.newline};return M}(O)}).call(this)},{"./XMLCData":160,"./XMLComment":161,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLDeclaration":166, + "./XMLDocType":167,"./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLText":177,"./XMLWriterBase":178}],175:[function(x,W,D){(function(){var n=function(z,M){function f(){this.constructor=z}for(var N in M)m.call(M,N)&&(z[N]=M[N]);f.prototype=M.prototype;z.prototype=new f;z.__super__=M.prototype;return z},m={}.hasOwnProperty;var g=x("./XMLDeclaration");var b=x("./XMLDocType");var l=x("./XMLCData");var a=x("./XMLComment");var c=x("./XMLElement");var t=x("./XMLRaw");var p=x("./XMLText"); + var w=x("./XMLProcessingInstruction");var r=x("./XMLDTDAttList");var E=x("./XMLDTDElement");var K=x("./XMLDTDEntity");var U=x("./XMLDTDNotation");var O=x("./XMLWriterBase");W.exports=function(z){function M(f){M.__super__.constructor.call(this,f)}n(M,z);M.prototype.document=function(f){var N;this.textispresent=!1;var T="";var q=f.children;f=0;for(N=q.length;f";return N+=this.newline};M.prototype.docType=function(f,N){var T;N||(N=0);var q=this.space(N);q+="";return q+=this.newline};M.prototype.element=function(f,N){var T;N||(N=0);var q=!1;this.textispresent?(this.newline="",this.pretty=!1):(this.newline=this.newlinedefault,this.pretty=this.prettydefault);var F=this.space(N);var G=F+"<"+f.name;var k=f.attributes;for(T in k)if(m.call(k,T)){var J=k[T];G+=this.attribute(J)}if(0===f.children.length||f.children.every(function(S){return""===S.value}))G=this.allowEmpty?G+(">"+this.newline):G+(this.spacebeforeslash+"/>"+ + this.newline);else if(this.pretty&&1===f.children.length&&null!=f.children[0].value)G=G+">"+f.children[0].value,G+=""+this.newline;else{if(this.dontprettytextnodes)for(k=f.children,J=0,T=k.length;J"+this.newline;k=f.children;J=0;for(T=k.length;J"+this.newline}return G};M.prototype.processingInstruction= + function(f,N){N=this.space(N)+""+this.newline};M.prototype.raw=function(f,N){return this.space(N)+f.value+this.newline};M.prototype.text=function(f,N){return this.space(N)+f.value+this.newline};M.prototype.dtdAttList=function(f,N){N=this.space(N)+""+this.newline};M.prototype.dtdElement=function(f,N){return this.space(N)+""+this.newline};M.prototype.dtdEntity=function(f,N){N=this.space(N)+""+this.newline};M.prototype.dtdNotation=function(f, + N){N=this.space(N)+""+this.newline};M.prototype.openNode=function(f,N){var T;N||(N=0);if(f instanceof c){var q=this.space(N)+"<"+f.name;var F=f.attributes;for(T in F)m.call(F,T)&&(N=F[T],q+=this.attribute(N));q+=(f.children?">":"/>")+this.newline}else q=this.space(N)+"")+this.newline;return q};M.prototype.closeNode=function(f,N){N||(N=0);switch(!1){case !(f instanceof c):return this.space(N)+""+this.newline;case !(f instanceof b):return this.space(N)+"]>"+this.newline}};return M}(O)}).call(this)},{"./XMLCData":160,"./XMLComment":161,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLDeclaration":166,"./XMLDocType":167, + "./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLText":177,"./XMLWriterBase":178}],176:[function(x,W,D){(function(){var n=function(g,b){return function(){return g.apply(b,arguments)}},m={}.hasOwnProperty;W.exports=function(){function g(b){this.assertLegalChar=n(this.assertLegalChar,this);var l;b||(b={});this.noDoubleEncoding=b.noDoubleEncoding;b=b.stringify||{};for(l in b)if(m.call(b,l)){var a=b[l];this[l]=a}}g.prototype.eleName=function(b){return this.assertLegalChar(""+b|| + "")};g.prototype.eleText=function(b){return this.assertLegalChar(this.elEscape(""+b||""))};g.prototype.cdata=function(b){b=(""+b||"").replace("]]\x3e","]]]]\x3e");return this.assertLegalChar(b)};g.prototype.comment=function(b){b=""+b||"";if(b.match(/--/))throw Error("Comment text cannot contain double-hypen: "+b);return this.assertLegalChar(b)};g.prototype.raw=function(b){return""+b||""};g.prototype.attName=function(b){return""+b||""};g.prototype.attValue=function(b){return this.attEscape(""+ + b||"")};g.prototype.insTarget=function(b){return""+b||""};g.prototype.insValue=function(b){b=""+b||"";if(b.match(/\?>/))throw Error("Invalid processing instruction value: "+b);return b};g.prototype.xmlVersion=function(b){b=""+b||"";if(!b.match(/1\.[0-9]+/))throw Error("Invalid version number: "+b);return b};g.prototype.xmlEncoding=function(b){b=""+b||"";if(!b.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/))throw Error("Invalid encoding: "+b);return b};g.prototype.xmlStandalone=function(b){return b?"yes":"no"}; + g.prototype.dtdPubID=function(b){return""+b||""};g.prototype.dtdSysID=function(b){return""+b||""};g.prototype.dtdElementValue=function(b){return""+b||""};g.prototype.dtdAttType=function(b){return""+b||""};g.prototype.dtdAttDefault=function(b){return null!=b?""+b||"":b};g.prototype.dtdEntityValue=function(b){return""+b||""};g.prototype.dtdNData=function(b){return""+b||""};g.prototype.convertAttKey="@";g.prototype.convertPIKey="?";g.prototype.convertTextKey="#text";g.prototype.convertCDataKey="#cdata"; + g.prototype.convertCommentKey="#comment";g.prototype.convertRawKey="#raw";g.prototype.assertLegalChar=function(b){var l;if(l=b.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/))throw Error("Invalid character in string: "+b+" at index "+l.index);return b};g.prototype.elEscape=function(b){return b.replace(this.noDoubleEncoding?/(?!&\S+;)&/g:/&/g,"&").replace(//g,">").replace(/\r/g," ")};g.prototype.attEscape=function(b){return b.replace(this.noDoubleEncoding? + /(?!&\S+;)&/g:/&/g,"&").replace(/'); +c.ui.registry.addButton("importword",{icon:"importword",tooltip:"\u5bfc\u5165Word",onAction:function(){u()}});return{getMetadata:function(){return{name:"\u5bfc\u5165Word",url:"https://github.com/Five-great/tinymce-plugins"}}}}); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/importword/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/importword/plugin.min.js new file mode 100644 index 000000000..72822c7f0 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/importword/plugin.min.js @@ -0,0 +1,753 @@ +/** + * importword 1.2v + * The tinymce-plugins is used to import word + * + * https://github.com/Five-great/tinymce-plugins + * + * Copyright 2020, Five(Li Hailong) The Chengdu, China https://www.fivecc.cn/ + * + * Licensed under MIT + */ + (function(pa){"object"===typeof exports&&"undefined"!==typeof module?module.exports=pa():"function"===typeof define&&define.amd?define([],pa):("undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self?self:this).mammoth=pa()})(function(){return function n(x,W,C){function m(l,a){if(!W[l]){if(!x[l]){var c="function"==typeof require&&require;if(!a&&c)return c(l,!0);if(g)return g(l,!0);a=Error("Cannot find module '"+l+"'");throw a.code="MODULE_NOT_FOUND",a;}a=W[l]= + {exports:{}};x[l][0].call(a.exports,function(t){var p=x[l][1][t];return m(p?p:t)},a,a.exports,n,x,W,C)}return W[l].exports}for(var g="function"==typeof require&&require,b=0;b h1\" instead of mammoth.styleMapping(\"p[style-name='Title'] => h1\")");}},{"./document-to-html":3,"./docx/docx-reader":9,"./docx/style-map":14,"./images":20,"./options-reader":22,"./results":24,"./style-reader":25,"./transforms":29,"./underline":30,"./unzip":2,underscore:153}],22:[function(x,W,C){function n(l){return l?m.isString(l)?l.split("\n").map(function(a){return a.trim()}).filter(function(a){return""!== + a&&"#"!==a.charAt(0)}):l:[]}C.readOptions=function(l){l=l||{};return m.extend({},b,l,{customStyleMap:n(l.styleMap),readStyleMap:function(){var a=this.customStyleMap;this.includeEmbeddedStyleMap&&(a=a.concat(n(this.embeddedStyleMap)));this.includeDefaultStyleMap&&(a=a.concat(g));return a}})};var m=x("underscore"),g=C._defaultStyleMap="p.Heading1 => h1:fresh;p.Heading2 => h2:fresh;p.Heading3 => h3:fresh;p.Heading4 => h4:fresh;p.Heading5 => h5:fresh;p.Heading6 => h6:fresh;p[style-name='Heading 1'] => h1:fresh;p[style-name='Heading 2'] => h2:fresh;p[style-name='Heading 3'] => h3:fresh;p[style-name='Heading 4'] => h4:fresh;p[style-name='Heading 5'] => h5:fresh;p[style-name='Heading 6'] => h6:fresh;p[style-name='heading 1'] => h1:fresh;p[style-name='heading 2'] => h2:fresh;p[style-name='heading 3'] => h3:fresh;p[style-name='heading 4'] => h4:fresh;p[style-name='heading 5'] => h5:fresh;p[style-name='heading 6'] => h6:fresh;r[style-name='Strong'] => strong;p[style-name='footnote text'] => p:fresh;r[style-name='footnote reference'] =>;p[style-name='endnote text'] => p:fresh;r[style-name='endnote reference'] =>;p[style-name='annotation text'] => p:fresh;r[style-name='annotation reference'] =>;p[style-name='Footnote'] => p:fresh;r[style-name='Footnote anchor'] =>;p[style-name='Endnote'] => p:fresh;r[style-name='Endnote anchor'] =>;p:unordered-list(1) => ul > li:fresh;p:unordered-list(2) => ul|ol > li > ul > li:fresh;p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh;p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh;p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh;p:ordered-list(1) => ol > li:fresh;p:ordered-list(2) => ul|ol > li > ol > li:fresh;p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh;p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh;p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh;r[style-name='Hyperlink'] =>;p[style-name='Normal'] => p:fresh".split(";"), + b=C._standardOptions={transformDocument:function(l){return l},includeDefaultStyleMap:!0,includeEmbeddedStyleMap:!0}},{underscore:153}],23:[function(x,W,C){var n=x("underscore"),m=x("bluebird/js/release/promise")();C.defer=function(){var g,b,l=new m.Promise(function(a,c){g=a;b=c});return{resolve:g,reject:b,promise:l}};C.when=m.resolve;C.resolve=m.resolve;C.all=m.all;C.props=m.props;C.reject=m.reject;C.promisify=m.promisify;C.mapSeries=m.mapSeries;C.attempt=m.attempt;C.nfcall=function(g){var b=Array.prototype.slice.call(arguments, + 1);return m.promisify(g).apply(null,b)};m.prototype.fail=m.prototype.caught;m.prototype.also=function(g){return this.then(function(b){b=n.extend({},b,g(b));return m.props(b)})}},{"bluebird/js/release/promise":60,underscore:153}],24:[function(x,W,C){function n(l,a){this.value=l;this.messages=a||[]}function m(l){var a=[];b.flatten(b.pluck(l,"messages"),!0).forEach(function(c){void 0===b.find(a,g.bind(null,c))&&a.push(c)});return a}function g(l,a){return l.type===a.type&&l.message===a.message}var b= + x("underscore");C.Result=n;C.success=function(l){return new n(l,[])};C.warning=function(l){return{type:"warning",message:l}};C.error=function(l){return{type:"error",message:l.message,error:l}};n.prototype.map=function(l){return new n(l(this.value),this.messages)};n.prototype.flatMap=function(l){l=l(this.value);return new n(l.value,m([this,l]))};n.prototype.flatMapThen=function(l){var a=this;return l(this.value).then(function(c){return new n(c.value,m([a,c]))})};n.combine=function(l){var a=b.flatten(b.pluck(l, + "value"));l=m(l);return new n(a,l)}},{underscore:153}],25:[function(x,W,C){function n(){function f(R){R=c.rules.firstOf.apply(c.rules.firstOf,["matcher suffix"].concat(R));R=c.rules.zeroOrMore(R);return c.rules.then(R,function(Q){var B={};Q.forEach(function(H){a.extend(B,H)});return B})}var N=c.rules.sequence,T=function(R,Q){return c.rules.then(c.rules.token("identifier",R),function(){return Q})},q=T("p",t.paragraph),F=T("r",t.run);q=c.rules.firstOf("p or r or table",q,F);F=c.rules.then(z,function(R){return{styleId:R}}); + var G=c.rules.firstOf("style name matcher",c.rules.then(c.rules.sequence(c.rules.tokenOfType("equals"),c.rules.sequence.cut(),c.rules.sequence.capture(U)).head(),function(R){return{styleName:t.equalTo(R)}}),c.rules.then(c.rules.sequence(c.rules.tokenOfType("startsWith"),c.rules.sequence.cut(),c.rules.sequence.capture(U)).head(),function(R){return{styleName:t.startsWith(R)}}));G=c.rules.sequence(c.rules.tokenOfType("open-square-bracket"),c.rules.sequence.cut(),c.rules.token("identifier","style-name"), + c.rules.sequence.capture(G),c.rules.tokenOfType("close-square-bracket")).head();var k=c.rules.firstOf("list type",T("ordered-list",{isOrdered:!0}),T("unordered-list",{isOrdered:!1}));k=N(c.rules.tokenOfType("colon"),N.capture(k),N.cut(),c.rules.tokenOfType("open-paren"),N.capture(K),c.rules.tokenOfType("close-paren")).map(function(R,Q){return{list:{isOrdered:R.isOrdered,levelIndex:Q-1}}});q=N(N.capture(q),N.capture(f([F,G,k]))).map(function(R,Q){return R(Q)});F=N(c.rules.token("identifier","table"), + N.capture(f([F,G]))).map(function(R){return t.table(R)});G=T("b",t.bold);k=T("i",t.italic);var J=T("u",t.underline),I=T("strike",t.strikethrough),S=T("small-caps",t.smallCaps);T=T("comment-reference",t.commentReference);N=N(c.rules.token("identifier","br"),N.cut(),c.rules.tokenOfType("open-square-bracket"),c.rules.token("identifier","type"),c.rules.tokenOfType("equals"),N.capture(U),c.rules.tokenOfType("close-square-bracket")).map(function(R){switch(R){case "line":return t.lineBreak;case "page":return t.pageBreak; + case "column":return t.columnBreak}});return c.rules.firstOf("element type",q,F,G,k,J,I,S,T,N)}function m(){var f=c.rules.sequence.capture,N=c.rules.tokenOfType("whitespace"),T=c.rules.then(c.rules.optional(c.rules.sequence(c.rules.tokenOfType("colon"),c.rules.token("identifier","fresh"))),function(G){return G.map(function(){return!0}).valueOrElse(!1)}),q=c.rules.then(c.rules.optional(c.rules.sequence(c.rules.tokenOfType("colon"),c.rules.token("identifier","separator"),c.rules.tokenOfType("open-paren"), + f(U),c.rules.tokenOfType("close-paren")).head()),function(G){return G.valueOrElse("")}),F=c.rules.oneOrMoreWithSeparator(E,c.rules.tokenOfType("choice"));f=c.rules.sequence(f(F),f(c.rules.zeroOrMore(z)),f(T),f(q)).map(function(G,k,J,I){var S={},R={};0/},{name:"whitespace",regex:/\s+/},{name:"arrow",regex:/=>/},{name:"equals",regex:/=/},{name:"startsWith",regex:/\^=/},{name:"open-paren",regex:/\(/},{name:"close-paren",regex:/\)/}, + {name:"open-square-bracket",regex:/\[/},{name:"close-square-bracket",regex:/\]/},{name:"string",regex:new RegExp(m+"'")},{name:"unterminated-string",regex:new RegExp(m)},{name:"integer",regex:/([0-9]+)/},{name:"choice",regex:/\|/},{name:"bang",regex:/(!)/}])).tokenise(g)};var m="'((?:\\\\.|[^'])*)"},{lop:107}],29:[function(x,W,C){function n(a,c){return m(function(t){return t.type===a?c(t):t})}function m(a){return function p(t){if(t.children){var v=l.map(t.children,p);t=l.extend(t,{children:v})}return a(t)}} + function g(a){var c=[];b(a,function(t){c.push(t)});return c}function b(a,c){a.children&&a.children.forEach(function(t){b(t,c);c(t)})}var l=x("underscore");C.paragraph=function(a){return n("paragraph",a)};C.run=function(a){return n("run",a)};C._elements=m;C.getDescendantsOfType=function(a,c){return g(a).filter(function(t){return t.type===c})};C.getDescendants=g},{underscore:153}],30:[function(x,W,C){var n=x("./styles/html-paths"),m=x("./html");C.element=function(g){return function(b){return m.elementWithTag(n.element(g), + [b])}}},{"./html":18,"./styles/html-paths":27}],31:[function(x,W,C){function n(){function a(){r=!1;if(!v&&(0===p.length||l[p[p.length-1]])&&!c()){E._append("\n");for(var K=0;K/g,">"))}).join("")}var c=[];return{asString:function(){return c.join("")},open:function(t,p){p=a(p);c.push(g.format("<%s%s>",t,p))},close:function(t){c.push(g.format("",t))},text:function(t){c.push(t.replace(/&/g,"&").replace(//g,">"))},selfClosing:function(t, + p){p=a(p);c.push(g.format("<%s%s />",t,p))},_append:function(t){c.push(t)}}}var g=x("util"),b=x("underscore");C.writer=function(a){a=a||{};return a.prettyPrint?n():m()};var l={div:!0,p:!0,ul:!0,li:!0}},{underscore:153,util:157}],32:[function(x,W,C){var n=x("./html-writer"),m=x("./markdown-writer");C.writer=function(g){g=g||{};return"markdown"===g.outputFormat?m.writer():n.writer(g)}},{"./html-writer":31,"./markdown-writer":33}],33:[function(x,W,C){function n(a){return m(a,a)}function m(a,c){return function(){return{start:a, + end:c}}}function g(a){return function(c,t){return{start:t?"\n":"",end:t?"":"\n",list:{isOrdered:a.isOrdered,indent:t?t.indent+1:0,count:0}}}}var b=x("underscore"),l={p:m("","\n\n"),br:m(""," \n"),ul:g({isOrdered:!1}),ol:g({isOrdered:!0}),li:function(a,c,t){c=c||{indent:0,isOrdered:!1,count:0};c.count++;t.hasClosed=!1;a=c.isOrdered?c.count+".":"-";return{start:Array(c.indent+1).join("\t")+a+" ",end:function(){if(!t.hasClosed)return t.hasClosed=!0,"\n"}}},strong:n("__"),em:n("*"),a:function(a){return(a= + a.href||"")?{start:"[",end:"]("+a+")",anchorPosition:"before"}:{}},img:function(a){var c=a.src||"";a=a.alt||"";return c||a?{start:"!["+a+"]("+c+")"}:{}}};(function(){for(var a=1;6>=a;a++)l["h"+a]=m(Array(a+1).join("#")+" ","\n\n")})();C.writer=function(){function a(K,U){U=U||{};K=(l[K]||function(){return{}})(U,r,E);v.push({end:K.end,list:r});K.list&&(r=K.list);var O="before"===K.anchorPosition;O&&c(U);p.push(K.start||"");O||c(U)}function c(K){K.id&&p.push('')}function t(K){K= + v.pop();r=K.list;K=b.isFunction(K.end)?K.end():K.end;p.push(K||"")}var p=[],v=[],r=null,E={};return{asString:function(){return p.join("")},open:a,close:t,text:function(K){p.push(K.replace(/\\/g,"\\\\").replace(/([`\*_\{\}\[\]\(\)#\+\-\.!])/g,"\\$1"))},selfClosing:function(K,U){a(K,U);t(K)}}}},{underscore:153}],34:[function(x,W,C){W=x("./nodes");C.Element=W.Element;C.element=W.element;C.text=W.text;C.readString=x("./reader").readString;C.writeString=x("./writer").writeString},{"./nodes":35,"./reader":36, + "./writer":37}],35:[function(x,W,C){function n(l,a,c){this.type="element";this.name=l;this.attributes=a||{};this.children=c||[]}var m=x("underscore");C.Element=n;C.element=function(l,a,c){return new n(l,a,c)};C.text=function(l){return{type:"text",value:l}};var g={first:function(){return null},firstOrEmpty:function(){return g},attributes:{}};n.prototype.first=function(l){return m.find(this.children,function(a){return a.name===l})};n.prototype.firstOrEmpty=function(l){return this.first(l)||g};n.prototype.getElementsByTagName= + function(l){var a=m.filter(this.children,function(c){return c.name===l});return m.extend(a,b)};n.prototype.text=function(){if(0===this.children.length)return"";if(1!==this.children.length||"text"!==this.children[0].type)throw Error("Not implemented");return this.children[0].value};var b={getElementsByTagName:function(l){return m.extend(m.flatten(this.map(function(a){return a.getElementsByTagName(l)},!0)),b)}}},{underscore:153}],36:[function(x,W,C){function n(c,t,p){return b.reduce(c,function(v,r, + E){var K=p(r,E,c);v[K]=t(r,E,c);return v},{})}var m=x("../promises"),g=x("sax"),b=x("underscore"),l=x("./nodes"),a=l.Element;C.readString=function(c,t){function p(z){if(z.uri){var M=t[z.uri];return(M?M+":":"{"+z.uri+"}")+z.local}return z.local}t=t||{};var v=!1,r=g.parser(!0,{xmlns:!0,position:!1}),E={children:[]},K=E,U=[],O=m.defer();r.onopentag=function(z){var M=n(z.attributes,function(f){return f.value},p);z=new a(p(z),M);K.children.push(z);U.push(K);K=z};r.onclosetag=function(z){K=U.pop()};r.ontext= + function(z){K!==E&&K.children.push(l.text(z))};r.onend=function(){v||(v=!0,O.resolve(E.children[0]))};r.onerror=function(z){v||(v=!0,O.reject(z))};r.write(c).close();return O.promise}},{"../promises":23,"./nodes":35,sax:150,underscore:153}],37:[function(x,W,C){function n(b,l){b.text(l.value)}var m=x("underscore"),g=x("xmlbuilder");C.writeString=function(b,l){function a(p){var v=/^\{(.*)\}(.*)$/.exec(p);return v?(p=c[v[1]],p+(""===p?"":":")+v[2]):p}var c=m.invert(l),t={element:function(p,v){var r= + p.element(a(v.name),v.attributes);v.children.forEach(function(E){t[E.type](r,E)})},text:n};return function(p){var v=g.create(a(p.name),{version:"1.0",encoding:"UTF-8",standalone:!0});m.forEach(l,function(r,E){v.attribute("xmlns"+(""===E?"":":"+E),r)});p.children.forEach(function(r){t[r.type](v,r)});return v.end()}(b)}},{underscore:153,xmlbuilder:179}],38:[function(x,W,C){(function(n){var m=x("jszip"),g=x("./promises");C.openArrayBuffer=function(b){var l=new m(b);return{exists:function(a){return null!== + l.file(a)},read:function(a,c){a=l.file(a).asUint8Array();a=new n(a);return c?g.when(a.toString(c)):g.when(a)},write:function(a,c){l.file(a,c)},toBuffer:function(){return l.generate({type:"nodebuffer"})}}};C.splitPath=function(b){var l=b.lastIndexOf("/");return-1===l?{dirname:"",basename:b}:{dirname:b.substring(0,l),basename:b.substring(l+1)}};C.joinPath=function(){var b=[];Array.prototype.filter.call(arguments,function(l){return l}).forEach(function(l){/^\//.test(l)?b=[l]:b.push(l)});return b.join("/")}}).call(this, + x("buffer").Buffer)},{"./promises":23,buffer:77,jszip:92}],39:[function(x,W,C){function n(a){var c=a.length;if(0>18&63]+g[c>>12&63]+g[c>>6&63]+g[c&63]);return p.join("")}C.byteLength=function(a){return 3*a.length/4-n(a)};C.toByteArray=function(a){var c=a.length;var t=n(a);var p=new l(3*c/4-t);var v=0>16&255;p[r++]=E>>8&255;p[r++]=E&255}2===t?(E=b[a.charCodeAt(c)]<<2|b[a.charCodeAt(c+1)]>>4,p[r++]=E&255):1===t&&(E=b[a.charCodeAt(c)]<<10|b[a.charCodeAt(c+1)]<<4|b[a.charCodeAt(c+2)]>>2,p[r++]=E>>8&255,p[r++]=E&255);return p};C.fromByteArray=function(a){for(var c=a.length,t=c%3,p="",v=[],r=0,E=c-t;rE?E:r+16383));1===t?(a=a[c-1],p+= + g[a>>2],p+=g[a<<4&63],p+="=="):2===t&&(a=(a[c-2]<<8)+a[c-1],p+=g[a>>10],p+=g[a>>4&63],p+=g[a<<2&63],p+="=");v.push(p);return v.join("")};var g=[],b=[],l="undefined"!==typeof Uint8Array?Uint8Array:Array;for(x=0;64>x;++x)g[x]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[x],b["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(x)]=x;b[45]=62;b[95]=63},{}],40:[function(x,W,C){W.exports=function(n){function m(b){b=new g(b);var l=b.promise();b.setHowMany(1); + b.setUnwrap();b.init();return l}var g=n._SomePromiseArray;n.any=function(b){return m(b)};n.prototype.any=function(){return m(this)}}},{}],41:[function(x,W,C){(function(n){function m(){this._isTickUsed=this._customScheduler=!1;this._lateQueue=new t(16);this._normalQueue=new t(16);this._haveDrainedQueues=!1;this._trampolineEnabled=!0;var v=this;this.drainQueues=function(){v._drainQueues()};this._schedule=c}function g(v,r,E){this._lateQueue.push(v,r,E);this._queueTick()}function b(v,r,E){this._normalQueue.push(v, + r,E);this._queueTick()}function l(v){this._normalQueue._pushOne(v);this._queueTick()}try{throw Error();}catch(v){var a=v}var c=x("./schedule"),t=x("./queue"),p=x("./util");m.prototype.setScheduler=function(v){var r=this._schedule;this._schedule=v;this._customScheduler=!0;return r};m.prototype.hasCustomScheduler=function(){return this._customScheduler};m.prototype.enableTrampoline=function(){this._trampolineEnabled=!0};m.prototype.disableTrampolineIfNecessary=function(){p.hasDevTools&&(this._trampolineEnabled= + !1)};m.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues};m.prototype.fatalError=function(v,r){r?(n.stderr.write("Fatal "+(v instanceof Error?v.stack:v)+"\n"),n.exit(2)):this.throwLater(v)};m.prototype.throwLater=function(v,r){1===arguments.length&&(r=v,v=function(){throw r;});if("undefined"!==typeof setTimeout)setTimeout(function(){v(r)},0);else try{this._schedule(function(){v(r)})}catch(E){throw Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n"); + }};p.hasDevTools?(m.prototype.invokeLater=function(v,r,E){this._trampolineEnabled?g.call(this,v,r,E):this._schedule(function(){setTimeout(function(){v.call(r,E)},100)})},m.prototype.invoke=function(v,r,E){this._trampolineEnabled?b.call(this,v,r,E):this._schedule(function(){v.call(r,E)})},m.prototype.settlePromises=function(v){this._trampolineEnabled?l.call(this,v):this._schedule(function(){v._settlePromises()})}):(m.prototype.invokeLater=g,m.prototype.invoke=b,m.prototype.settlePromises=l);m.prototype._drainQueue= + function(v){for(;0M&&(M=Math.max(0,M+z.length));return z[M]}var t=x("./util"),p=t.canEvaluate,v=t.isIdentifier,r=function(z){return(new Function("ensureMethod", + " \n return function(obj) { \n 'use strict' \n var len = this.length; \n ensureMethod(obj, 'methodName'); \n switch(len) { \n case 1: return obj.methodName(this[0]); \n case 2: return obj.methodName(this[0], this[1]); \n case 3: return obj.methodName(this[0], this[1], this[2]); \n case 0: return obj.methodName(); \n default: \n return obj.methodName.apply(obj, this); \n } \n }; \n ".replace(/methodName/g, + z)))(b)},E=function(z){return new Function("obj"," \n 'use strict'; \n return obj.propertyName; \n ".replace("propertyName",z))},K=function(z,M,f){var N=f[z];if("function"!==typeof N){if(!v(z))return null;N=M(z);f[z]=N;f[" size"]++;if(512M;++M)delete f[z[M]];f[" size"]=z.length-256}}return N}; + var U=function(z){return K(z,r,n)};var O=function(z){return K(z,E,m)};g.prototype.call=function(z){for(var M=arguments.length,f=Array(Math.max(M-1,0)),N=1;N=this._branchesRemainingToCancel};n.prototype._cancelBy=function(p){if(p===this)return this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0;this._branchHasCancelled();return this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1};n.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&& + this._cancel()};n.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),t.invoke(this._cancelPromises,this,void 0))};n.prototype._cancelPromises=function(){0ba.length?ba:ba.substr(0,38)+"...";return"(<"+aa+">, no stack trace)"}function F(){return"function"===typeof la}function G(aa){if(aa=aa.match(ha))return{fileName:aa[1],line:parseInt(aa[2],10)}}function k(aa){this._parent=aa;this._promisesCreated=0;aa=this._length= + 1+(void 0===aa?0:aa._length);la(this,k);32aa)){var ba=[],ea={},da=0;for(aa=this;void 0!==aa;++da)ba.push(aa),aa=aa._parent; + aa=this._length=da;for(da=aa-1;0<=da;--da){var ia=ba[da].stack;void 0===ea[ia]&&(ea[ia]=da)}for(da=0;daea||0>da||!ia||!ka||ia!==ka||ea>= + da||(fa=function(oa){return X.test(oa)?!0:(oa=G(oa))&&oa.fileName===ia&&ea<=oa.line&&oa.line<=da?!0:!1})}},warn:O,deprecated:function(aa,ba){aa+=" is deprecated and will be removed in a future version.";ba&&(aa+=" Use "+ba+" instead.");return O(aa)},CapturedTrace:k,fireDomEvent:L,fireGlobalEvent:V}}}).call(this,x("_process"))},{"./errors":50,"./util":74,_process:138}],48:[function(x,W,C){W.exports=function(n){function m(){return this.value}function g(){throw this.reason;}n.prototype["return"]=n.prototype.thenReturn= + function(b){b instanceof n&&b.suppressUnhandledRejections();return this._then(m,void 0,void 0,{value:b},void 0)};n.prototype["throw"]=n.prototype.thenThrow=function(b){return this._then(g,void 0,void 0,{reason:b},void 0)};n.prototype.catchThrow=function(b){if(1>=arguments.length)return this._then(void 0,g,void 0,{reason:b},void 0);var l=arguments[1];return this.caught(b,function(){throw l;})};n.prototype.catchReturn=function(b){if(1>=arguments.length)return b instanceof n&&b.suppressUnhandledRejections(), + this._then(void 0,m,void 0,{value:b},void 0);var l=arguments[1];l instanceof n&&l.suppressUnhandledRejections();return this.caught(b,function(){return l})}}},{}],49:[function(x,W,C){W.exports=function(n,m){function g(){return l(this)}var b=n.reduce,l=n.all;n.prototype.each=function(a){return b(this,a,m,0)._then(g,void 0,void 0,this,void 0)};n.prototype.mapSeries=function(a){return b(this,a,m,m)};n.each=function(a,c){return b(a,c,m,0)._then(g,void 0,void 0,a,void 0)};n.mapSeries=function(a,c){return b(a, + c,m,m)}}},{}],50:[function(x,W,C){function n(U,O){function z(M){if(!(this instanceof z))return new z(M);l(this,"message","string"===typeof M?M:O);l(this,"name",U);Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this)}b(z,Error);return z}function m(U){if(!(this instanceof m))return new m(U);l(this,"name","OperationalError");l(this,"message",U);this.cause=U;this.isOperational=!0;U instanceof Error?(l(this,"message",U.message),l(this,"stack",U.stack)):Error.captureStackTrace&& + Error.captureStackTrace(this,this.constructor)}C=x("./es5");var g=C.freeze;x=x("./util");var b=x.inherits,l=x.notEnumerableProp;x=n("Warning","warning");var a=n("CancellationError","cancellation error"),c=n("TimeoutError","timeout error"),t=n("AggregateError","aggregate error");try{var p=TypeError;var v=RangeError}catch(U){p=n("TypeError","type error"),v=n("RangeError","range error")}for(var r="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "), + E=0;EO;++O)E.push(r(O+1)),K.push(new Function("value","holder"," \n 'use strict'; \n holder.pIndex = value; \n holder.checkFulfillment(this); \n ".replace(/Index/g, + O+1))),U.push(new Function("promise","holder"," \n 'use strict'; \n holder.pIndex = promise; \n ".replace(/Index/g,O+1)));var z=function(M){this._reject(M)}}n.join=function(){var M=arguments.length-1;if(0=M&&t){var N=new n(b);N._captureStackTrace();f=new E[M-1](f);for(var T=K, + q=0;qO){if(z[-1*O-1]=U,1<=N&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(1<=N&&this._inFlight>=N)return z[O]=U,this._queue.push(O),!1;null!==f&&(f[O]=U);var T=this._promise,q=this._callback,F=T._boundValue();T._pushContext();U=r(q).call(F,U,O,M);q=T._popContext();a.checkForgottenReturns(U,q,null!==f?"Promise.filter":"Promise.map",T);if(U=== + E)return this._reject(U.e),!0;T=b(U,this._promise);if(T instanceof n){T=T._target();U=T._bitField;if(0===(U&50397184))return 1<=N&&this._inFlight++,z[O]=T,T._proxy(this,-1*(O+1)),!1;if(0!==(U&33554432))U=T._value();else return 0!==(U&16777216)?this._reject(T._reason()):this._cancel(),!0}z[O]=U}return++this._totalResolved>=M?(null!==f?this._filter(z,f):this._resolve(z),!0):!1};c.prototype._drainQueue=function(){for(var U=this._queue,O=this._limit,z=this._values;0>>16)){if(B=== + this)return B=c(),this._attachExtraTrace(B),this._reject(B);this._setFulfilled();this._rejectionHandler0=B;0<(H&65535)&&(0!==(H&134217728)?this._settlePromises():O.settlePromises(this))}};g.prototype._reject=function(B){var H=this._bitField;if(!((H&117506048)>>>16)){this._setRejected();this._fulfillmentHandler0=B;if(this._isFinal())return O.fatalError(B,r.isNode);0<(H&65535)?O.settlePromises(this):this._ensurePossibleRejectionHandled()}};g.prototype._fulfillPromises=function(B,H){for(var X=1;X=this._length?(this._resolve(this._values),!0):!1};c.prototype._promiseCancelled=function(){this._cancel();return!0};c.prototype._promiseRejected=function(v){this._totalResolved++;this._reject(v);return!0};c.prototype._resultCancelled=function(){if(!this._isResolved()){var v= + this._values;this._cancel();if(v instanceof n)v.cancel();else for(var r=0;r=G;--k)F.push(k);for(k=q+1;3>=k;++k)F.push(k);return F};var N=function(q,F,G,k,J,I){G=Math.max(0,("number"=== + typeof k.length?Math.max(Math.min(k.length,1024),0):0)-1);var S=f(G),R="string"===typeof q||F===t;q="string"===typeof q?"this != null ? this['"+q+"'] : fn":"fn";I="'use strict'; \n var ret = function (Parameters) { \n 'use strict'; \n var len = arguments.length; \n var promise = new Promise(INTERNAL); \n promise._captureStackTrace(); \n var nodeback = nodebackForPromise(promise, "+ + I+"); \n var ret; \n var callback = tryCatch([GetFunctionCode]); \n switch(len) { \n [CodeForSwitchCase] \n } \n if (ret === errorObj) { \n promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n } \n if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n return promise; \n }; \n notEnumerableProp(ret, '__isPromisified__', true); \n return ret; \n ".replace("[CodeForSwitchCase]", + function(){for(var Q="",B=0;B=this._length){if(this._isMap){E=this._values;K=new v;for(var U=E.length/2|0,O=0;O>1};n.prototype.props=function(){return a(this)};n.props=function(E){return a(E)}}}, + {"./es5":51,"./util":74}],64:[function(x,W,C){function n(m){this._capacity=m;this._front=this._length=0}n.prototype._willBeOverCapacity=function(m){return this._capacity=this._length?(this._resolve(this._values),!0):!1};b.prototype._promiseFulfilled=function(a,c){var t=new l; + t._bitField=33554432;t._settledValueField=a;return this._promiseResolved(c,t)};b.prototype._promiseRejected=function(a,c){var t=new l;t._bitField=16777216;t._settledValueField=a;return this._promiseResolved(c,t)};n.settle=function(a){g.deprecated(".settle()",".reflect()");return(new b(a)).promise()};n.prototype.settle=function(){return n.settle(this)}}},{"./util":74}],69:[function(x,W,C){W.exports=function(n,m,g){function b(r){this.constructor$(r);this._howMany=0;this._initialized=this._unwrap=!1} + function l(r,E){if((E|0)!==E||0>E)return g("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");r=new b(r);var K=r.promise();r.setHowMany(E);r.init();return K}var a=x("./util"),c=x("./errors").RangeError,t=x("./errors").AggregateError,p=a.isArray,v={};a.inherits(b,m);b.prototype._init=function(){if(this._initialized)if(0===this._howMany)this._resolve([]);else{this._init$(void 0,-5);var r=p(this._values);!this._isResolved()&&r&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}}; + b.prototype.init=function(){this._initialized=!0;this._init()};b.prototype.setUnwrap=function(){this._unwrap=!0};b.prototype.howMany=function(){return this._howMany};b.prototype.setHowMany=function(r){this._howMany=r};b.prototype._promiseFulfilled=function(r){this._addFulfilled(r);return this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1};b.prototype._promiseRejected=function(r){this._addRejected(r); + return this._checkOutcome()};b.prototype._promiseCancelled=function(){if(this._values instanceof n||null==this._values)return this._cancel();this._addRejected(v);return this._checkOutcome()};b.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var r=new t,E=this.length();E=G)return k._fulfill();var J=N[F++];var I=g(J);I!==J&&"function"===typeof J._isDisposable&&"function"===typeof J._getDisposer&&J._isDisposable()&& + I._setDisposable(J._getDisposer());J=I;if(J instanceof n&&J._isDisposable()){try{J=g(J._getDisposer().tryDispose(T),N.promise)}catch(S){return c(S)}if(J instanceof n)return J._then(q,c,null,null,null)}q()}var F=0,G=N.length,k=new n(l);q();return k}function p(N,T,q){this._data=N;this._promise=T;this._context=q}function v(N,T,q){this.constructor$(N,T,q)}function r(N){return p.isDisposer(N)?(this.resources[this.index]._setDisposable(N),N.promise()):N}function E(N){this.length=N;this.promise=null;this[N- + 1]=null}var K=x("./util"),U=x("./errors").TypeError,O=x("./util").inherits,z=K.errorObj,M=K.tryCatch,f={};p.prototype.data=function(){return this._data};p.prototype.promise=function(){return this._promise};p.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():f};p.prototype.tryDispose=function(N){var T=this.resource(),q=this._context;void 0!==q&&q._pushContext();N=T!==f?this.doDispose(T,N):null;void 0!==q&&q._popContext();this._promise._unsetDisposable();this._data= + null;return N};p.isDisposer=function(N){return null!=N&&"function"===typeof N.resource&&"function"===typeof N.tryDispose};O(v,p);v.prototype.doDispose=function(N,T){return this.data().call(N,N,T)};E.prototype._resultCancelled=function(){for(var N=this.length,T=0;TN)return m("you must pass at least 2 arguments to Promise.using");var T=arguments[N-1];if("function"!==typeof T)return m("expecting a function but got "+ + K.classString(T));var q=!0;if(2===N&&Array.isArray(arguments[0])){var F=arguments[0];N=F.length;q=!1}else F=arguments,N--;for(var G=new E(N),k=0;k + l)throw new RangeError("size is too large");var p=c;void 0===p&&(t=void 0,p=0);c=new g(a);if("string"===typeof p){t=new g(p,t);p=t.length;for(var v=-1;++vl)throw new RangeError("size is too large");return new g(a)};C.from=function(a,c,t){if("function"===typeof g.from&&(!n.Uint8Array||Uint8Array.from!== + g.from))return g.from(a,c,t);if("number"===typeof a)throw new TypeError('"value" argument must not be a number');if("string"===typeof a)return new g(a,c);if("undefined"!==typeof ArrayBuffer&&a instanceof ArrayBuffer){var p=c;if(1===arguments.length)return new g(a);"undefined"===typeof p&&(p=0);var v=t;"undefined"===typeof v&&(v=a.byteLength-p);if(p>=a.byteLength)throw new RangeError("'offset' is out of bounds");if(v>a.byteLength-p)throw new RangeError("'length' is out of bounds");return new g(a.slice(p, + p+v))}if(g.isBuffer(a))return p=new g(a.length),a.copy(p,0,0,a.length),p;if(a){if(Array.isArray(a)||"undefined"!==typeof ArrayBuffer&&a.buffer instanceof ArrayBuffer||"length"in a)return new g(a);if("Buffer"===a.type&&Array.isArray(a.data))return new g(a.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.");};C.allocUnsafeSlow=function(a){if("function"===typeof g.allocUnsafeSlow)return g.allocUnsafeSlow(a);if("number"!==typeof a)throw new TypeError("size must be a number"); + if(a>=l)throw new RangeError("size is too large");return new b(a)}}).call(this,"undefined"!==typeof global?global:"undefined"!==typeof self?self:"undefined"!==typeof window?window:{})},{buffer:77}],77:[function(x,W,C){(function(n){function m(){try{var u=new Uint8Array(1);u.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}};return 42===u.foo()&&"function"===typeof u.subarray&&0===u.subarray(1,1).byteLength}catch(d){return!1}}function g(u,d){if((b.TYPED_ARRAY_SUPPORT?2147483647:1073741823)< + d)throw new RangeError("Invalid typed array length");b.TYPED_ARRAY_SUPPORT?(u=new Uint8Array(d),u.__proto__=b.prototype):(null===u&&(u=new b(d)),u.length=d);return u}function b(u,d,A){if(!(b.TYPED_ARRAY_SUPPORT||this instanceof b))return new b(u,d,A);if("number"===typeof u){if("string"===typeof d)throw Error("If encoding is specified then the first argument must be a string");return c(this,u)}return l(this,u,d,A)}function l(u,d,A,h){if("number"===typeof d)throw new TypeError('"value" argument must not be a number'); + if("undefined"!==typeof ArrayBuffer&&d instanceof ArrayBuffer){d.byteLength;if(0>A||d.byteLengthu)throw new RangeError('"size" argument must not be negative');}function c(u,d){a(d);u=g(u,0>d?0:v(d)|0);if(!b.TYPED_ARRAY_SUPPORT)for(var A=0;Ad.length?0:v(d.length)|0;u=g(u,A);for(var h=0;h=(b.TYPED_ARRAY_SUPPORT?2147483647:1073741823))throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+ + (b.TYPED_ARRAY_SUPPORT?2147483647:1073741823).toString(16)+" bytes");return u|0}function r(u,d){if(b.isBuffer(u))return u.length;if("undefined"!==typeof ArrayBuffer&&"function"===typeof ArrayBuffer.isView&&(ArrayBuffer.isView(u)||u instanceof ArrayBuffer))return u.byteLength;"string"!==typeof u&&(u=""+u);var A=u.length;if(0===A)return 0;for(var h=!1;;)switch(d){case "ascii":case "latin1":case "binary":return A;case "utf8":case "utf-8":case void 0:return J(u).length;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return 2* + A;case "hex":return A>>>1;case "base64":return R.toByteArray(k(u)).length;default:if(h)return J(u).length;d=(""+d).toLowerCase();h=!0}}function E(u,d,A){var h=!1;if(void 0===d||0>d)d=0;if(d>this.length)return"";if(void 0===A||A>this.length)A=this.length;if(0>=A)return"";A>>>=0;d>>>=0;if(A<=d)return"";for(u||(u="utf8");;)switch(u){case "hex":u=d;d=A;A=this.length;if(!u||0>u)u=0;if(!d||0>d||d>A)d=A;h="";for(A=u;Ah?"0"+h.toString(16):h.toString(16),h=u+h;return h;case "utf8":case "utf-8":return z(this, + d,A);case "ascii":u="";for(A=Math.min(this.length,A);dA&&(A=-2147483648);A=+A;isNaN(A)&&(A=w?0:u.length-1);0>A&&(A=u.length+A);if(A>=u.length){if(w)return-1;A=u.length-1}else if(0>A)if(w)A=0;else return-1;"string"===typeof d&&(d=b.from(d,h));if(b.isBuffer(d))return 0===d.length?-1:O(u,d,A,h,w);if("number"===typeof d)return d&=255,b.TYPED_ARRAY_SUPPORT&&"function"=== + typeof Uint8Array.prototype.indexOf?w?Uint8Array.prototype.indexOf.call(u,d,A):Uint8Array.prototype.lastIndexOf.call(u,d,A):O(u,[d],A,h,w);throw new TypeError("val must be string, number or Buffer");}function O(u,d,A,h,w){function P(L,V){return 1===e?L[V]:L.readUInt16BE(V*e)}var e=1,y=u.length,D=d.length;if(void 0!==h&&(h=String(h).toLowerCase(),"ucs2"===h||"ucs-2"===h||"utf16le"===h||"utf-16le"===h)){if(2>u.length||2>d.length)return-1;e=2;y/=2;D/=2;A/=2}if(w)for(h=-1;Ay&&(A=y-D);0<=A;A--){y=!0;for(h=0;hw&&(P=w);break;case 2:var y=u[d+1];128===(y&192)&&(w=(w&31)<<6|y&63,127w||57343w&&(P=w))}null===P?(P=65533,e=1):65535>>10&1023|55296),P=56320|P&1023);h.push(P);d+=e}u=h.length;if(u<=H)h=String.fromCharCode.apply(String,h);else{A="";for(d=0;du)throw new RangeError("offset is not uint"); + if(u+d>A)throw new RangeError("Trying to access beyond buffer length");}function f(u,d,A,h,w,P){if(!b.isBuffer(u))throw new TypeError('"buffer" argument must be a Buffer instance');if(d>w||du.length)throw new RangeError("Index out of range");}function N(u,d,A,h){0>d&&(d=65535+d+1);for(var w=0,P=Math.min(u.length-A,2);w>>8*(h?w:1-w)}function T(u,d,A,h){0>d&&(d=4294967295+d+1);for(var w=0,P=Math.min(u.length- + A,4);w>>8*(h?w:3-w)&255}function q(u,d,A,h,w,P){if(A+h>u.length)throw new RangeError("Index out of range");if(0>A)throw new RangeError("Index out of range");}function F(u,d,A,h,w){w||q(u,d,A,4,3.4028234663852886E38,-3.4028234663852886E38);Q.write(u,d,A,h,23,4);return A+4}function G(u,d,A,h,w){w||q(u,d,A,8,1.7976931348623157E308,-1.7976931348623157E308);Q.write(u,d,A,h,52,8);return A+8}function k(u){u=u.trim?u.trim():u.replace(/^\s+|\s+$/g,"");u=u.replace(X,"");if(2>u.length)return""; + for(;0!==u.length%4;)u+="=";return u}function J(u,d){d=d||Infinity;for(var A,h=u.length,w=null,P=[],e=0;eA){if(!w){if(56319A){-1<(d-=3)&&P.push(239,191,189);w=A;continue}A=(w-55296<<10|A-56320)+65536}else w&&-1<(d-=3)&&P.push(239,191,189);w=null;if(128>A){if(0>--d)break;P.push(A)}else if(2048>A){if(0>(d-=2))break;P.push(A>>6|192,A&63| + 128)}else if(65536>A){if(0>(d-=3))break;P.push(A>>12|224,A>>6&63|128,A&63|128)}else if(1114112>A){if(0>(d-=4))break;P.push(A>>18|240,A>>12&63|128,A>>6&63|128,A&63|128)}else throw Error("Invalid code point");}return P}function I(u){for(var d=[],A=0;A=d.length||w>=u.length);++w)d[w+A]=u[w];return w}var R=x("base64-js"),Q=x("ieee754"),B=x("isarray");C.Buffer=b;C.SlowBuffer=function(u){+u!=u&&(u=0);return b.alloc(+u)}; + C.INSPECT_MAX_BYTES=50;b.TYPED_ARRAY_SUPPORT=void 0!==n.TYPED_ARRAY_SUPPORT?n.TYPED_ARRAY_SUPPORT:m();C.kMaxLength=b.TYPED_ARRAY_SUPPORT?2147483647:1073741823;b.poolSize=8192;b._augment=function(u){u.__proto__=b.prototype;return u};b.from=function(u,d,A){return l(null,u,d,A)};b.TYPED_ARRAY_SUPPORT&&(b.prototype.__proto__=Uint8Array.prototype,b.__proto__=Uint8Array,"undefined"!==typeof Symbol&&Symbol.species&&b[Symbol.species]===b&&Object.defineProperty(b,Symbol.species,{value:null,configurable:!0})); + b.alloc=function(u,d,A){a(u);u=0>=u?g(null,u):void 0!==d?"string"===typeof A?g(null,u).fill(d,A):g(null,u).fill(d):g(null,u);return u};b.allocUnsafe=function(u){return c(null,u)};b.allocUnsafeSlow=function(u){return c(null,u)};b.isBuffer=function(u){return!(null==u||!u._isBuffer)};b.compare=function(u,d){if(!b.isBuffer(u)||!b.isBuffer(d))throw new TypeError("Arguments must be Buffers");if(u===d)return 0;for(var A=u.length,h=d.length,w=0,P=Math.min(A,h);wd&&(u+=" ... "));return""};b.prototype.compare=function(u,d,A,h,w){if(!b.isBuffer(u))throw new TypeError("Argument must be a Buffer");void 0===d&&(d=0);void 0===A&&(A=u?u.length:0);void 0===h&&(h=0);void 0===w&&(w=this.length);if(0>d||A>u.length||0>h||w>this.length)throw new RangeError("out of range index");if(h>=w&&d>=A)return 0;if(h>=w)return-1; + if(d>=A)return 1;d>>>=0;A>>>=0;h>>>=0;w>>>=0;if(this===u)return 0;var P=w-h,e=A-d,y=Math.min(P,e);h=this.slice(h,w);u=u.slice(d,A);for(d=0;dw)A=w;if(0A||0>d)||d>this.length)throw new RangeError("Attempt to write outside buffer bounds");h||(h="utf8");for(w=!1;;)switch(h){case "hex":a:{d=Number(d)||0;h=this.length-d;A?(A=Number(A),A>h&&(A=h)):A=h;h=u.length;if(0!==h%2)throw new TypeError("Invalid hex string"); + A>h/2&&(A=h/2);for(h=0;h(w-=2));++e){var y=h.charCodeAt(e);u=y>>8;y%=256;P.push(y);P.push(u)}return S(P, + this,d,A);default:if(w)throw new TypeError("Unknown encoding: "+h);h=(""+h).toLowerCase();w=!0}};b.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var H=4096;b.prototype.slice=function(u,d){var A=this.length;u=~~u;d=void 0===d?A:~~d;0>u?(u+=A,0>u&&(u=0)):u>A&&(u=A);0>d?(d+=A,0>d&&(d=0)):d>A&&(d=A);d=128*h&&(A-=Math.pow(2,8*d));return A};b.prototype.readIntBE=function(u,d,A){u|=0;d|=0;A||M(u, + d,this.length);A=d;for(var h=1,w=this[u+--A];0=128*h&&(w-=Math.pow(2,8*d));return w};b.prototype.readInt8=function(u,d){d||M(u,1,this.length);return this[u]&128?-1*(255-this[u]+1):this[u]};b.prototype.readInt16LE=function(u,d){d||M(u,2,this.length);u=this[u]|this[u+1]<<8;return u&32768?u|4294901760:u};b.prototype.readInt16BE=function(u,d){d||M(u,2,this.length);u=this[u+1]|this[u]<<8;return u&32768?u|4294901760:u};b.prototype.readInt32LE=function(u,d){d||M(u,4,this.length); + return this[u]|this[u+1]<<8|this[u+2]<<16|this[u+3]<<24};b.prototype.readInt32BE=function(u,d){d||M(u,4,this.length);return this[u]<<24|this[u+1]<<16|this[u+2]<<8|this[u+3]};b.prototype.readFloatLE=function(u,d){d||M(u,4,this.length);return Q.read(this,u,!0,23,4)};b.prototype.readFloatBE=function(u,d){d||M(u,4,this.length);return Q.read(this,u,!1,23,4)};b.prototype.readDoubleLE=function(u,d){d||M(u,8,this.length);return Q.read(this,u,!0,52,8)};b.prototype.readDoubleBE=function(u,d){d||M(u,8,this.length); + return Q.read(this,u,!1,52,8)};b.prototype.writeUIntLE=function(u,d,A,h){u=+u;d|=0;A|=0;h||f(this,u,d,A,Math.pow(2,8*A)-1,0);h=1;var w=0;for(this[d]=u&255;++w>>8):N(this,u,d,!0);return d+2};b.prototype.writeUInt16BE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>8,this[d+1]=u&255):N(this,u,d,!1);return d+2};b.prototype.writeUInt32LE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[d+3]=u>>>24,this[d+2]=u>>>16,this[d+1]=u>>>8,this[d]=u&255): + T(this,u,d,!0);return d+4};b.prototype.writeUInt32BE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>24,this[d+1]=u>>>16,this[d+2]=u>>>8,this[d+3]=u&255):T(this,u,d,!1);return d+4};b.prototype.writeIntLE=function(u,d,A,h){u=+u;d|=0;h||(h=Math.pow(2,8*A-1),f(this,u,d,A,h-1,-h));h=0;var w=1,P=0;for(this[d]=u&255;++hu&&0===P&&0!==this[d+h-1]&&(P=1),this[d+h]=(u/w>>0)-P&255;return d+A};b.prototype.writeIntBE=function(u,d,A,h){u=+u;d|=0;h||(h= + Math.pow(2,8*A-1),f(this,u,d,A,h-1,-h));h=A-1;var w=1,P=0;for(this[d+h]=u&255;0<=--h&&(w*=256);)0>u&&0===P&&0!==this[d+h+1]&&(P=1),this[d+h]=(u/w>>0)-P&255;return d+A};b.prototype.writeInt8=function(u,d,A){u=+u;d|=0;A||f(this,u,d,1,127,-128);b.TYPED_ARRAY_SUPPORT||(u=Math.floor(u));0>u&&(u=255+u+1);this[d]=u&255;return d+1};b.prototype.writeInt16LE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[d]=u&255,this[d+1]=u>>>8):N(this,u,d,!0);return d+2};b.prototype.writeInt16BE= + function(u,d,A){u=+u;d|=0;A||f(this,u,d,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>8,this[d+1]=u&255):N(this,u,d,!1);return d+2};b.prototype.writeInt32LE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,2147483647,-2147483648);b.TYPED_ARRAY_SUPPORT?(this[d]=u&255,this[d+1]=u>>>8,this[d+2]=u>>>16,this[d+3]=u>>>24):T(this,u,d,!0);return d+4};b.prototype.writeInt32BE=function(u,d,A){u=+u;d|=0;A||f(this,u,d,4,2147483647,-2147483648);0>u&&(u=4294967295+u+1);b.TYPED_ARRAY_SUPPORT?(this[d]=u>>>24,this[d+ + 1]=u>>>16,this[d+2]=u>>>8,this[d+3]=u&255):T(this,u,d,!1);return d+4};b.prototype.writeFloatLE=function(u,d,A){return F(this,u,d,!0,A)};b.prototype.writeFloatBE=function(u,d,A){return F(this,u,d,!1,A)};b.prototype.writeDoubleLE=function(u,d,A){return G(this,u,d,!0,A)};b.prototype.writeDoubleBE=function(u,d,A){return G(this,u,d,!1,A)};b.prototype.copy=function(u,d,A,h){A||(A=0);h||0===h||(h=this.length);d>=u.length&&(d=u.length);d||(d=0);0d)throw new RangeError("targetStart out of bounds");if(0>A||A>=this.length)throw new RangeError("sourceStart out of bounds");if(0>h)throw new RangeError("sourceEnd out of bounds");h>this.length&&(h=this.length);u.length-dw||!b.TYPED_ARRAY_SUPPORT)for(h=0;hw&&(u=w)}if(void 0!==h&&"string"!==typeof h)throw new TypeError("encoding must be a string");if("string"===typeof h&&!b.isEncoding(h))throw new TypeError("Unknown encoding: "+h);}else"number"===typeof u&&(u&=255);if(0>d||this.length>>=0;A=void 0===A?this.length:A>>>0;u||(u=0);if("number"=== + typeof u)for(h=d;hb||isNaN(b))throw TypeError("n must be a positive number");this._maxListeners=b;return this};n.prototype.emit=function(b){var l;this._events||(this._events={});if("error"===b&&(!this._events.error||g(this._events.error)&&!this._events.error.length)){var a= + arguments[1];if(a instanceof Error)throw a;var c=Error('Uncaught, unspecified "error" event. ('+a+")");c.context=a;throw c;}c=this._events[b];if(void 0===c)return!1;if(m(c))switch(arguments.length){case 1:c.call(this);break;case 2:c.call(this,arguments[1]);break;case 3:c.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),c.apply(this,a)}else if(g(c)){a=Array.prototype.slice.call(arguments,1);var t=c.slice();c=t.length;for(l=0;ll&&(this._events[b].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", + this._events[b].length),"function"===typeof console.trace&&console.trace());return this};n.prototype.on=n.prototype.addListener;n.prototype.once=function(b,l){function a(){this.removeListener(b,a);c||(c=!0,l.apply(this,arguments))}if(!m(l))throw TypeError("listener must be a function");var c=!1;a.listener=l;this.on(b,a);return this};n.prototype.removeListener=function(b,l){if(!m(l))throw TypeError("listener must be a function");if(!this._events||!this._events[b])return this;var a=this._events[b]; + var c=a.length;var t=-1;if(a===l||m(a.listener)&&a.listener===l)delete this._events[b],this._events.removeListener&&this.emit("removeListener",b,l);else if(g(a)){for(;0t)return this;1===a.length?(a.length=0,delete this._events[b]):a.splice(t,1);this._events.removeListener&&this.emit("removeListener",b,l)}return this};n.prototype.removeAllListeners=function(b){if(!this._events)return this;if(!this._events.removeListener)return 0=== + arguments.length?this._events={}:this._events[b]&&delete this._events[b],this;if(0===arguments.length){for(l in this._events)"removeListener"!==l&&this.removeAllListeners(l);this.removeAllListeners("removeListener");this._events={};return this}var l=this._events[b];if(m(l))this.removeListener(b,l);else if(l)for(;l.length;)this.removeListener(b,l[l.length-1]);delete this._events[b];return this};n.prototype.listeners=function(b){return this._events&&this._events[b]?m(this._events[b])?[this._events[b]]: + this._events[b].slice():[]};n.prototype.listenerCount=function(b){if(this._events){b=this._events[b];if(m(b))return 1;if(b)return b.length}return 0};n.listenerCount=function(b,l){return b.listenerCount(l)}},{}],80:[function(x,W,C){C.read=function(n,m,g,b,l){var a=8*l-b-1;var c=(1<>1,p=-7;l=g?l-1:0;var v=g?-1:1,r=n[m+l];l+=v;g=r&(1<<-p)-1;r>>=-p;for(p+=a;0>=-p;for(p+=b;0>1,r=23===l?Math.pow(2,-24)-Math.pow(2,-77):0;a=b?0:a-1;var E=b?1:-1,K=0>m||0===m&&0>1/m?1:0;m=Math.abs(m);isNaN(m)||Infinity===m?(m=isNaN(m)?1:0,b=p):(b=Math.floor(Math.log(m)/Math.LN2),1>m*(c=Math.pow(2,-b))&&(b--,c*=2),m=1<=b+v?m+r/c:m+r*Math.pow(2,1-v),2<=m*c&&(b++,c/=2),b+v>=p?(m=0,b=p):1<=b+v?(m=(m*c-1)*Math.pow(2,l),b+=v):(m=m*Math.pow(2,v-1)*Math.pow(2,l),b=0));for(;8<= + l;n[g+a]=m&255,a+=E,m/=256,l-=8);b=b<>2,g=(g&3)<<4|b>>4,c=(b&15)<<2|l>>6,t=l&63,isNaN(b)?c=t=64:isNaN(l)&& + (t=64),m=m+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(a)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(g)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(t);return m};C.decode=function(n,m){m="";var g=0;for(n=n.replace(/[^A-Za-z0-9\+\/=]/g,"");g>4;l=(l&15)<<4|a>>2;var t=(a&3)<<6|c;m+=String.fromCharCode(b);64!=a&&(m+=String.fromCharCode(l));64!=c&&(m+=String.fromCharCode(t))}return m}},{}],85:[function(x,W,C){function n(){this.crc32=this.uncompressedSize= + this.compressedSize=0;this.compressedContent=this.compressionMethod=null}n.prototype={getContent:function(){return null},getCompressedContent:function(){return null}};W.exports=n},{}],86:[function(x,W,C){C.STORE={magic:"\x00\x00",compress:function(n,m){return n},uncompress:function(n){return n},compressInputType:null,uncompressInputType:null};C.DEFLATE=x("./flate")},{"./flate":91}],87:[function(x,W,C){var n=x("./utils"),m=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035, + 249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705, + 3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311, + 2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245, + 2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498, + 2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552, + 615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];W.exports=function(g,b){if("undefined"===typeof g||!g.length)return 0;var l="string"!==n.getTypeOf(g);"undefined"==typeof b&&(b=0);b^=-1;for(var a=0,c=g.length;a>>8^t}return b^-1}},{"./utils":104}],88:[function(x,W,C){function n(g){this.data=null;this.index=this.length=0}var m=x("./utils");n.prototype= + {checkOffset:function(g){this.checkIndex(this.index+g)},checkIndex:function(g){if(this.lengthg)throw Error("End of data reached (data length = "+this.length+", asked index = "+g+"). Corrupted zip ?");},setIndex:function(g){this.checkIndex(g);this.index=g},skip:function(g){this.setIndex(this.index+g)},byteAt:function(g){},readInt:function(g){var b=0,l;this.checkOffset(g);for(l=this.index+g-1;l>=this.index;l--)b=(b<<8)+this.byteAt(l);this.index+=g;return b},readString:function(g){return m.transformTo("string", + this.readData(g))},readData:function(g){},lastIndexOfSignature:function(g){},readDate:function(){var g=this.readInt(4);return new Date((g>>25&127)+1980,(g>>21&15)-1,g>>16&31,g>>11&31,g>>5&63,(g&31)<<1)}};W.exports=n},{"./utils":104}],89:[function(x,W,C){C.base64=!1;C.binary=!1;C.dir=!1;C.createFolders=!1;C.date=null;C.compression=null;C.compressionOptions=null;C.comment=null;C.unixPermissions=null;C.dosPermissions=null},{}],90:[function(x,W,C){var n=x("./utils");C.string2binary=function(m){return n.string2binary(m)}; + C.string2Uint8Array=function(m){return n.transformTo("uint8array",m)};C.uint8Array2String=function(m){return n.transformTo("string",m)};C.string2Blob=function(m){m=n.transformTo("arraybuffer",m);return n.arrayBuffer2Blob(m)};C.arrayBuffer2Blob=function(m){return n.arrayBuffer2Blob(m)};C.transformTo=function(m,g){return n.transformTo(m,g)};C.getTypeOf=function(m){return n.getTypeOf(m)};C.checkSupport=function(m){return n.checkSupport(m)};C.MAX_VALUE_16BITS=n.MAX_VALUE_16BITS;C.MAX_VALUE_32BITS=n.MAX_VALUE_32BITS; + C.pretty=function(m){return n.pretty(m)};C.findCompression=function(m){return n.findCompression(m)};C.isRegExp=function(m){return n.isRegExp(m)}},{"./utils":104}],91:[function(x,W,C){W="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;var n=x("pako");C.uncompressInputType=W?"uint8array":"array";C.compressInputType=W?"uint8array":"array";C.magic="\b\x00";C.compress=function(m,g){return n.deflateRaw(m,{level:g.level||-1})};C.uncompress=function(m){return n.inflateRaw(m)}}, + {pako:120}],92:[function(x,W,C){function n(g,b){if(!(this instanceof n))return new n(g,b);this.files={};this.comment=null;this.root="";g&&this.load(g,b);this.clone=function(){var l=new n,a;for(a in this)"function"!==typeof this[a]&&(l[a]=this[a]);return l}}var m=x("./base64");n.prototype=x("./object");n.prototype.load=x("./load");n.support=x("./support");n.defaults=x("./defaults");n.utils=x("./deprecatedPublicUtils");n.base64={encode:function(g){return m.encode(g)},decode:function(g){return m.decode(g)}}; + n.compressions=x("./compressions");W.exports=n},{"./base64":84,"./compressions":86,"./defaults":89,"./deprecatedPublicUtils":90,"./load":93,"./object":96,"./support":100}],93:[function(x,W,C){var n=x("./base64"),m=x("./zipEntries");W.exports=function(g,b){var l;b=b||{};b.base64&&(g=n.decode(g));var a=new m(g,b);g=a.files;for(l=0;l>>=8;return J},f=function(){var G={},k,J;for(k=0;kx;x++)b[x]=252<=x?6:248<=x?5:240<=x?4:224<=x?3:192<=x?2:1;b[254]=b[254]=1;var l=function(a){var c,t,p=a.length,v=Array(2*p);for(c=t=0;cr)v[t++]= + r;else{var E=b[r];if(4r?v[t++]=r:(r-=65536,v[t++]=55296|r>>10&1023,v[t++]=56320|r&1023)}}}v.length!==t&&(v.subarray?v=v.subarray(0,t):v.length=t);return n.applyFromCharCode(v)};C.utf8encode=function(a){if(m.nodebuffer)return g(a,"utf-8");var c,t,p=a.length,v=0;for(c=0;cr?1:2048>r?2:65536>r?3:4}var K=m.uint8array?new Uint8Array(v):Array(v);for(c=t=0;tr?K[t++]=r:(2048>r?K[t++]=192|r>>>6:(65536>r?K[t++]=224|r>>>12:(K[t++]=240|r>>>18,K[t++]=128|r>>>12&63),K[t++]=128|r>>>6&63),K[t++]=128|r&63);return K};C.utf8decode=function(a){if(m.nodebuffer)return n.transformTo("nodebuffer",a).toString("utf-8");a=n.transformTo(m.uint8array? + "uint8array":"array",a);for(var c=[],t=0,p=a.length;ta.length&&(r=a.length);for(v=r-1;0<=v&&128===(a[v]&192);)v--;v=0>v?r:0===v?r:v+b[a[v]]>r?v:r;m.uint8array?c.push(l(a.subarray(t,v))):c.push(l(a.slice(t,v)));t=v}return c.join("")}},{"./nodeBuffer":94,"./support":100,"./utils":104}],104:[function(x,W,C){function n(p){return p}function m(p,v){for(var r=0;rE?"0":"")+E.toString(16).toUpperCase()}return v};C.findCompression=function(p){for(var v in a)if(a.hasOwnProperty(v)&&a[v].magic===p)return a[v];return null};C.isRegExp=function(p){return"[object RegExp]"===Object.prototype.toString.call(p)}},{"./compressions":86,"./nodeBuffer":94,"./support":100}],105:[function(x,W, + C){function n(v,r){this.files=[];this.loadOptions=r;v&&this.load(v)}var m=x("./stringReader"),g=x("./nodeBufferReader"),b=x("./uint8ArrayReader"),l=x("./utils"),a=x("./signature"),c=x("./zipEntry"),t=x("./support"),p=x("./object");n.prototype={checkSignature:function(v){var r=this.reader.readString(4);if(r!==v)throw Error("Corrupted zip or bug : unexpected signature ("+l.pretty(r)+", expected "+l.pretty(v)+")");},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2);this.diskWithCentralDirStart= + this.reader.readInt(2);this.centralDirRecordsOnThisDisk=this.reader.readInt(2);this.centralDirRecords=this.reader.readInt(2);this.centralDirSize=this.reader.readInt(4);this.centralDirOffset=this.reader.readInt(4);this.zipCommentLength=this.reader.readInt(2);this.zipComment=this.reader.readString(this.zipCommentLength);this.zipComment=p.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8);this.versionMadeBy=this.reader.readString(2);this.versionNeeded= + this.reader.readInt(2);this.diskNumber=this.reader.readInt(4);this.diskWithCentralDirStart=this.reader.readInt(4);this.centralDirRecordsOnThisDisk=this.reader.readInt(8);this.centralDirRecords=this.reader.readInt(8);this.centralDirSize=this.reader.readInt(8);this.centralDirOffset=this.reader.readInt(8);this.zip64ExtensibleData={};for(var v=this.zip64EndOfCentralSize-44,r,E,K;0>8;this.dir=this.externalFileAttributes&16?!0:!1;0===a&&(this.dosPermissions=this.externalFileAttributes& + 63);3===a&&(this.unixPermissions=this.externalFileAttributes>>16&65535);this.dir||"/"!==this.fileName.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){this.extraFields[1]&&(a=new m(this.extraFields[1].value),this.uncompressedSize===g.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===g.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===g.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===g.MAX_VALUE_32BITS&& + (this.diskNumberStart=a.readInt(4)))},readExtraFields:function(a){var c=a.index;for(this.extraFields=this.extraFields||{};a.indexm.length)throw Error("Failure must have errors");return new n({status:"failure",remaining:g,errors:m})},error:function(m,g){if(1>m.length)throw Error("Failure must have errors");return new n({status:"error",remaining:g,errors:m})},success:function(m,g,b){return new n({status:"success",value:m,source:b,remaining:g,errors:[]})},cut:function(m){return new n({status:"cut",remaining:m,errors:[]})}}; + var n=function(m){this._value=m.value;this._status=m.status;this._hasValue=void 0!==m.value;this._remaining=m.remaining;this._source=m.source;this._errors=m.errors};n.prototype.map=function(m){return this._hasValue?new n({value:m(this._value,this._source),status:this._status,remaining:this._remaining,source:this._source,errors:this._errors}):this};n.prototype.changeRemaining=function(m){return new n({value:this._value,status:this._status,remaining:m,source:this._source,errors:this._errors})};n.prototype.isSuccess= + function(){return"success"===this._status||"cut"===this._status};n.prototype.isFailure=function(){return"failure"===this._status};n.prototype.isError=function(){return"error"===this._status};n.prototype.isCut=function(){return"cut"===this._status};n.prototype.value=function(){return this._value};n.prototype.remaining=function(){return this._remaining};n.prototype.source=function(){return this._source};n.prototype.errors=function(){return this._errors}},{}],116:[function(x,W,C){var n=x("./Token"), + m=x("./StringSource");C.RegexTokeniser=function(g){g=g.map(function(b){return{name:b.name,regex:new RegExp(b.regex.source,"g")}});return{tokenise:function(b,l){l=new m(b,l);var a=0;for(var c=[];ap)){t=new n(g[r].name,E[1],v.range(p,a));break a}}a=p+1;t=new n("unrecognisedCharacter",t.substring(p,a),v.range(p,a))}c.push(t)}c.push(new n("end",null,l.range(b.length, + b.length)));return c}}}},{"./StringSource":108,"./Token":109}],117:[function(x,W,C){function n(E){return l.success(null,E)}function m(E,K){var U=E.head();K=U?a.error({expected:K,actual:r(U),location:U.source}):a.error({expected:K,actual:"end of tokens"});return l.failure([K],E)}var g=x("underscore"),b=x("option"),l=x("./parsing-results"),a=x("./errors"),c=x("./lazy-iterators");C.token=function(E,K){var U=void 0!==K;return function(O){var z=O.head();return!z||z.name!==E||U&&z.value!==K?(z=r({name:E, + value:K}),m(O,z)):l.success(z.value,O.tail(),z.source)}};C.tokenOfType=function(E){return C.token(E)};C.firstOf=function(E,K){g.isArray(K)||(K=Array.prototype.slice.call(arguments,1));return function(U){return c.fromArray(K).map(function(O){return O(U)}).filter(function(O){return O.isSuccess()||O.isError()}).first()||m(U,E)}};C.then=function(E,K){return function(U){U=E(U);U.map||console.log(U);return U.map(K)}};C.sequence=function(){function E(O){return O.isCaptured}var K=Array.prototype.slice.call(arguments, + 0),U=function(O){var z=g.foldl(K,function(f,N){var T=f.result;f=f.hasCut;if(!T.isSuccess())return{result:T,hasCut:f};var q=N(T.remaining());return q.isCut()?{result:T,hasCut:!0}:q.isSuccess()?(N=N.isCaptured?T.value().withValue(N,q.value()):T.value(),T=q.remaining(),q=O.to(T),{result:l.success(N,T,q),hasCut:f}):f?{result:l.error(q.errors(),q.remaining()),hasCut:f}:{result:q,hasCut:f}},{result:l.success(new t,O),hasCut:!1}).result,M=O.to(z.remaining());return z.map(function(f){return f.withValue(C.sequence.source, + M)})};U.head=function(){var O=g.find(K,E);return C.then(U,C.sequence.extract(O))};U.map=function(O){return C.then(U,function(z){return O.apply(this,z.toArray())})};return U};var t=function(E,K){this._values=E||{};this._valuesArray=K||[]};t.prototype.withValue=function(E,K){if(E.captureName&&E.captureName in this._values)throw Error('Cannot add second value for capture "'+E.captureName+'"');var U=g.clone(this._values);U[E.captureName]=K;E=this._valuesArray.concat([K]);return new t(U,E)};t.prototype.get= + function(E){if(E.captureName in this._values)return this._values[E.captureName];throw Error('No value for capture "'+E.captureName+'"');};t.prototype.toArray=function(){return this._valuesArray};C.sequence.capture=function(E,K){var U=function(){return E.apply(this,arguments)};U.captureName=K;U.isCaptured=!0;return U};C.sequence.extract=function(E){return function(K){return K.get(E)}};C.sequence.applyValues=function(E){var K=Array.prototype.slice.call(arguments,1);return function(U){var O=K.map(function(z){return U.get(z)}); + return E.apply(this,O)}};C.sequence.source={captureName:"\u2603source\u2603"};C.sequence.cut=function(){return function(E){return l.cut(E)}};C.optional=function(E){return function(K){var U=E(K);return U.isSuccess()?U.map(b.some):U.isFailure()?l.success(b.none,K):U}};C.zeroOrMoreWithSeparator=function(E,K){return v(E,K,!1)};C.oneOrMoreWithSeparator=function(E,K){return v(E,K,!0)};var p=C.zeroOrMore=function(E){return function(K){for(var U=[],O;(O=E(K))&&O.isSuccess();)K=O.remaining(),U.push(O.value()); + return O.isError()?O:l.success(U,K)}};C.oneOrMore=function(E){return C.oneOrMoreWithSeparator(E,n)};var v=function(E,K,U){return function(O){var z=E(O);return z.isSuccess()?(O=C.sequence.capture(E,"main"),O=p(C.then(C.sequence(K,O),C.sequence.extract(O)))(z.remaining()),l.success([z.value()].concat(O.value()),O.remaining())):U||z.isError()?z:l.success([],O)}};C.leftAssociative=function(E,K,U){K=U?[{func:U,rule:K}]:K;K=K.map(function(z){return C.then(z.rule,function(M){return function(f,N){return z.func(f, + M,N)}})});var O=C.firstOf.apply(null,["rules"].concat(K));return function(z){var M=E(z);if(!M.isSuccess())return M;for(var f=O(M.remaining());f.isSuccess();){var N=f.remaining(),T=z.to(f.remaining());f=f.value();M=l.success(f(M.value(),T),N,T);f=O(M.remaining())}return f.isError()?f:M}};C.leftAssociative.firstOf=function(){return Array.prototype.slice.call(arguments,0)};C.nonConsuming=function(E){return function(K){return E(K).changeRemaining(K)}};var r=function(E){return E.value?E.name+' "'+E.value+ + '"':E.name}},{"./errors":112,"./lazy-iterators":113,"./parsing-results":115,option:119,underscore:118}],118:[function(x,W,C){(function(){var n=this,m=n._,g={},b=Array.prototype,l=Object.prototype,a=b.push,c=b.slice,t=b.concat,p=l.toString,v=l.hasOwnProperty,r=b.forEach,E=b.map,K=b.reduce,U=b.reduceRight,O=b.filter,z=b.every,M=b.some,f=b.indexOf,N=b.lastIndexOf;l=Array.isArray;var T=Object.keys,q=Function.prototype.bind,F=function(h){if(h instanceof F)return h;if(!(this instanceof F))return new F(h); + this._wrapped=h};"undefined"!==typeof C?("undefined"!==typeof W&&W.exports&&(C=W.exports=F),C._=F):n._=F;F.VERSION="1.4.4";var G=F.each=F.forEach=function(h,w,P){if(null!=h)if(r&&h.forEach===r)h.forEach(w,P);else if(h.length===+h.length)for(var e=0,y=h.length;eh.length)return Math.max.apply(Math,h);if(!w&&F.isEmpty(h))return-Infinity; + var e={computed:-Infinity,value:-Infinity};G(h,function(y,D,L){D=w?w.call(P,y,D,L):y;D>=e.computed&&(e={value:y,computed:D})});return e.value};F.min=function(h,w,P){if(!w&&F.isArray(h)&&h[0]===+h[0]&&65535>h.length)return Math.min.apply(Math,h);if(!w&&F.isEmpty(h))return Infinity;var e={computed:Infinity,value:Infinity};G(h,function(y,D,L){D=w?w.call(P,y,D,L):y;DV||void 0===L)return 1;if(L>>1;P.call(e,h[L])P?Math.max(0,y+P):P;else return e=F.sortedIndex(h,w),h[e]===w?e:-1; + if(f&&h.indexOf===f)return h.indexOf(w,P);for(;e=arguments.length&&(w=h||0,h=0);P=arguments[2]||1;for(var e=Math.max(Math.ceil((w-h)/P),0),y=0,D=Array(e);y=Z?(clearTimeout(y),y=null,L=Y,D=h.apply(P,e)):y||(y=setTimeout(V,Z));return D}};F.debounce=function(h,w,P){var e,y;return function(){var D=this,L=arguments,V=P&&!e;clearTimeout(e); + e=setTimeout(function(){e=null;P||(y=h.apply(D,L))},w);V&&(y=h.apply(D,L));return y}};F.once=function(h){var w=!1,P;return function(){if(w)return P;w=!0;P=h.apply(this,arguments);h=null;return P}};F.wrap=function(h,w){return function(){var P=[h];a.apply(P,arguments);return w.apply(this,P)}};F.compose=function(){var h=arguments;return function(){for(var w=arguments,P=h.length-1;0<=P;P--)w=[h[P].apply(this,w)];return w[0]}};F.after=function(h,w){return 0>=h?w():function(){if(1>--h)return w.apply(this, + arguments)}};F.keys=T||function(h){if(h!==Object(h))throw new TypeError("Invalid object");var w=[],P;for(P in h)F.has(h,P)&&(w[w.length]=P);return w};F.values=function(h){var w=[],P;for(P in h)F.has(h,P)&&w.push(h[P]);return w};F.pairs=function(h){var w=[],P;for(P in h)F.has(h,P)&&w.push([P,h[P]]);return w};F.invert=function(h){var w={},P;for(P in h)F.has(h,P)&&(w[h[P]]=P);return w};F.functions=F.methods=function(h){var w=[],P;for(P in h)F.isFunction(h[P])&&w.push(P);return w.sort()};F.extend=function(h){G(c.call(arguments, + 1),function(w){if(w)for(var P in w)h[P]=w[P]});return h};F.pick=function(h){var w={},P=t.apply(b,c.call(arguments,1));G(P,function(e){e in h&&(w[e]=h[e])});return w};F.omit=function(h){var w={},P=t.apply(b,c.call(arguments,1)),e;for(e in h)F.contains(P,e)||(w[e]=h[e]);return w};F.defaults=function(h){G(c.call(arguments,1),function(w){if(w)for(var P in w)null==h[P]&&(h[P]=w[P])});return h};F.clone=function(h){return F.isObject(h)?F.isArray(h)?h.slice():F.extend({},h):h};F.tap=function(h,w){w(h);return h}; + var R=function(h,w,P,e){if(h===w)return 0!==h||1/h==1/w;if(null==h||null==w)return h===w;h instanceof F&&(h=h._wrapped);w instanceof F&&(w=w._wrapped);var y=p.call(h);if(y!=p.call(w))return!1;switch(y){case "[object String]":return h==String(w);case "[object Number]":return h!=+h?w!=+w:0==h?1/h==1/w:h==+w;case "[object Date]":case "[object Boolean]":return+h==+w;case "[object RegExp]":return h.source==w.source&&h.global==w.global&&h.multiline==w.multiline&&h.ignoreCase==w.ignoreCase}if("object"!= + typeof h||"object"!=typeof w)return!1;for(var D=P.length;D--;)if(P[D]==h)return e[D]==w;P.push(h);e.push(w);D=0;var L=!0;if("[object Array]"==y){if(D=h.length,L=D==w.length)for(;D--&&(L=R(h[D],w[D],P,e)););}else{y=h.constructor;var V=w.constructor;if(y!==V&&!(F.isFunction(y)&&y instanceof y&&F.isFunction(V)&&V instanceof V))return!1;for(var Y in h)if(F.has(h,Y)&&(D++,!(L=F.has(w,Y)&&R(h[Y],w[Y],P,e))))break;if(L){for(Y in w)if(F.has(w,Y)&&!D--)break;L=!D}}P.pop();e.pop();return L};F.isEqual=function(h, + w){return R(h,w,[],[])};F.isEmpty=function(h){if(null==h)return!0;if(F.isArray(h)||F.isString(h))return 0===h.length;for(var w in h)if(F.has(h,w))return!1;return!0};F.isElement=function(h){return!(!h||1!==h.nodeType)};F.isArray=l||function(h){return"[object Array]"==p.call(h)};F.isObject=function(h){return h===Object(h)};G("Arguments Function String Number Date RegExp".split(" "),function(h){F["is"+h]=function(w){return p.call(w)=="[object "+h+"]"}});F.isArguments(arguments)||(F.isArguments=function(h){return!(!h|| + !F.has(h,"callee"))});"function"!==typeof/./&&(F.isFunction=function(h){return"function"===typeof h});F.isFinite=function(h){return isFinite(h)&&!isNaN(parseFloat(h))};F.isNaN=function(h){return F.isNumber(h)&&h!=+h};F.isBoolean=function(h){return!0===h||!1===h||"[object Boolean]"==p.call(h)};F.isNull=function(h){return null===h};F.isUndefined=function(h){return void 0===h};F.has=function(h,w){return v.call(h,w)};F.noConflict=function(){n._=m;return this};F.identity=function(h){return h};F.times= + function(h,w,P){for(var e=Array(h),y=0;y":">",'"':""","'":"'","/":"/"}};Q.unescape=F.invert(Q.escape);var B={escape:new RegExp("["+F.keys(Q.escape).join("")+"]","g"),unescape:new RegExp("("+F.keys(Q.unescape).join("|")+")","g")};F.each(["escape","unescape"],function(h){F[h]=function(w){return null==w?"":(""+w).replace(B[h], + function(P){return Q[h][P]})}});F.result=function(h,w){if(null==h)return null;w=h[w];return F.isFunction(w)?w.call(h):w};F.mixin=function(h){G(F.functions(h),function(w){var P=F[w]=h[w];F.prototype[w]=function(){var e=[this._wrapped];a.apply(e,arguments);return A.call(this,P.apply(F,e))}})};var H=0;F.uniqueId=function(h){var w=++H+"";return h?h+w:w};F.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var X=/(.)^/,u={"'":"'","\\":"\\","\r":"r","\n":"n", + "\t":"t","\u2028":"u2028","\u2029":"u2029"},d=/\\|'|\r|\n|\t|\u2028|\u2029/g;F.template=function(h,w,P){P=F.defaults({},P,F.templateSettings);var e=new RegExp([(P.escape||X).source,(P.interpolate||X).source,(P.evaluate||X).source].join("|")+"|$","g"),y=0,D="__p+='";h.replace(e,function(V,Y,Z,ca,fa){D+=h.slice(y,fa).replace(d,function(ha){return"\\"+u[ha]});Y&&(D+="'+\n((__t=("+Y+"))==null?'':_.escape(__t))+\n'");Z&&(D+="'+\n((__t=("+Z+"))==null?'':__t)+\n'");ca&&(D+="';\n"+ca+"\n__p+='");y=fa+V.length; + return V});D+="';\n";P.variable||(D="with(obj||{}){\n"+D+"}\n");D="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+D+"return __p;\n";try{var L=new Function(P.variable||"obj","_",D)}catch(V){throw V.source=D,V;}if(w)return L(w,F);w=function(V){return L.call(this,V,F)};w.source="function("+(P.variable||"obj")+"){\n"+D+"}";return w};F.chain=function(h){return F(h).chain()};var A=function(h){return this._chain?F(h).chain():h};F.mixin(F);G("pop push reverse shift sort splice unshift".split(" "), + function(h){var w=b[h];F.prototype[h]=function(){var P=this._wrapped;w.apply(P,arguments);"shift"!=h&&"splice"!=h||0!==P.length||delete P[0];return A.call(this,P)}});G(["concat","join","slice"],function(h){var w=b[h];F.prototype[h]=function(){return A.call(this,w.apply(this._wrapped,arguments))}});F.extend(F.prototype,{chain:function(){this._chain=!0;return this},value:function(){return this._wrapped}})}).call(this)},{}],119:[function(x,W,C){function n(g){return"function"==typeof g?g():g}C.none=Object.create({value:function(){throw Error("Called value on none"); + },isNone:function(){return!0},isSome:function(){return!1},map:function(){return C.none},flatMap:function(){return C.none},toArray:function(){return[]},orElse:n,valueOrElse:n});C.some=function(g){return new m(g)};var m=function(g){this._value=g};m.prototype.value=function(){return this._value};m.prototype.isNone=function(){return!1};m.prototype.isSome=function(){return!0};m.prototype.map=function(g){return new m(g(this._value))};m.prototype.flatMap=function(g){return g(this._value)};m.prototype.toArray= + function(){return[this._value]};m.prototype.orElse=function(g){return this};m.prototype.valueOrElse=function(g){return this._value};C.isOption=function(g){return g===C.none||g instanceof m};C.fromNullable=function(g){return null==g?C.none:new m(g)}},{}],120:[function(x,W,C){C=x("./lib/utils/common").assign;var n=x("./lib/deflate"),m=x("./lib/inflate");x=x("./lib/zlib/constants");var g={};C(g,n,m,x);W.exports=g},{"./lib/deflate":121,"./lib/inflate":122,"./lib/utils/common":123,"./lib/zlib/constants":126}], + 121:[function(x,W,C){function n(p){if(!(this instanceof n))return new n(p);p=this.options=b.assign({level:-1,method:8,chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:""},p||{});p.raw&&0p.windowBits&&(p.windowBits+=16);this.err=0;this.msg="";this.ended=!1;this.chunks=[];this.strm=new c;this.strm.avail_out=0;var v=g.deflateInit2(this.strm,p.level,p.method,p.windowBits,p.memLevel,p.strategy);if(0!==v)throw Error(a[v]);p.header&& + g.deflateSetHeader(this.strm,p.header);if(p.dictionary){p="string"===typeof p.dictionary?l.string2buf(p.dictionary):"[object ArrayBuffer]"===t.call(p.dictionary)?new Uint8Array(p.dictionary):p.dictionary;v=g.deflateSetDictionary(this.strm,p);if(0!==v)throw Error(a[v]);this._dict_set=!0}}function m(p,v){v=new n(v);v.push(p,!0);if(v.err)throw v.msg;return v.result}var g=x("./zlib/deflate"),b=x("./utils/common"),l=x("./utils/strings"),a=x("./zlib/messages"),c=x("./zlib/zstream"),t=Object.prototype.toString; + n.prototype.push=function(p,v){var r=this.strm,E=this.options.chunkSize;if(this.ended)return!1;v=v===~~v?v:!0===v?4:0;"string"===typeof p?r.input=l.string2buf(p):"[object ArrayBuffer]"===t.call(p)?r.input=new Uint8Array(p):r.input=p;r.next_in=0;r.avail_in=r.input.length;do{0===r.avail_out&&(r.output=new b.Buf8(E),r.next_out=0,r.avail_out=E);p=g.deflate(r,v);if(1!==p&&0!==p)return this.onEnd(p),this.ended=!0,!1;if(0===r.avail_out||0===r.avail_in&&(4===v||2===v))if("string"===this.options.to)this.onData(l.buf2binstring(b.shrinkBuf(r.output, + r.next_out)));else this.onData(b.shrinkBuf(r.output,r.next_out))}while((0E.windowBits&&(E.windowBits=-E.windowBits,0===E.windowBits&&(E.windowBits=-15));!(0<=E.windowBits&&16>E.windowBits)|| + r&&r.windowBits||(E.windowBits+=32);15E.windowBits&&0===(E.windowBits&15)&&(E.windowBits|=15);this.err=0;this.msg="";this.ended=!1;this.chunks=[];this.strm=new t;this.strm.avail_out=0;r=g.inflateInit2(this.strm,E.windowBits);if(r!==a.Z_OK)throw Error(c[r]);this.header=new p;g.inflateGetHeader(this.strm,this.header)}function m(r,E){E=new n(E);E.push(r,!0);if(E.err)throw E.msg;return E.result}var g=x("./zlib/inflate"),b=x("./utils/common"),l=x("./utils/strings"),a=x("./zlib/constants"), + c=x("./zlib/messages"),t=x("./zlib/zstream"),p=x("./zlib/gzheader"),v=Object.prototype.toString;n.prototype.push=function(r,E){var K=this.strm,U=this.options.chunkSize,O=this.options.dictionary,z=!1;if(this.ended)return!1;E=E===~~E?E:!0===E?a.Z_FINISH:a.Z_NO_FLUSH;"string"===typeof r?K.input=l.binstring2buf(r):"[object ArrayBuffer]"===v.call(r)?K.input=new Uint8Array(r):K.input=r;K.next_in=0;K.avail_in=K.input.length;do{0===K.avail_out&&(K.output=new b.Buf8(U),K.next_out=0,K.avail_out=U);r=g.inflate(K, + a.Z_NO_FLUSH);r===a.Z_NEED_DICT&&O&&(r="string"===typeof O?l.string2buf(O):"[object ArrayBuffer]"===v.call(O)?new Uint8Array(O):O,r=g.inflateSetDictionary(this.strm,r));r===a.Z_BUF_ERROR&&!0===z&&(r=a.Z_OK,z=!1);if(r!==a.Z_STREAM_END&&r!==a.Z_OK)return this.onEnd(r),this.ended=!0,!1;if(K.next_out&&(0===K.avail_out||r===a.Z_STREAM_END||0===K.avail_in&&(E===a.Z_FINISH||E===a.Z_SYNC_FLUSH)))if("string"===this.options.to){var M=l.utf8border(K.output,K.next_out);var f=K.next_out-M;var N=l.buf2string(K.output, + M);K.next_out=f;K.avail_out=U-f;f&&b.arraySet(K.output,K.output,M,f,0);this.onData(N)}else this.onData(b.shrinkBuf(K.output,K.next_out));0===K.avail_in&&0===K.avail_out&&(z=!0)}while((0c&&(a.subarray&& + b||!a.subarray&&g))return String.fromCharCode.apply(null,m.shrinkBuf(a,c));for(var t="",p=0;px;x++)l[x]=252<=x?6:248<=x?5:240<=x?4:224<=x?3:192<=x?2:1;l[254]=l[254]=1;C.string2buf=function(a){var c,t,p=a.length,v=0;for(c=0;cr?1:2048>r?2:65536>r?3:4}var K=new m.Buf8(v);for(c=t=0;tr?K[t++]=r:(2048>r?K[t++]=192|r>>>6:(65536>r?K[t++]=224|r>>>12:(K[t++]=240|r>>>18,K[t++]=128|r>>>12&63),K[t++]=128|r>>>6&63),K[t++]=128|r&63);return K};C.buf2binstring=function(a){return n(a,a.length)};C.binstring2buf= + function(a){for(var c=new m.Buf8(a.length),t=0,p=c.length;tr)v[t++]=r;else{var E=l[r];if(4r?v[t++]=r:(r-=65536,v[t++]=55296|r>>10&1023,v[t++]=56320|r&1023)}}}return n(v,t)};C.utf8border=function(a,c){var t;c=c||a.length;c>a.length&&(c=a.length);for(t=c-1;0<= + t&&128===(a[t]&192);)t--;return 0>t||0===t?c:t+l[a[t]]>c?t:c}},{"./common":123}],125:[function(x,W,C){W.exports=function(n,m,g,b){var l=n&65535|0;n=n>>>16&65535|0;for(var a;0!==g;){a=2E3b;b++){m=b;for(var l=0;8>l;l++)m=m&1?3988292384^m>>>1:m>>>1;g[b]=m}return g}();W.exports=function(m,g,b,l){b=l+b;for(m^=-1;l>>8^n[(m^g[l])&255];return m^-1}},{}],128:[function(x,W,C){function n(k,J){k.msg=F[J];return J}function m(k){for(var J=k.length;0<= + --J;)k[J]=0}function g(k){var J=k.state,I=J.pending;I>k.avail_out&&(I=k.avail_out);0!==I&&(f.arraySet(k.output,J.pending_buf,J.pending_out,I,k.next_out),k.next_out+=I,J.pending_out+=I,k.total_out+=I,k.avail_out-=I,J.pending-=I,0===J.pending&&(J.pending_out=0))}function b(k,J){N._tr_flush_block(k,0<=k.block_start?k.block_start:-1,k.strstart-k.block_start,J);k.block_start=k.strstart;g(k.strm)}function l(k,J){k.pending_buf[k.pending++]=J}function a(k,J){k.pending_buf[k.pending++]=J>>>8&255;k.pending_buf[k.pending++]= + J&255}function c(k,J){var I=k.max_chain_length,S=k.strstart,R=k.prev_length,Q=k.nice_match,B=k.strstart>k.w_size-262?k.strstart-(k.w_size-262):0,H=k.window,X=k.w_mask,u=k.prev,d=k.strstart+258,A=H[S+R-1],h=H[S+R];k.prev_length>=k.good_match&&(I>>=2);Q>k.lookahead&&(Q=k.lookahead);do{var w=J;if(H[w+R]===h&&H[w+R-1]===A&&H[w]===H[S]&&H[++w]===H[S+1]){S+=2;for(w++;H[++S]===H[++w]&&H[++S]===H[++w]&&H[++S]===H[++w]&&H[++S]===H[++w]&&H[++S]===H[++w]&&H[++S]===H[++w]&&H[++S]===H[++w]&&H[++S]===H[++w]&&S< + d;);w=258-(d-S);S=d-258;if(w>R){k.match_start=J;R=w;if(w>=Q)break;A=H[S+R-1];h=H[S+R]}}}while((J=u[J&X])>B&&0!==--I);return R<=k.lookahead?R:k.lookahead}function t(k){var J=k.w_size,I;do{var S=k.window_size-k.lookahead-k.strstart;if(k.strstart>=J+(J-262)){f.arraySet(k.window,k.window,J,J,0);k.match_start-=J;k.strstart-=J;k.block_start-=J;var R=I=k.hash_size;do{var Q=k.head[--R];k.head[R]=Q>=J?Q-J:0}while(--I);R=I=J;do Q=k.prev[--R],k.prev[R]=Q>=J?Q-J:0;while(--I);S+=J}if(0===k.strm.avail_in)break; + R=k.strm;I=k.window;Q=k.strstart+k.lookahead;var B=R.avail_in;B>S&&(B=S);0===B?I=0:(R.avail_in-=B,f.arraySet(I,R.input,R.next_in,B,Q),1===R.state.wrap?R.adler=T(R.adler,I,B,Q):2===R.state.wrap&&(R.adler=q(R.adler,I,B,Q)),R.next_in+=B,R.total_in+=B,I=B);k.lookahead+=I;if(3<=k.lookahead+k.insert)for(S=k.strstart-k.insert,k.ins_h=k.window[S],k.ins_h=(k.ins_h<k.lookahead+k.insert););}while(262>k.lookahead&&0!==k.strm.avail_in)}function p(k,J){for(var I;;){if(262>k.lookahead){t(k);if(262>k.lookahead&&0===J)return 1;if(0===k.lookahead)break}I=0;3<=k.lookahead&&(k.ins_h=(k.ins_h<k.strstart?k.strstart:2;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function v(k,J){for(var I,S;;){if(262>k.lookahead){t(k);if(262>k.lookahead&&0===J)return 1;if(0===k.lookahead)break}I=0;3<=k.lookahead&&(k.ins_h=(k.ins_h<=k.match_length&&(1===k.strategy||3===k.match_length&&4096k.strstart?k.strstart: + 2;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function r(k,J){for(var I,S,R,Q=k.window;;){if(258>=k.lookahead){t(k);if(258>=k.lookahead&&0===J)return 1;if(0===k.lookahead)break}k.match_length=0;if(3<=k.lookahead&&0 + k.lookahead&&(k.match_length=k.lookahead)}3<=k.match_length?(I=N._tr_tally(k,1,k.match_length-3),k.lookahead-=k.match_length,k.strstart+=k.match_length,k.match_length=0):(I=N._tr_tally(k,0,k.window[k.strstart]),k.lookahead--,k.strstart++);if(I&&(b(k,!1),0===k.strm.avail_out))return 1}k.insert=0;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function E(k,J){for(var I;;){if(0===k.lookahead&&(t(k),0===k.lookahead)){if(0===J)return 1;break}k.match_length= + 0;I=N._tr_tally(k,0,k.window[k.strstart]);k.lookahead--;k.strstart++;if(I&&(b(k,!1),0===k.strm.avail_out))return 1}k.insert=0;return 4===J?(b(k,!0),0===k.strm.avail_out?3:4):k.last_lit&&(b(k,!1),0===k.strm.avail_out)?1:2}function K(k,J,I,S,R){this.good_length=k;this.max_lazy=J;this.nice_length=I;this.max_chain=S;this.func=R}function U(){this.strm=null;this.status=0;this.pending_buf=null;this.wrap=this.pending=this.pending_out=this.pending_buf_size=0;this.gzhead=null;this.gzindex=0;this.method=8;this.last_flush= + -1;this.w_mask=this.w_bits=this.w_size=0;this.window=null;this.window_size=0;this.head=this.prev=null;this.nice_match=this.good_match=this.strategy=this.level=this.max_lazy_match=this.max_chain_length=this.prev_length=this.lookahead=this.match_start=this.strstart=this.match_available=this.prev_match=this.match_length=this.block_start=this.hash_shift=this.hash_mask=this.hash_bits=this.hash_size=this.ins_h=0;this.dyn_ltree=new f.Buf16(1146);this.dyn_dtree=new f.Buf16(122);this.bl_tree=new f.Buf16(78); + m(this.dyn_ltree);m(this.dyn_dtree);m(this.bl_tree);this.bl_desc=this.d_desc=this.l_desc=null;this.bl_count=new f.Buf16(16);this.heap=new f.Buf16(573);m(this.heap);this.heap_max=this.heap_len=0;this.depth=new f.Buf16(573);m(this.depth);this.bi_valid=this.bi_buf=this.insert=this.matches=this.static_len=this.opt_len=this.d_buf=this.last_lit=this.lit_bufsize=this.l_buf=0}function O(k){if(!k||!k.state)return n(k,-2);k.total_in=k.total_out=0;k.data_type=2;var J=k.state;J.pending=0;J.pending_out=0;0>J.wrap&& + (J.wrap=-J.wrap);J.status=J.wrap?42:113;k.adler=2===J.wrap?0:1;J.last_flush=0;N._tr_init(J);return 0}function z(k){var J=O(k);0===J&&(k=k.state,k.window_size=2*k.w_size,m(k.head),k.max_lazy_match=G[k.level].max_lazy,k.good_match=G[k.level].good_length,k.nice_match=G[k.level].nice_length,k.max_chain_length=G[k.level].max_chain,k.strstart=0,k.block_start=0,k.lookahead=0,k.insert=0,k.match_length=k.prev_length=2,k.match_available=0,k.ins_h=0);return J}function M(k,J,I,S,R,Q){if(!k)return-2;var B=1;-1=== + J&&(J=6);0>S?(B=0,S=-S):15R||9S||15J||9Q||4k.pending_buf_size-5&&(I=k.pending_buf_size-5);;){if(1>=k.lookahead){t(k);if(0===k.lookahead&&0===J)return 1;if(0===k.lookahead)break}k.strstart+=k.lookahead;k.lookahead=0;var S=k.block_start+I;if(0===k.strstart||k.strstart>=S)if(k.lookahead=k.strstart-S,k.strstart= + S,b(k,!1),0===k.strm.avail_out)return 1;if(k.strstart-k.block_start>=k.w_size-262&&(b(k,!1),0===k.strm.avail_out))return 1}k.insert=0;if(4===J)return b(k,!0),0===k.strm.avail_out?3:4;k.strstart>k.block_start&&b(k,!1);return 1}),new K(4,4,8,4,p),new K(4,5,16,8,p),new K(4,6,32,32,p),new K(4,4,16,16,v),new K(8,16,32,32,v),new K(8,16,128,128,v),new K(8,32,128,256,v),new K(32,128,258,1024,v),new K(32,258,258,4096,v)];C.deflateInit=function(k,J){return M(k,J,8,15,8,0)};C.deflateInit2=M;C.deflateReset=z; + C.deflateResetKeep=O;C.deflateSetHeader=function(k,J){if(!k||!k.state||2!==k.state.wrap)return-2;k.state.gzhead=J;return 0};C.deflate=function(k,J){if(!k||!k.state||5J)return k?n(k,-2):-2;var I=k.state;if(!k.output||!k.input&&0!==k.avail_in||666===I.status&&4!==J)return n(k,0===k.avail_out?-5:-2);I.strm=k;var S=I.last_flush;I.last_flush=J;if(42===I.status)if(2===I.wrap)k.adler=0,l(I,31),l(I,139),l(I,8),I.gzhead?(l(I,(I.gzhead.text?1:0)+(I.gzhead.hcrc?2:0)+(I.gzhead.extra?4:0)+(I.gzhead.name? + 8:0)+(I.gzhead.comment?16:0)),l(I,I.gzhead.time&255),l(I,I.gzhead.time>>8&255),l(I,I.gzhead.time>>16&255),l(I,I.gzhead.time>>24&255),l(I,9===I.level?2:2<=I.strategy||2>I.level?4:0),l(I,I.gzhead.os&255),I.gzhead.extra&&I.gzhead.extra.length&&(l(I,I.gzhead.extra.length&255),l(I,I.gzhead.extra.length>>8&255)),I.gzhead.hcrc&&(k.adler=q(k.adler,I.pending_buf,I.pending,0)),I.gzindex=0,I.status=69):(l(I,0),l(I,0),l(I,0),l(I,0),l(I,0),l(I,9===I.level?2:2<=I.strategy||2>I.level?4:0),l(I,3),I.status=113);else{var R= + 8+(I.w_bits-8<<4)<<8;R|=(2<=I.strategy||2>I.level?0:6>I.level?1:6===I.level?2:3)<<6;0!==I.strstart&&(R|=32);I.status=113;a(I,R+(31-R%31));0!==I.strstart&&(a(I,k.adler>>>16),a(I,k.adler&65535));k.adler=1}if(69===I.status)if(I.gzhead.extra){for(R=I.pending;I.gzindex<(I.gzhead.extra.length&65535)&&(I.pending!==I.pending_buf_size||(I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R)),g(k),R=I.pending,I.pending!==I.pending_buf_size));)l(I,I.gzhead.extra[I.gzindex]&255),I.gzindex++; + I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R));I.gzindex===I.gzhead.extra.length&&(I.gzindex=0,I.status=73)}else I.status=73;if(73===I.status)if(I.gzhead.name){R=I.pending;do{if(I.pending===I.pending_buf_size&&(I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R)),g(k),R=I.pending,I.pending===I.pending_buf_size)){var Q=1;break}Q=I.gzindex + R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R));0===Q&&(I.gzindex=0,I.status=91)}else I.status=91;if(91===I.status)if(I.gzhead.comment){R=I.pending;do{if(I.pending===I.pending_buf_size&&(I.gzhead.hcrc&&I.pending>R&&(k.adler=q(k.adler,I.pending_buf,I.pending-R,R)),g(k),R=I.pending,I.pending===I.pending_buf_size)){Q=1;break}Q=I.gzindexR&&(k.adler=q(k.adler,I.pending_buf,I.pending- + R,R));0===Q&&(I.status=103)}else I.status=103;103===I.status&&(I.gzhead.hcrc?(I.pending+2>I.pending_buf_size&&g(k),I.pending+2<=I.pending_buf_size&&(l(I,k.adler&255),l(I,k.adler>>8&255),k.adler=0,I.status=113)):I.status=113);if(0!==I.pending){if(g(k),0===k.avail_out)return I.last_flush=-1,0}else if(0===k.avail_in&&(J<<1)-(4=I.wrap)return 1;2===I.wrap?(l(I,k.adler&255),l(I,k.adler>>8&255),l(I,k.adler>>16&255),l(I,k.adler>>24&255),l(I,k.total_in&255),l(I,k.total_in>>8&255), + l(I,k.total_in>>16&255),l(I,k.total_in>>24&255)):(a(I,k.adler>>>16),a(I,k.adler&65535));g(k);0=S.w_size){0===R&&(m(S.head),S.strstart=0,S.block_start=0,S.insert=0);var Q=new f.Buf8(S.w_size);f.arraySet(Q,J,I-S.w_size,S.w_size,0);J=Q;I=S.w_size}Q=k.avail_in;var B=k.next_in;var H=k.input;k.avail_in=I;k.next_in=0;k.input=J;for(t(S);3<=S.lookahead;){J=S.strstart;I=S.lookahead-2;do S.ins_h=(S.ins_h<z&&(O+=l[b++]<>>24;O>>>=F;z-=F;F=q>>>16&255;if(0===F)t[c++]=q&65535;else if(F&16){var G=q&65535;if(F&= + 15)z>>=F,z-=F;15>z&&(O+=l[b++]<>>24;O>>>=F;z-=F;F=q>>>16&255;if(F&16){q&=65535;F&=15;zv){n.msg="invalid distance too far back";g.mode=30;break a}O>>>=F;z-=F;F=c-m;if(q>F){F=q-F;if(F>E&&g.sane){n.msg="invalid distance too far back";g.mode=30;break a}var k=0;var J=U;if(0===K){if(k+=r-F,F>3;b-=G;z-=G<<3;n.next_in=b;n.next_out=c;n.avail_in=b>>24&255)+(z>>>8&65280)+((z&65280)<<8)+((z&255)<<24)}function m(){this.mode=0;this.last=!1;this.wrap=0;this.havedict=!1;this.total=this.check=this.dmax=this.flags=0;this.head= + null;this.wnext=this.whave=this.wsize=this.wbits=0;this.window=null;this.extra=this.offset=this.length=this.bits=this.hold=0;this.distcode=this.lencode=null;this.have=this.ndist=this.nlen=this.ncode=this.distbits=this.lenbits=0;this.next=null;this.lens=new t.Buf16(320);this.work=new t.Buf16(288);this.distdyn=this.lendyn=null;this.was=this.back=this.sane=0}function g(z){if(!z||!z.state)return-2;var M=z.state;z.total_in=z.total_out=M.total=0;z.msg="";M.wrap&&(z.adler=M.wrap&1);M.mode=1;M.last=0;M.havedict= + 0;M.dmax=32768;M.head=null;M.hold=0;M.bits=0;M.lencode=M.lendyn=new t.Buf32(852);M.distcode=M.distdyn=new t.Buf32(592);M.sane=1;M.back=-1;return 0}function b(z){if(!z||!z.state)return-2;var M=z.state;M.wsize=0;M.whave=0;M.wnext=0;return g(z)}function l(z,M){if(!z||!z.state)return-2;var f=z.state;if(0>M){var N=0;M=-M}else N=(M>>4)+1,48>M&&(M&=15);if(M&&(8>M||15=T.wsize?(t.arraySet(T.window,M,f-T.wsize,T.wsize,0),T.wnext=0,T.whave=T.wsize):(z=T.wsize-T.wnext,z>N&&(z=N),t.arraySet(T.window,M,f-N,z,T.wnext),(N-=z)?(t.arraySet(T.window,M,f-N,N,0),T.wnext=N,T.whave=T.wsize):(T.wnext+=z,T.wnext===T.wsize&&(T.wnext=0),T.whaveQ;){if(0===S)break a;S--;R+=I[J++]<>>8&255;q.check=v(q.check,N,2,0);Q=R=0;q.mode=2;break}q.flags=0;q.head&&(q.head.done=!1);if(!(q.wrap&1)||(((R&255)<<8)+(R>>8))%31){z.msg="incorrect header check";q.mode=30;break}if(8!==(R&15)){z.msg="unknown compression method";q.mode=30;break}R>>>=4;Q-=4;var u=(R&15)+8;if(0===q.wbits)q.wbits=u;else if(u> + q.wbits){z.msg="invalid window size";q.mode=30;break}q.dmax=1<Q;){if(0===S)break a;S--;R+=I[J++]<>8&1);q.flags&512&&(N[0]=R&255,N[1]=R>>>8&255,q.check=v(q.check,N,2,0));Q=R=0;q.mode=3;case 3:for(;32>Q;){if(0===S)break a;S--;R+=I[J++]<>>8&255,N[2]=R>>>16&255,N[3]=R>>>24&255,q.check=v(q.check,N,4,0));Q=R=0;q.mode=4;case 4:for(;16>Q;){if(0===S)break a;S--;R+=I[J++]<>8);q.flags&512&&(N[0]=R&255,N[1]=R>>>8&255,q.check=v(q.check,N,2,0));Q=R=0;q.mode=5;case 5:if(q.flags&1024){for(;16>Q;){if(0===S)break a;S--;R+=I[J++]<>>8&255,q.check=v(q.check,N,2,0));Q=R=0}else q.head&&(q.head.extra= + null);q.mode=6;case 6:if(q.flags&1024){var d=q.length;d>S&&(d=S);d&&(q.head&&(u=q.head.extra_len-q.length,q.head.extra||(q.head.extra=Array(q.head.extra_len)),t.arraySet(q.head.extra,I,J,d,u)),q.flags&512&&(q.check=v(q.check,I,d,J)),S-=d,J+=d,q.length-=d);if(q.length)break a}q.length=0;q.mode=7;case 7:if(q.flags&2048){if(0===S)break a;d=0;do u=I[J+d++],q.head&&u&&65536>q.length&&(q.head.name+=String.fromCharCode(u));while(u&&dq.length&&(q.head.comment+=String.fromCharCode(u));while(u&&dQ;){if(0===S)break a;S--;R+=I[J++]<>9&1,q.head.done=!0);z.adler=q.check= + 0;q.mode=12;break;case 10:for(;32>Q;){if(0===S)break a;S--;R+=I[J++]<>>=Q&7;Q-=Q&7;q.mode=27;break}for(;3>Q;){if(0===S)break a;S--;R+=I[J++]<>>=1;--Q;switch(R&3){case 0:q.mode=14;break;case 1:u=q;if(K){U=new t.Buf32(512);O=new t.Buf32(32);for(d=0;144> + d;)u.lens[d++]=8;for(;256>d;)u.lens[d++]=9;for(;280>d;)u.lens[d++]=7;for(;288>d;)u.lens[d++]=8;E(1,u.lens,0,288,U,0,u.work,{bits:9});for(d=0;32>d;)u.lens[d++]=5;E(2,u.lens,0,32,O,0,u.work,{bits:5});K=!1}u.lencode=U;u.lenbits=9;u.distcode=O;u.distbits=5;q.mode=20;if(6===M){R>>>=2;Q-=2;break a}break;case 2:q.mode=17;break;case 3:z.msg="invalid block type",q.mode=30}R>>>=2;Q-=2;break;case 14:R>>>=Q&7;for(Q-=Q&7;32>Q;){if(0===S)break a;S--;R+=I[J++]<>>16^65535)){z.msg="invalid stored block lengths"; + q.mode=30;break}q.length=R&65535;Q=R=0;q.mode=15;if(6===M)break a;case 15:q.mode=16;case 16:if(d=q.length){d>S&&(d=S);d>k&&(d=k);if(0===d)break a;t.arraySet(G,I,J,d,F);S-=d;J+=d;k-=d;F+=d;q.length-=d;break}q.mode=12;break;case 17:for(;14>Q;){if(0===S)break a;S--;R+=I[J++]<>>=5;Q-=5;q.ndist=(R&31)+1;R>>>=5;Q-=5;q.ncode=(R&15)+4;R>>>=4;Q-=4;if(286 + Q;){if(0===S)break a;S--;R+=I[J++]<>>=3;Q-=3}for(;19>q.have;)q.lens[T[q.have++]]=0;q.lencode=q.lendyn;q.lenbits=7;d={bits:q.lenbits};X=E(0,q.lens,0,19,q.lencode,0,q.work,d);q.lenbits=d.bits;if(X){z.msg="invalid code lengths set";q.mode=30;break}q.have=0;q.mode=19;case 19:for(;q.have>>24;A&=65535;if(d<=Q)break;if(0===S)break a;S--;R+=I[J++]<A)R>>>=d,Q-=d,q.lens[q.have++]=A;else{if(16=== + A){for(u=d+2;Q>>=d;Q-=d;if(0===q.have){z.msg="invalid bit length repeat";q.mode=30;break}u=q.lens[q.have-1];d=3+(R&3);R>>>=2;Q-=2}else if(17===A){for(u=d+3;Q>>=d;Q-=d;u=0;d=3+(R&7);R>>>=3;Q-=3}else{for(u=d+7;Q>>=d;Q-=d;u=0;d=11+(R&127);R>>>=7;Q-=7}if(q.have+d>q.nlen+q.ndist){z.msg="invalid bit length repeat";q.mode=30;break}for(;d--;)q.lens[q.have++]=u}}if(30=== + q.mode)break;if(0===q.lens[256]){z.msg="invalid code -- missing end-of-block";q.mode=30;break}q.lenbits=9;d={bits:q.lenbits};X=E(1,q.lens,0,q.nlen,q.lencode,0,q.work,d);q.lenbits=d.bits;if(X){z.msg="invalid literal/lengths set";q.mode=30;break}q.distbits=6;q.distcode=q.distdyn;d={bits:q.distbits};X=E(2,q.lens,q.nlen,q.ndist,q.distcode,0,q.work,d);q.distbits=d.bits;if(X){z.msg="invalid distances set";q.mode=30;break}q.mode=20;if(6===M)break a;case 20:q.mode=21;case 21:if(6<=S&&258<=k){z.next_out=F; + z.avail_out=k;z.next_in=J;z.avail_in=S;q.hold=R;q.bits=Q;r(z,H);F=z.next_out;G=z.output;k=z.avail_out;J=z.next_in;I=z.input;S=z.avail_in;R=q.hold;Q=q.bits;12===q.mode&&(q.back=-1);break}for(q.back=0;;){A=q.lencode[R&(1<>>24;u=A>>>16&255;A&=65535;if(d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>h)];d=A>>>24;u=A>>>16&255;A&=65535;if(h+d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>>=h;Q-=h;q.back+= + h}R>>>=d;Q-=d;q.back+=d;q.length=A;if(0===u){q.mode=26;break}if(u&32){q.back=-1;q.mode=12;break}if(u&64){z.msg="invalid literal/length code";q.mode=30;break}q.extra=u&15;q.mode=22;case 22:if(q.extra){for(u=q.extra;Q>>=q.extra;Q-=q.extra;q.back+=q.extra}q.was=q.length;q.mode=23;case 23:for(;;){A=q.distcode[R&(1<>>24;u=A>>>16&255;A&=65535;if(d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>h)];d=A>>>24;u=A>>>16&255;A&=65535;if(h+d<=Q)break;if(0===S)break a;S--;R+=I[J++]<>>=h;Q-=h;q.back+=h}R>>>=d;Q-=d;q.back+=d;if(u&64){z.msg="invalid distance code";q.mode=30;break}q.offset=A;q.extra=u&15;q.mode=24;case 24:if(q.extra){for(u=q.extra;Q>>=q.extra;Q-=q.extra;q.back+=q.extra}if(q.offset>q.dmax){z.msg="invalid distance too far back";q.mode=30;break}q.mode=25; + case 25:if(0===k)break a;d=H-k;if(q.offset>d){d=q.offset-d;if(d>q.whave&&q.sane){z.msg="invalid distance too far back";q.mode=30;break}d>q.wnext?(d-=q.wnext,u=q.wsize-d):u=q.wnext-d;d>q.length&&(d=q.length);h=q.window}else h=G,u=F-q.offset,d=q.length;d>k&&(d=k);k-=d;q.length-=d;do G[F++]=h[u++];while(--d);0===q.length&&(q.mode=21);break;case 26:if(0===k)break a;G[F++]=q.length;k--;q.mode=21;break;case 27:if(q.wrap){for(;32>Q;){if(0===S)break a;S--;R|=I[J++]<Q;){if(0===S)break a;S--;R+=I[J++]<q.mode&&(27>q.mode||4!==M))&&c(z,z.output,z.next_out,H-z.avail_out))return q.mode=31,-4;B-=z.avail_in;H-=z.avail_out;z.total_in+=B;z.total_out+=H;q.total+=H;q.wrap&&H&&(z.adler=q.check=q.flags?v(q.check,G,H,z.next_out-H):p(q.check,G,H,z.next_out-H));z.data_type=q.bits+(q.last?64:0)+(12===q.mode?128:0)+(20===q.mode||15===q.mode?256:0);(0===B&&0===H||4===M)&&0===X&&(X=-5);return X};C.inflateEnd=function(z){if(!z||!z.state)return-2;var M=z.state;M.window&&(M.window=null);z.state=null;return 0};C.inflateGetHeader= + function(z,M){if(!z||!z.state)return-2;z=z.state;if(0===(z.wrap&2))return-2;z.head=M;M.done=!1;return 0};C.inflateSetDictionary=function(z,M){var f=M.length;if(!z||!z.state)return-2;var N=z.state;if(0!==N.wrap&&11!==N.mode)return-2;if(11===N.mode){var T=p(1,M,f,0);if(T!==N.check)return-3}if(c(z,M,f,f))return N.mode=31,-4;N.havedict=1;return 0};C.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":123,"./adler32":125,"./crc32":127,"./inffast":130,"./inftrees":132}],132:[function(x, + W,C){var n=x("../utils/common"),m=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],g=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],b=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],l=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];W.exports=function(a,c,t,p,v,r,E,K){var U=K.bits,O,z,M,f,N, + T,q=0,F=new n.Buf16(16);var G=new n.Buf16(16);var k,J=0;for(O=0;15>=O;O++)F[O]=0;for(z=0;zM&&(I=M);if(0===M)return v[r++]=20971520,v[r++]=20971520,K.bits=1,0;for(U=1;U=O;O++)if(f<<=1,f-=F[O],0>f)return-1;if(0O;O++)G[O+1]=G[O]+F[O];for(z=0;zR?(A=k[J+E[z]],h=S[q+E[z]]):(A=96,h=0);f=1<>G)+T]=d<<24|A<<16|h|0;while(0!==T);for(f=1<>=1;0!==f?(N&=f-1,N+=f):N=0;z++;if(0===--F[O]){if(O===M)break;O=c[t+E[z]]}if(O>I&&(N&X)!==B){0===G&&(G=I);Q+=U;p=O-G;for(f=1<=f)break;p++;f<<=1}H+=1<>>8&255}function l(d,A,h){d.bi_valid>16-h?(d.bi_buf|=A<>16-d.bi_valid,d.bi_valid+=h-16):(d.bi_buf|=A<>>=1,h<<=1;while(0<--A);return h>>>1}function t(d,A,h){var w=Array(16),P=0,e; + for(e=1;15>=e;e++)w[e]=P=P+h[e-1]<<1;for(h=0;h<=A;h++)P=d[2*h+1],0!==P&&(d[2*h]=c(w[P]++,P))}function p(d){var A;for(A=0;286>A;A++)d.dyn_ltree[2*A]=0;for(A=0;30>A;A++)d.dyn_dtree[2*A]=0;for(A=0;19>A;A++)d.bl_tree[2*A]=0;d.dyn_ltree[512]=1;d.opt_len=d.static_len=0;d.last_lit=d.matches=0}function v(d){8P?I[P]:I[256+(P>>>7)];a(d,y,h);D=q[y];0!==D&&(P-=Q[y],l(d,P,D))}}while(wd.heap_len;){var L=d.heap[++d.heap_len]=2>D?++D:0;h[2*L]=1;d.depth[L]=0;d.opt_len--;P&&(d.static_len-=w[2*L+1])}A.max_code=D;for(y=d.heap_len>>1;1<=y;y--)E(d,h,y);L=e;do y=d.heap[1],d.heap[1]=d.heap[d.heap_len--],E(d,h,1),w=d.heap[1],d.heap[--d.heap_max]=y,d.heap[--d.heap_max]= + w,h[2*L]=h[2*y]+h[2*w],d.depth[L]=(d.depth[y]>=d.depth[w]?d.depth[y]:d.depth[w])+1,h[2*y+1]=h[2*w+1]=L,d.heap[1]=L++,E(d,h,1);while(2<=d.heap_len);d.heap[--d.heap_max]=d.heap[1];y=A.dyn_tree;L=A.max_code;w=A.stat_desc.static_tree;P=A.stat_desc.has_stree;e=A.stat_desc.extra_bits;var V=A.stat_desc.extra_base,Y=A.stat_desc.max_length,Z,ca=0;for(Z=0;15>=Z;Z++)d.bl_count[Z]=0;y[2*d.heap[d.heap_max]+1]=0;for(A=d.heap_max+1;573>A;A++){var fa=d.heap[A];Z=y[2*y[2*fa+1]+1]+1;Z>Y&&(Z=Y,ca++);y[2*fa+1]=Z;if(!(fa> + L)){d.bl_count[Z]++;var ha=0;fa>=V&&(ha=e[fa-V]);var la=y[2*fa];d.opt_len+=la*(Z+ha);P&&(d.static_len+=la*(w[2*fa+1]+ha))}}if(0!==ca){do{for(Z=Y-1;0===d.bl_count[Z];)Z--;d.bl_count[Z]--;d.bl_count[Z+1]+=2;d.bl_count[Y]--;ca-=2}while(0L||(y[2*w+1]!==Z&&(d.opt_len+=(Z-y[2*w+1])*y[2*w],y[2*w+1]=Z),fa--)}t(h,D,d.bl_count)}function O(d,A,h){var w,P=-1,e=A[1],y=0,D=7,L=4;0===e&&(D=138,L=3);A[2*(h+1)+1]=65535;for(w=0;w<=h;w++){var V=e;e= + A[2*(w+1)+1];++y=y?d.bl_tree[34]++:d.bl_tree[36]++,y=0,P=V,0===e?(D=138,L=3):V===e?(D=6,L=3):(D=7,L=4))}}function z(d,A,h){var w,P=-1,e=A[1],y=0,D=7,L=4;0===e&&(D=138,L=3);for(w=0;w<=h;w++){var V=e;e=A[2*(w+1)+1];if(!(++y=y?(a(d,17,d.bl_tree),l(d,y-3,3)):(a(d,18,d.bl_tree),l(d,y-11,7)); + y=0;P=V;0===e?(D=138,L=3):V===e?(D=6,L=3):(D=7,L=4)}}}function M(d){var A=4093624447,h;for(h=0;31>=h;h++,A>>>=1)if(A&1&&0!==d.dyn_ltree[2*h])return 0;if(0!==d.dyn_ltree[18]||0!==d.dyn_ltree[20]||0!==d.dyn_ltree[26])return 1;for(h=32;256>h;h++)if(0!==d.dyn_ltree[2*h])return 1;return 0}function f(d,A,h,w){l(d,w?1:0,3);v(d);b(d,h);b(d,~h);N.arraySet(d.pending_buf,d.window,A,h,d.pending);d.pending+=h}var N=x("../utils/common"),T=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],q=[0,0,0,0,1, + 1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],F=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],G=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],k=Array(576);n(k);var J=Array(60);n(J);var I=Array(512);n(I);var S=Array(256);n(S);var R=Array(29);n(R);var Q=Array(30);n(Q);var B,H,X,u=!1;C._tr_init=function(d){if(!u){var A,h,w,P=Array(16);for(w=h=0;28>w;w++)for(R[w]=h,A=0;A<1<w;w++)for(Q[w]=h,A=0;A<1<>=7;30>w;w++)for(Q[w]=h<<7,A= + 0;A<1<=A;A++)P[A]=0;for(A=0;143>=A;)k[2*A+1]=8,A++,P[8]++;for(;255>=A;)k[2*A+1]=9,A++,P[9]++;for(;279>=A;)k[2*A+1]=7,A++,P[7]++;for(;287>=A;)k[2*A+1]=8,A++,P[8]++;t(k,287,P);for(A=0;30>A;A++)J[2*A+1]=5,J[2*A]=c(A,5);B=new m(k,T,257,286,15);H=new m(J,q,0,30,15);X=new m([],F,0,19,7);u=!0}d.l_desc=new g(d.dyn_ltree,B);d.d_desc=new g(d.dyn_dtree,H);d.bl_desc=new g(d.bl_tree,X);d.bi_buf=0;d.bi_valid=0;p(d)};C._tr_stored_block=f;C._tr_flush_block=function(d,A,h,w){var P= + 0;if(0>>3;var y=d.static_len+3+7>>>3;y<=e&&(e=y)}else e=y=h+5;if(h+4<=e&&-1!==A)f(d,A,h,w);else if(4===d.strategy||y===e)l(d,2+(w?1:0),3),K(d,k,J);else{l(d,4+(w?1:0),3);A=d.l_desc.max_code+1;h=d.d_desc.max_code+1;P+=1;l(d,A-257,5);l(d,h-1,5);l(d, + P-4,4);for(e=0;e>>8&255;d.pending_buf[d.d_buf+2*d.last_lit+1]=A&255;d.pending_buf[d.l_buf+d.last_lit]=h&255;d.last_lit++;0===A?d.dyn_ltree[2*h]++:(d.matches++,A--,d.dyn_ltree[2*(S[h]+256+1)]++,d.dyn_dtree[2*(256>A?I[A]:I[256+(A>>>7)])]++);return d.last_lit===d.lit_bufsize-1};C._tr_align=function(d){l(d,2,3);a(d,256, + k);16===d.bi_valid?(b(d,d.bi_buf),d.bi_buf=0,d.bi_valid=0):8<=d.bi_valid&&(d.pending_buf[d.pending++]=d.bi_buf&255,d.bi_buf>>=8,d.bi_valid-=8)}},{"../utils/common":123}],135:[function(x,W,C){W.exports=function(){this.input=null;this.total_in=this.avail_in=this.next_in=0;this.output=null;this.total_out=this.avail_out=this.next_out=0;this.msg="";this.state=null;this.data_type=2;this.adler=0}},{}],136:[function(x,W,C){(function(n){function m(a,c){for(var t=0,p=a.length-1;0<=p;p--){var v=a[p];"."===v? + a.splice(p,1):".."===v?(a.splice(p,1),t++):t&&(a.splice(p,1),t--)}if(c)for(;t--;t)a.unshift("..");return a}function g(a,c){if(a.filter)return a.filter(c);for(var t=[],p=0;pU?[]:E.slice(K,U-K+1)}a=C.resolve(a).substr(1);c=C.resolve(c).substr(1);a=t(a.split("/"));c=t(c.split("/"));for(var p=Math.min(a.length,c.length),v=p,r=0;rc&&(c=a.length+c);return a.substr(c,t)}}).call(this,x("_process"))},{_process:138}],137:[function(x,W,C){(function(n){function m(g,b,l,a){if("function"!==typeof g)throw new TypeError('"callback" argument must be a function'); + var c=arguments.length;switch(c){case 0:case 1:return n.nextTick(g);case 2:return n.nextTick(function(){g.call(null,b)});case 3:return n.nextTick(function(){g.call(null,b,l)});case 4:return n.nextTick(function(){g.call(null,b,l,a)});default:var t=Array(c-1);for(c=0;c=B||0===H.length&&H.ended)return 0;if(H.objectMode)return 1;if(B!==B)return H.flowing&&H.length?H.buffer.head.data.length:H.length;if(B>H.highWaterMark){var X=B;8388608<=X?X=8388608:(X--,X|=X>>>1,X|=X>>>2,X|=X>>>4,X|=X>>>8,X|=X>>> + 16,X++);H.highWaterMark=X}return B<=H.length?B:H.ended?H.length:(H.needReadable=!0,0)}function c(B){var H=B._readableState;H.needReadable=!1;H.emittedReadable||(S("emitReadable",H.flowing),H.emittedReadable=!0,H.sync?N(t,B):t(B))}function t(B){S("emit readable");B.emit("readable");K(B)}function p(B,H){for(var X=H.length;!H.reading&&!H.flowing&&!H.ended&&H.length=H.length)X=H.decoder?H.buffer.join(""):1===H.buffer.length?H.buffer.head.data:H.buffer.concat(H.length),H.buffer.clear();else{X=H.buffer;H=H.decoder;if(BA.length?A.length:B;d=h===A.length?d+A:d+A.slice(0,B);B-=h;if(0===B){h===A.length?(++u,X.head=H.next?H.next:X.tail=null):(X.head=H, + H.data=A.slice(h));break}++u}X.length-=u;X=d}else{H=k.allocUnsafe(B);u=X.head;d=1;u.data.copy(H);for(B-=u.data.length;u=u.next;){A=u.data;h=B>A.length?A.length:B;A.copy(H,H.length-B,0,h);B-=h;if(0===B){h===A.length?(++d,X.head=u.next?u.next:X.tail=null):(X.head=u,u.data=A.slice(h));break}++d}X.length-=d;X=H}H=X}X=H}return X}function O(B){var H=B._readableState;if(0=H.highWaterMark||H.ended))return S("read: emitReadable",H.length,H.ended),0===H.length&&H.ended?O(this):c(this),null;B=a(B,H);if(0===B&&H.ended)return 0===H.length&&O(this),null;var u=H.needReadable;S("need readable",u);if(0===H.length||H.length-B>>0);for(var b=this.head,l=0;b;)b.data.copy(g,l),l+=b.data.length,b=b.next;return g}},{buffer:77,"buffer-shims":76}],146:[function(x,W,C){W.exports=x("./lib/_stream_passthrough.js")}, + {"./lib/_stream_passthrough.js":141}],147:[function(x,W,C){var n=x("_process");a:{try{var m=x("stream");break a}catch(g){}m=void 0}C=W.exports=x("./lib/_stream_readable.js");C.Stream=m||C;C.Readable=C;C.Writable=x("./lib/_stream_writable.js");C.Duplex=x("./lib/_stream_duplex.js");C.Transform=x("./lib/_stream_transform.js");C.PassThrough=x("./lib/_stream_passthrough.js");!n.browser&&"disable"===n.env.READABLE_STREAM&&m&&(W.exports=m)},{"./lib/_stream_duplex.js":140,"./lib/_stream_passthrough.js":141, + "./lib/_stream_readable.js":142,"./lib/_stream_transform.js":143,"./lib/_stream_writable.js":144,_process:138}],148:[function(x,W,C){W.exports=x("./lib/_stream_transform.js")},{"./lib/_stream_transform.js":143}],149:[function(x,W,C){W.exports=x("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":144}],150:[function(x,W,C){(function(n){(function(m){function g(e,y){if(!(this instanceof g))return new g(e,y);for(var D=0,L=T.length;De.indexOf(":")? + ["",e]:e.split(":"),L=D[0];D=D[1];y&&"xmlns"===e&&(L="xmlns",D="");return{prefix:L,local:D}}function U(e){e.strict||(e.attribName=e.attribName[e.looseCase]());if(-1===e.attribList.indexOf(e.attribName)&&!e.tag.attributes.hasOwnProperty(e.attribName))if(e.opt.xmlns){var y=K(e.attribName,!0),D=y.local;if("xmlns"===y.prefix)if("xml"===D&&e.attribValue!==B)E(e,"xml: prefix must be bound to "+B+"\nActual: "+e.attribValue);else if("xmlns"===D&&e.attribValue!==H)E(e,"xmlns: prefix must be bound to "+H+"\nActual: "+ + e.attribValue);else{y=e.tag;var L=e.tags[e.tags.length-1]||e;y.ns===L.ns&&(y.ns=Object.create(L.ns));y.ns[D]=e.attribValue}e.attribList.push([e.attribName,e.attribValue])}else e.tag.attributes[e.attribName]=e.attribValue,c(e,"onattribute",{name:e.attribName,value:e.attribValue});e.attribName=e.attribValue=""}function O(e,y){if(e.opt.xmlns){var D=e.tag,L=K(e.tagName);D.prefix=L.prefix;D.local=L.local;D.uri=D.ns[L.prefix]||"";D.prefix&&!D.uri&&(E(e,"Unbound namespace prefix: "+JSON.stringify(e.tagName)), + D.uri=L.prefix);L=e.tags[e.tags.length-1]||e;D.ns&&L.ns!==D.ns&&Object.keys(D.ns).forEach(function(la){c(e,"onopennamespace",{prefix:la,uri:D.ns[la]})});L=0;for(var V=e.attribList.length;L";e.tagName="";e.state=w.SCRIPT;return}c(e,"onscript",e.script);e.script=""}var y=e.tags.length,D=e.tagName;e.strict||(D=D[e.looseCase]());for(var L=D;y--;)if(e.tags[y].name!==L)E(e,"Unexpected close tag"); + else break;if(0>y)E(e,"Unmatched closing tag: "+e.tagName),e.textNode+="";else{e.tagName=D;for(D=e.tags.length;D-- >y;){var V=e.tag=e.tags.pop();e.tagName=e.tag.name;c(e,"onclosetag",e.tagName);for(var Y in V.ns);L=e.tags[e.tags.length-1]||e;e.opt.xmlns&&V.ns!==L.ns&&Object.keys(V.ns).forEach(function(Z){c(e,"onclosenamespace",{prefix:Z,uri:V.ns[Z]})})}0===y&&(e.closedRoot=!0);e.tagName=e.attribValue=e.attribName="";e.attribList.length=0}}else E(e,"Weird empty close tag."),e.textNode+= + "";e.state=w.TEXT}function M(e){var y=e.entity,D=y.toLowerCase(),L="";if(e.ENTITIES[y])return e.ENTITIES[y];if(e.ENTITIES[D])return e.ENTITIES[D];y=D;if("#"===y.charAt(0))if("x"===y.charAt(1)){y=y.slice(2);var V=parseInt(y,16);L=V.toString(16)}else y=y.slice(1),V=parseInt(y,10),L=V.toString(10);y=y.replace(/^0+/,"");return L.toLowerCase()!==y?(E(e,"Invalid character entity"),"&"+e.entity+";"):String.fromCodePoint(V)}function f(e,y){"<"===y?(e.state=w.OPEN_WAKA,e.startTagPosition=e.position):a(G, + y)||(E(e,"Non-whitespace before first tag."),e.textNode=y,e.state=w.TEXT)}function N(e,y){var D="";y"===D?(c(this,"onsgmldeclaration",this.sgmlDecl),this.sgmlDecl="",this.state=w.TEXT):(a(I,D)&&(this.state=w.SGML_DECL_QUOTED),this.sgmlDecl+=D);continue;case w.SGML_DECL_QUOTED:D===this.q&&(this.state=w.SGML_DECL,this.q="");this.sgmlDecl+=D;continue;case w.DOCTYPE:">"===D?(this.state=w.TEXT,c(this,"ondoctype",this.doctype),this.doctype=!0):(this.doctype+=D,"["===D?this.state=w.DOCTYPE_DTD: + a(I,D)&&(this.state=w.DOCTYPE_QUOTED,this.q=D));continue;case w.DOCTYPE_QUOTED:this.doctype+=D;D===this.q&&(this.q="",this.state=w.DOCTYPE);continue;case w.DOCTYPE_DTD:this.doctype+=D;"]"===D?this.state=w.DOCTYPE:a(I,D)&&(this.state=w.DOCTYPE_DTD_QUOTED,this.q=D);continue;case w.DOCTYPE_DTD_QUOTED:this.doctype+=D;D===this.q&&(this.state=w.DOCTYPE_DTD,this.q="");continue;case w.COMMENT:"-"===D?this.state=w.COMMENT_ENDING:this.comment+=D;continue;case w.COMMENT_ENDING:"-"===D?(this.state=w.COMMENT_ENDED, + (this.comment=p(this.opt,this.comment))&&c(this,"oncomment",this.comment),this.comment=""):(this.comment+="-"+D,this.state=w.COMMENT);continue;case w.COMMENT_ENDED:">"!==D?(E(this,"Malformed comment"),this.comment+="--"+D,this.state=w.COMMENT):this.state=w.TEXT;continue;case w.CDATA:"]"===D?this.state=w.CDATA_ENDING:this.cdata+=D;continue;case w.CDATA_ENDING:"]"===D?this.state=w.CDATA_ENDING_2:(this.cdata+="]"+D,this.state=w.CDATA);continue;case w.CDATA_ENDING_2:">"===D?(this.cdata&&c(this,"oncdata", + this.cdata),c(this,"onclosecdata"),this.cdata="",this.state=w.TEXT):"]"===D?this.cdata+="]":(this.cdata+="]]"+D,this.state=w.CDATA);continue;case w.PROC_INST:"?"===D?this.state=w.PROC_INST_ENDING:a(G,D)?this.state=w.PROC_INST_BODY:this.procInstName+=D;continue;case w.PROC_INST_BODY:if(!this.procInstBody&&a(G,D))continue;else"?"===D?this.state=w.PROC_INST_ENDING:this.procInstBody+=D;continue;case w.PROC_INST_ENDING:">"===D?(c(this,"onprocessinginstruction",{name:this.procInstName,body:this.procInstBody}), + this.procInstName=this.procInstBody="",this.state=w.TEXT):(this.procInstBody+="?"+D,this.state=w.PROC_INST_BODY);continue;case w.OPEN_TAG:if(a(d,D))this.tagName+=D;else{this.strict||(this.tagName=this.tagName[this.looseCase]());L=this.tags[this.tags.length-1]||this;var V=this.tag={name:this.tagName,attributes:{}};this.opt.xmlns&&(V.ns=L.ns);this.attribList.length=0;">"===D?O(this):"/"===D?this.state=w.OPEN_TAG_SLASH:(a(G,D)||E(this,"Invalid character in tag name"),this.state=w.ATTRIB)}continue;case w.OPEN_TAG_SLASH:">"=== + D?(O(this,!0),z(this)):(E(this,"Forward-slash in opening tag not followed by >"),this.state=w.ATTRIB);continue;case w.ATTRIB:if(a(G,D))continue;else">"===D?O(this):"/"===D?this.state=w.OPEN_TAG_SLASH:a(u,D)?(this.attribName=D,this.attribValue="",this.state=w.ATTRIB_NAME):E(this,"Invalid attribute name");continue;case w.ATTRIB_NAME:"="===D?this.state=w.ATTRIB_VALUE:">"===D?(E(this,"Attribute without value"),this.attribValue=this.attribName,U(this),O(this)):a(G,D)?this.state=w.ATTRIB_NAME_SAW_WHITE: + a(d,D)?this.attribName+=D:E(this,"Invalid attribute name");continue;case w.ATTRIB_NAME_SAW_WHITE:if("="===D)this.state=w.ATTRIB_VALUE;else if(a(G,D))continue;else E(this,"Attribute without value"),this.attribValue=this.tag.attributes[this.attribName]="",c(this,"onattribute",{name:this.attribName,value:""}),this.attribName="",">"===D?O(this):a(u,D)?(this.attribName=D,this.state=w.ATTRIB_NAME):(E(this,"Invalid attribute name"),this.state=w.ATTRIB);continue;case w.ATTRIB_VALUE:if(a(G,D))continue;else a(I, + D)?(this.q=D,this.state=w.ATTRIB_VALUE_QUOTED):(E(this,"Unquoted attribute value"),this.state=w.ATTRIB_VALUE_UNQUOTED,this.attribValue=D);continue;case w.ATTRIB_VALUE_QUOTED:if(D!==this.q){"&"===D?this.state=w.ATTRIB_VALUE_ENTITY_Q:this.attribValue+=D;continue}U(this);this.q="";this.state=w.ATTRIB_VALUE_CLOSED;continue;case w.ATTRIB_VALUE_CLOSED:a(G,D)?this.state=w.ATTRIB:">"===D?O(this):"/"===D?this.state=w.OPEN_TAG_SLASH:a(u,D)?(E(this,"No whitespace between attributes"),this.attribName=D,this.attribValue= + "",this.state=w.ATTRIB_NAME):E(this,"Invalid attribute name");continue;case w.ATTRIB_VALUE_UNQUOTED:if(!a(S,D)){"&"===D?this.state=w.ATTRIB_VALUE_ENTITY_U:this.attribValue+=D;continue}U(this);">"===D?O(this):this.state=w.ATTRIB;continue;case w.CLOSE_TAG:if(this.tagName)">"===D?z(this):a(d,D)?this.tagName+=D:this.script?(this.script+=""===D?z(this):E(this,"Invalid characters in closing tag");continue;case w.TEXT_ENTITY:case w.ATTRIB_VALUE_ENTITY_Q:case w.ATTRIB_VALUE_ENTITY_U:switch(this.state){case w.TEXT_ENTITY:var Y=w.TEXT;var Z="textNode";break;case w.ATTRIB_VALUE_ENTITY_Q:Y=w.ATTRIB_VALUE_QUOTED;Z="attribValue";break;case w.ATTRIB_VALUE_ENTITY_U:Y=w.ATTRIB_VALUE_UNQUOTED, + Z="attribValue"}";"===D?(this[Z]+=M(this),this.entity="",this.state=Y):a(this.entity.length?h:A,D)?this.entity+=D:(E(this,"Invalid character in entity name"),this[Z]+="&"+this.entity+D,this.entity="",this.state=Y);continue;default:throw Error(this,"Unknown state: "+this.state);}}if(this.position>=this.bufferCheckPosition){e=Math.max(m.MAX_BUFFER_LENGTH,10);D=y=0;for(Y=T.length;De)switch(T[D]){case "textNode":t(this);break;case "cdata":c(this,"oncdata",this.cdata); + this.cdata="";break;case "script":c(this,"onscript",this.script);this.script="";break;default:v(this,"Max buffer length exceeded: "+T[D])}y=Math.max(y,Z)}this.bufferCheckPosition=m.MAX_BUFFER_LENGTH-y+this.position}return this},resume:function(){this.error=null;return this},close:function(){return this.write(null)},flush:function(){t(this);""!==this.cdata&&(c(this,"oncdata",this.cdata),this.cdata="");""!==this.script&&(c(this,"onscript",this.script),this.script="")}};try{var q=x("stream").Stream}catch(e){q= + function(){}}var F=m.EVENTS.filter(function(e){return"error"!==e&&"end"!==e});b.prototype=Object.create(q.prototype,{constructor:{value:b}});b.prototype.write=function(e){"function"===typeof n&&"function"===typeof n.isBuffer&&n.isBuffer(e)&&(this._decoder||(this._decoder=new (x("string_decoder").StringDecoder)("utf8")),e=this._decoder.write(e));this._parser.write(e.toString());this.emit("data",e);return!0};b.prototype.end=function(e){e&&e.length&&this.write(e);this._parser.end();return!0};b.prototype.on= + function(e,y){var D=this;D._parser["on"+e]||-1===F.indexOf(e)||(D._parser["on"+e]=function(){var L=1===arguments.length?[arguments[0]]:Array.apply(null,arguments);L.splice(0,0,e);D.emit.apply(D,L)});return q.prototype.on.call(D,e,y)};var G="\r\n\t ",k="0124356789",J="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",I="'\"",S=G+">",R="[CDATA[",Q="DOCTYPE",B="http://www.w3.org/XML/1998/namespace",H="http://www.w3.org/2000/xmlns/",X={xml:B,xmlns:H};G=l(G);k=l(k);J=l(J);var u=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, + d=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/,A=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,h=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/; + I=l(I);S=l(S);var w=0;m.STATE={BEGIN:w++,BEGIN_WHITESPACE:w++,TEXT:w++,TEXT_ENTITY:w++,OPEN_WAKA:w++,SGML_DECL:w++,SGML_DECL_QUOTED:w++,DOCTYPE:w++,DOCTYPE_QUOTED:w++,DOCTYPE_DTD:w++,DOCTYPE_DTD_QUOTED:w++,COMMENT_STARTING:w++,COMMENT:w++,COMMENT_ENDING:w++,COMMENT_ENDED:w++,CDATA:w++,CDATA_ENDING:w++,CDATA_ENDING_2:w++,PROC_INST:w++,PROC_INST_BODY:w++,PROC_INST_ENDING:w++,OPEN_TAG:w++,OPEN_TAG_SLASH:w++,ATTRIB:w++,ATTRIB_NAME:w++,ATTRIB_NAME_SAW_WHITE:w++,ATTRIB_VALUE:w++,ATTRIB_VALUE_QUOTED:w++, + ATTRIB_VALUE_CLOSED:w++,ATTRIB_VALUE_UNQUOTED:w++,ATTRIB_VALUE_ENTITY_Q:w++,ATTRIB_VALUE_ENTITY_U:w++,CLOSE_TAG:w++,CLOSE_TAG_SAW_WHITE:w++,SCRIPT:w++,SCRIPT_ENDING:w++};m.XML_ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'"};m.ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'",AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216, + Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167, + uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934, + Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240, + prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,"int":8747,there4:8756,sim:8764,cong:8773,asymp:8776, + ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830};Object.keys(m.ENTITIES).forEach(function(e){var y=m.ENTITIES[e];y="number"===typeof y?String.fromCharCode(y):y;m.ENTITIES[e]=y});for(var P in m.STATE)m.STATE[m.STATE[P]]=P;w=m.STATE;String.fromCodePoint||function(){var e=String.fromCharCode,y=Math.floor, + D=function(){var L=[],V=-1,Y=arguments.length;if(!Y)return"";for(var Z="";++Vca||1114111=ca)L.push(ca);else{ca-=65536;var fa=(ca>>10)+55296;ca=ca%1024+56320;L.push(fa,ca)}if(V+1===Y||16384=this.charLength-this.charReceived?this.charLength-this.charReceived:a.length;a.copy(this.charBuffer,this.charReceived,0,c);this.charReceived+=c;if(this.charReceived=t)this.charLength+=this.surrogateSize,c="";else{this.charReceived=this.charLength=0;if(0===a.length)return c;break}}this.detectIncompleteChar(a);var p=a.length;this.charLength&&(a.copy(this.charBuffer,0,a.length-this.charReceived,p),p-=this.charReceived);c+=a.toString(this.encoding,0,p);p=c.length-1;t=c.charCodeAt(p);return 55296<=t&&56319>=t?(t=this.surrogateSize, + this.charLength+=t,this.charReceived+=t,this.charBuffer.copy(this.charBuffer,t,0,t),a.copy(this.charBuffer,0,0,t),c.substring(0,p)):c};x.prototype.detectIncompleteChar=function(a){for(var c=3<=a.length?3:a.length;0>5){this.charLength=2;break}if(2>=c&&14==t>>4){this.charLength=3;break}if(3>=c&&30==t>>3){this.charLength=4;break}}this.charReceived=c};x.prototype.end=function(a){var c="";a&&a.length&&(c=this.write(a));this.charReceived&&(a=this.encoding,c+=this.charBuffer.slice(0, + this.charReceived).toString(a));return c}},{buffer:77}],153:[function(x,W,C){(function(){function n(e){return function(y,D,L,V){D=N(D,V,4);var Y=!I(y)&&f.keys(y),Z=(Y||y).length,ca=0arguments.length&&(L=y[Y?Y[ca]:ca],ca+=e);for(var fa=D,ha=L;0<=ca&&caL||null==D)return D;for(var V=1;VL&&(L=D)}else y=T(y,D),f.each(e,function(fa,ha,la){Y=y(fa,ha,la);if(Y>V||-Infinity===Y&&-Infinity===L)L=fa,V=Y});return L};f.min=function(e,y,D){var L=Infinity,V=Infinity,Y;if(null==y&& + null!=e){e=I(e)?e:f.values(e);for(var Z=0,ca=e.length;ZZ||void 0===Y)return 1;if(Y=D)throw Error("bindAll must be passed function names");for(y=1;y=la||la>y?(Z&&(clearTimeout(Z),Z=null),ca=ha,Y=e.apply(L,V),Z||(L=V=null)):Z||!1===D.trailing||(Z=setTimeout(fa,la));return Y}};f.debounce=function(e,y,D){var L,V,Y,Z,ca,fa=function(){var ha=f.now()-Z;ha--e)return y.apply(this,arguments)}};f.before=function(e,y){var D;return function(){0<--e&&(D=y.apply(this,arguments));1>=e&&(y=null);return D}};f.once=f.partial(f.before,2);var B=!{toString:null}.propertyIsEnumerable("toString"),H="valueOf isPrototypeOf toString propertyIsEnumerable hasOwnProperty toLocaleString".split(" "); + f.keys=function(e){if(!f.isObject(e))return[];if(U)return U(e);var y=[],D;for(D in e)f.has(e,D)&&y.push(D);B&&b(e,y);return y};f.allKeys=function(e){if(!f.isObject(e))return[];var y=[],D;for(D in e)y.push(D);B&&b(e,y);return y};f.values=function(e){for(var y=f.keys(e),D=y.length,L=Array(D),V=0;V":">",'"':""","'":"'","`":"`"};q=f.invert(K);G=function(e){var y=function(Y){return e[Y]},D="(?:"+f.keys(e).join("|")+")",L=RegExp(D),V=RegExp(D,"g");return function(Y){Y=null==Y?"":""+Y;return L.test(Y)?Y.replace(V,y):Y}};f.escape=G(K);f.unescape= + G(q);f.result=function(e,y,D){y=null==e?void 0:e[y];void 0===y&&(y=D);return f.isFunction(y)?y.call(e):y};var u=0;f.uniqueId=function(e){var y=++u+"";return e?e+y:y};f.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var d=/(.)^/,A={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},h=/\\|'|\r|\n|\u2028|\u2029/g,w=function(e){return"\\"+A[e]};f.template=function(e,y,D){!y&&D&&(y=D);y=f.defaults({},y,f.templateSettings);D=RegExp([(y.escape|| + d).source,(y.interpolate||d).source,(y.evaluate||d).source].join("|")+"|$","g");var L=0,V="__p+='";e.replace(D,function(Z,ca,fa,ha,la){V+=e.slice(L,la).replace(h,w);L=la+Z.length;ca?V+="'+\n((__t=("+ca+"))==null?'':_.escape(__t))+\n'":fa?V+="'+\n((__t=("+fa+"))==null?'':__t)+\n'":ha&&(V+="';\n"+ha+"\n__p+='");return Z});V+="';\n";y.variable||(V="with(obj||{}){\n"+V+"}\n");V="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+V+"return __p;\n";try{var Y=new Function(y.variable|| + "obj","_",V)}catch(Z){throw Z.source=V,Z;}D=function(Z){return Y.call(this,Z,f)};D.source="function("+(y.variable||"obj")+"){\n"+V+"}";return D};f.chain=function(e){e=f(e);e._chain=!0;return e};var P=function(e,y){return e._chain?f(y).chain():y};f.mixin=function(e){f.each(f.functions(e),function(y){var D=f[y]=e[y];f.prototype[y]=function(){var L=[this._wrapped];p.apply(L,arguments);return P(this,D.apply(f,L))}})};f.mixin(f);f.each("pop push reverse shift sort splice unshift".split(" "),function(e){var y= + c[e];f.prototype[e]=function(){var D=this._wrapped;y.apply(D,arguments);"shift"!==e&&"splice"!==e||0!==D.length||delete D[0];return P(this,D)}});f.each(["concat","join","slice"],function(e){var y=c[e];f.prototype[e]=function(){return P(this,y.apply(this._wrapped,arguments))}});f.prototype.value=function(){return this._wrapped};f.prototype.valueOf=f.prototype.toJSON=f.prototype.value;f.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],154:[function(x,W,C){(function(n){function m(g){try{if(!n.localStorage)return!1}catch(b){return!1}g= + n.localStorage[g];return null==g?!1:"true"===String(g).toLowerCase()}W.exports=function(g,b){if(m("noDeprecation"))return g;var l=!1;return function(){if(!l){if(m("throwDeprecation"))throw Error(b);m("traceDeprecation")?console.trace(b):console.warn(b);l=!0}return g.apply(this,arguments)}}}).call(this,"undefined"!==typeof global?global:"undefined"!==typeof self?self:"undefined"!==typeof window?window:{})},{}],155:[function(x,W,C){arguments[4][81][0].apply(C,arguments)},{dup:81}],156:[function(x,W, + C){W.exports=function(n){return n&&"object"===typeof n&&"function"===typeof n.copy&&"function"===typeof n.fill&&"function"===typeof n.readUInt8}},{}],157:[function(x,W,C){(function(n,m){function g(Q,B){var H={seen:[],stylize:l};3<=arguments.length&&(H.depth=arguments[2]);4<=arguments.length&&(H.colors=arguments[3]);U(B)?H.showHidden=B:B&&C._extend(H,B);M(H.showHidden)&&(H.showHidden=!1);M(H.depth)&&(H.depth=2);M(H.colors)&&(H.colors=!1);M(H.customInspect)&&(H.customInspect=!0);H.colors&&(H.stylize= + b);return c(H,Q,H.depth)}function b(Q,B){return(B=g.styles[B])?"\u001b["+g.colors[B][0]+"m"+Q+"\u001b["+g.colors[B][1]+"m":Q}function l(Q,B){return Q}function a(Q){var B={};Q.forEach(function(H,X){B[H]=!0});return B}function c(Q,B,H){if(Q.customInspect&&B&&F(B.inspect)&&B.inspect!==C.inspect&&(!B.constructor||B.constructor.prototype!==B)){var X=B.inspect(H,Q);z(X)||(X=c(Q,X,H));return X}if(X=t(Q,B))return X;var u=Object.keys(B),d=a(u);Q.showHidden&&(u=Object.getOwnPropertyNames(B));if(q(B)&&(0<=u.indexOf("message")|| + 0<=u.indexOf("description")))return p(B);if(0===u.length){if(F(B))return Q.stylize("[Function"+(B.name?": "+B.name:"")+"]","special");if(f(B))return Q.stylize(RegExp.prototype.toString.call(B),"regexp");if(T(B))return Q.stylize(Date.prototype.toString.call(B),"date");if(q(B))return p(B)}X="";var A=!1,h=["{","}"];K(B)&&(A=!0,h=["[","]"]);F(B)&&(X=" [Function"+(B.name?": "+B.name:"")+"]");f(B)&&(X=" "+RegExp.prototype.toString.call(B));T(B)&&(X=" "+Date.prototype.toUTCString.call(B));q(B)&&(X=" "+p(B)); + if(0===u.length&&(!A||0==B.length))return h[0]+X+h[1];if(0>H)return f(B)?Q.stylize(RegExp.prototype.toString.call(B),"regexp"):Q.stylize("[Object]","special");Q.seen.push(B);u=A?v(Q,B,H,d,u):u.map(function(w){return r(Q,B,H,d,w,A)});Q.seen.pop();return E(u,X,h)}function t(Q,B){if(M(B))return Q.stylize("undefined","undefined");if(z(B))return B="'"+JSON.stringify(B).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'",Q.stylize(B,"string");if(O(B))return Q.stylize(""+B,"number");if(U(B))return Q.stylize(""+ + B,"boolean");if(null===B)return Q.stylize("null","null")}function p(Q){return"["+Error.prototype.toString.call(Q)+"]"}function v(Q,B,H,X,u){for(var d=[],A=0,h=B.length;AQ.seen.indexOf(B.value)?(h=null===H?c(Q,B.value,null):c(Q,B.value,H-1),-1Q?"0"+Q.toString(10):Q.toString(10)}function k(){var Q=new Date,B=[G(Q.getHours()), + G(Q.getMinutes()),G(Q.getSeconds())].join(":");return[Q.getDate(),R[Q.getMonth()],B].join(" ")}var J=/%[sdj%]/g;C.format=function(Q){if(!z(Q)){for(var B=[],H=0;H=u)return A;switch(A){case "%s":return String(X[H++]);case "%d":return Number(X[H++]);case "%j":try{return JSON.stringify(X[H++])}catch(h){return"[Circular]"}default:return A}});for(var d= + X[H];H":null!=(b=this.parent)&&b.name?"attribute: {"+m+"}, parent: <"+this.parent.name+">":"attribute: {"+m+"}":""};return n}()}).call(this)},{}],160:[function(x,W,C){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c){l.__super__.constructor.call(this, + a);if(null==c)throw Error("Missing CDATA text. "+this.debugInfo());this.text=this.stringify.cdata(c)}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).cdata(this)};return l}(g)}).call(this)},{"./XMLNode":171}],161:[function(x,W,C){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty; + var g=x("./XMLNode");W.exports=function(b){function l(a,c){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing comment text. "+this.debugInfo());this.text=this.stringify.comment(c)}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).comment(this)};return l}(g)}).call(this)},{"./XMLNode":171}],162:[function(x,W,C){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&& + (b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t,p,v,r){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing DTD element name. "+this.debugInfo());if(null==t)throw Error("Missing DTD attribute name. "+this.debugInfo(c));if(!p)throw Error("Missing DTD attribute type. "+this.debugInfo(c));if(!v)throw Error("Missing DTD attribute default. "+this.debugInfo(c));0!==v.indexOf("#")&& + (v="#"+v);if(!v.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/))throw Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. "+this.debugInfo(c));if(r&&!v.match(/^(#FIXED|#DEFAULT)$/))throw Error("Default value only applies to #FIXED or #DEFAULT. "+this.debugInfo(c));this.elementName=this.stringify.eleName(c);this.attributeName=this.stringify.attName(t);this.attributeType=this.stringify.dtdAttType(p);this.defaultValue=this.stringify.dtdAttDefault(r);this.defaultValueType= + v}n(l,b);l.prototype.toString=function(a){return this.options.writer.set(a).dtdAttList(this)};return l}(g)}).call(this)},{"./XMLNode":171}],163:[function(x,W,C){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing DTD element name. "+ + this.debugInfo());t||(t="(#PCDATA)");Array.isArray(t)&&(t="("+t.join(",")+")");this.name=this.stringify.eleName(c);this.value=this.stringify.dtdElementValue(t)}n(l,b);l.prototype.toString=function(a){return this.options.writer.set(a).dtdElement(this)};return l}(g)}).call(this)},{"./XMLNode":171}],164:[function(x,W,C){(function(){var n=function(l,a){function c(){this.constructor=l}for(var t in a)m.call(a,t)&&(l[t]=a[t]);c.prototype=a.prototype;l.prototype=new c;l.__super__=a.prototype;return l},m= + {}.hasOwnProperty;var g=x("./Utility").isObject;var b=x("./XMLNode");W.exports=function(l){function a(c,t,p,v){a.__super__.constructor.call(this,c);if(null==p)throw Error("Missing DTD entity name. "+this.debugInfo(p));if(null==v)throw Error("Missing DTD entity value. "+this.debugInfo(p));this.pe=!!t;this.name=this.stringify.eleName(p);if(g(v)){if(!v.pubID&&!v.sysID)throw Error("Public and/or system identifiers are required for an external entity. "+this.debugInfo(p));if(v.pubID&&!v.sysID)throw Error("System identifier is required for a public external entity. "+ + this.debugInfo(p));null!=v.pubID&&(this.pubID=this.stringify.dtdPubID(v.pubID));null!=v.sysID&&(this.sysID=this.stringify.dtdSysID(v.sysID));null!=v.nData&&(this.nData=this.stringify.dtdNData(v.nData));if(this.pe&&this.nData)throw Error("Notation declaration is not allowed in a parameter entity. "+this.debugInfo(p));}else this.value=this.stringify.dtdEntityValue(v)}n(a,l);a.prototype.toString=function(c){return this.options.writer.set(c).dtdEntity(this)};return a}(b)}).call(this)},{"./Utility":158, + "./XMLNode":171}],165:[function(x,W,C){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing DTD notation name. "+this.debugInfo(c));if(!t.pubID&&!t.sysID)throw Error("Public or system identifiers are required for an external entity. "+ + this.debugInfo(c));this.name=this.stringify.eleName(c);null!=t.pubID&&(this.pubID=this.stringify.dtdPubID(t.pubID));null!=t.sysID&&(this.sysID=this.stringify.dtdSysID(t.sysID))}n(l,b);l.prototype.toString=function(a){return this.options.writer.set(a).dtdNotation(this)};return l}(g)}).call(this)},{"./XMLNode":171}],166:[function(x,W,C){(function(){var n=function(l,a){function c(){this.constructor=l}for(var t in a)m.call(a,t)&&(l[t]=a[t]);c.prototype=a.prototype;l.prototype=new c;l.__super__=a.prototype; + return l},m={}.hasOwnProperty;var g=x("./Utility").isObject;var b=x("./XMLNode");W.exports=function(l){function a(c,t,p,v){a.__super__.constructor.call(this,c);g(t)&&(c=t,t=c.version,p=c.encoding,v=c.standalone);t||(t="1.0");this.version=this.stringify.xmlVersion(t);null!=p&&(this.encoding=this.stringify.xmlEncoding(p));null!=v&&(this.standalone=this.stringify.xmlStandalone(v))}n(a,l);a.prototype.toString=function(c){return this.options.writer.set(c).declaration(this)};return a}(b)}).call(this)}, + {"./Utility":158,"./XMLNode":171}],167:[function(x,W,C){(function(){var n=function(p,v){function r(){this.constructor=p}for(var E in v)m.call(v,E)&&(p[E]=v[E]);r.prototype=v.prototype;p.prototype=new r;p.__super__=v.prototype;return p},m={}.hasOwnProperty;var g=x("./Utility").isObject;var b=x("./XMLNode");var l=x("./XMLDTDAttList");var a=x("./XMLDTDEntity");var c=x("./XMLDTDElement");var t=x("./XMLDTDNotation");W.exports=function(p){function v(r,E,K){v.__super__.constructor.call(this,r);this.name= + "!DOCTYPE";this.documentObject=r;g(E)&&(K=E,E=K.pubID,K=K.sysID);null==K&&(E=[E,K],K=E[0],E=E[1]);null!=E&&(this.pubID=this.stringify.dtdPubID(E));null!=K&&(this.sysID=this.stringify.dtdSysID(K))}n(v,p);v.prototype.element=function(r,E){r=new c(this,r,E);this.children.push(r);return this};v.prototype.attList=function(r,E,K,U,O){r=new l(this,r,E,K,U,O);this.children.push(r);return this};v.prototype.entity=function(r,E){r=new a(this,!1,r,E);this.children.push(r);return this};v.prototype.pEntity=function(r, + E){r=new a(this,!0,r,E);this.children.push(r);return this};v.prototype.notation=function(r,E){r=new t(this,r,E);this.children.push(r);return this};v.prototype.toString=function(r){return this.options.writer.set(r).docType(this)};v.prototype.ele=function(r,E){return this.element(r,E)};v.prototype.att=function(r,E,K,U,O){return this.attList(r,E,K,U,O)};v.prototype.ent=function(r,E){return this.entity(r,E)};v.prototype.pent=function(r,E){return this.pEntity(r,E)};v.prototype.not=function(r,E){return this.notation(r, + E)};v.prototype.up=function(){return this.root()||this.documentObject};return v}(b)}).call(this)},{"./Utility":158,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLNode":171}],168:[function(x,W,C){(function(){var n=function(c,t){function p(){this.constructor=c}for(var v in t)m.call(t,v)&&(c[v]=t[v]);p.prototype=t.prototype;c.prototype=new p;c.__super__=t.prototype;return c},m={}.hasOwnProperty;var g=x("./Utility").isPlainObject;var b=x("./XMLNode");var l= + x("./XMLStringifier");var a=x("./XMLStringWriter");W.exports=function(c){function t(p){t.__super__.constructor.call(this,null);this.name="?xml";p||(p={});p.writer||(p.writer=new a);this.options=p;this.stringify=new l(p);this.isDocument=!0}n(t,c);t.prototype.end=function(p){p?g(p)&&(p=this.options.writer.set(p)):p=this.options.writer;return p.document(this)};t.prototype.toString=function(p){return this.options.writer.set(p).document(this)};return t}(b)}).call(this)},{"./Utility":158,"./XMLNode":171, + "./XMLStringWriter":175,"./XMLStringifier":176}],169:[function(x,W,C){(function(){var n={}.hasOwnProperty;var m=x("./Utility");var g=m.isObject;var b=m.isFunction;var l=m.isPlainObject;var a=m.getValue;var c=x("./XMLElement");var t=x("./XMLCData");var p=x("./XMLComment");var v=x("./XMLRaw");var r=x("./XMLText");var E=x("./XMLProcessingInstruction");var K=x("./XMLDeclaration");var U=x("./XMLDocType");var O=x("./XMLDTDAttList");var z=x("./XMLDTDEntity");var M=x("./XMLDTDElement");var f=x("./XMLDTDNotation"); + var N=x("./XMLAttribute");var T=x("./XMLStringifier");var q=x("./XMLStringWriter");W.exports=function(){function F(G,k,J){this.name="?xml";G||(G={});if(!G.writer)G.writer=new q(G);else if(l(G.writer)){var I=G.writer;G.writer=new q(I)}this.options=G;this.writer=G.writer;this.stringify=new T(G);this.onDataCallback=k||function(){};this.onEndCallback=J||function(){};this.currentNode=null;this.currentLevel=-1;this.openTags={};this.documentCompleted=this.documentStarted=!1;this.root=null}F.prototype.node= + function(G,k,J){if(null==G)throw Error("Missing node name.");if(this.root&&-1===this.currentLevel)throw Error("Document can only have one root node. "+this.debugInfo(G));this.openCurrent();G=a(G);null==k&&(k={});k=a(k);g(k)||(k=[k,J],J=k[0],k=k[1]);this.currentNode=new c(this,G,k);this.currentNode.children=!1;this.currentLevel++;this.openTags[this.currentLevel]=this.currentNode;null!=J&&this.text(J);return this};F.prototype.element=function(G,k,J){return this.currentNode&&this.currentNode instanceof + U?this.dtdElement.apply(this,arguments):this.node(G,k,J)};F.prototype.attribute=function(G,k){var J;if(!this.currentNode||this.currentNode.children)throw Error("att() can only be used immediately after an ele() call in callback mode. "+this.debugInfo(G));null!=G&&(G=a(G));if(g(G))for(J in G)n.call(G,J)&&(k=G[J],this.attribute(J,k));else b(k)&&(k=k.apply()),this.options.skipNullAttributes&&null==k||(this.currentNode.attributes[G]=new N(this,G,k));return this};F.prototype.text=function(G){this.openCurrent(); + G=new r(this,G);this.onData(this.writer.text(G,this.currentLevel+1),this.currentLevel+1);return this};F.prototype.cdata=function(G){this.openCurrent();G=new t(this,G);this.onData(this.writer.cdata(G,this.currentLevel+1),this.currentLevel+1);return this};F.prototype.comment=function(G){this.openCurrent();G=new p(this,G);this.onData(this.writer.comment(G,this.currentLevel+1),this.currentLevel+1);return this};F.prototype.raw=function(G){this.openCurrent();G=new v(this,G);this.onData(this.writer.raw(G, + this.currentLevel+1),this.currentLevel+1);return this};F.prototype.instruction=function(G,k){var J;this.openCurrent();null!=G&&(G=a(G));null!=k&&(k=a(k));if(Array.isArray(G))for(k=0,J=G.length;kthis.currentLevel)throw Error("The document node has no parent.");this.currentNode?(this.currentNode.children? + this.closeNode(this.currentNode):this.openNode(this.currentNode),this.currentNode=null):this.closeNode(this.openTags[this.currentLevel]);delete this.openTags[this.currentLevel];this.currentLevel--;return this};F.prototype.end=function(){for(;0<=this.currentLevel;)this.up();return this.onEnd()};F.prototype.openCurrent=function(){if(this.currentNode)return this.currentNode.children=!0,this.openNode(this.currentNode)};F.prototype.openNode=function(G){if(!G.isOpen)return!this.root&&0===this.currentLevel&& + G instanceof c&&(this.root=G),this.onData(this.writer.openNode(G,this.currentLevel),this.currentLevel),G.isOpen=!0};F.prototype.closeNode=function(G){if(!G.isClosed)return this.onData(this.writer.closeNode(G,this.currentLevel),this.currentLevel),G.isClosed=!0};F.prototype.onData=function(G,k){this.documentStarted=!0;return this.onDataCallback(G,k+1)};F.prototype.onEnd=function(){this.documentCompleted=!0;return this.onEndCallback()};F.prototype.debugInfo=function(G){return null==G?"":"node: <"+G+ + ">"};F.prototype.ele=function(){return this.element.apply(this,arguments)};F.prototype.nod=function(G,k,J){return this.node(G,k,J)};F.prototype.txt=function(G){return this.text(G)};F.prototype.dat=function(G){return this.cdata(G)};F.prototype.com=function(G){return this.comment(G)};F.prototype.ins=function(G,k){return this.instruction(G,k)};F.prototype.dec=function(G,k,J){return this.declaration(G,k,J)};F.prototype.dtd=function(G,k,J){return this.doctype(G,k,J)};F.prototype.e=function(G,k,J){return this.element(G, + k,J)};F.prototype.n=function(G,k,J){return this.node(G,k,J)};F.prototype.t=function(G){return this.text(G)};F.prototype.d=function(G){return this.cdata(G)};F.prototype.c=function(G){return this.comment(G)};F.prototype.r=function(G){return this.raw(G)};F.prototype.i=function(G,k){return this.instruction(G,k)};F.prototype.att=function(){return this.currentNode&&this.currentNode instanceof U?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)};F.prototype.a=function(){return this.currentNode&& + this.currentNode instanceof U?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)};F.prototype.ent=function(G,k){return this.entity(G,k)};F.prototype.pent=function(G,k){return this.pEntity(G,k)};F.prototype.not=function(G,k){return this.notation(G,k)};return F}()}).call(this)},{"./Utility":158,"./XMLAttribute":159,"./XMLCData":160,"./XMLComment":161,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLDeclaration":166,"./XMLDocType":167, + "./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLStringWriter":175,"./XMLStringifier":176,"./XMLText":177}],170:[function(x,W,C){(function(){var n=function(t,p){function v(){this.constructor=t}for(var r in p)m.call(p,r)&&(t[r]=p[r]);v.prototype=p.prototype;t.prototype=new v;t.__super__=p.prototype;return t},m={}.hasOwnProperty;var g=x("./Utility");var b=g.isObject;var l=g.isFunction;var a=g.getValue;g=x("./XMLNode");var c=x("./XMLAttribute");W.exports=function(t){function p(v, + r,E){p.__super__.constructor.call(this,v);if(null==r)throw Error("Missing element name. "+this.debugInfo());this.name=this.stringify.eleName(r);this.attributes={};null!=E&&this.attribute(E);v.isDocument&&(this.isRoot=!0,this.documentObject=v,v.rootObject=this)}n(p,t);p.prototype.clone=function(){var v;var r=Object.create(this);r.isRoot&&(r.documentObject=null);r.attributes={};var E=this.attributes;for(v in E)if(m.call(E,v)){var K=E[v];r.attributes[v]=K.clone()}r.children=[];this.children.forEach(function(U){U= + U.clone();U.parent=r;return r.children.push(U)});return r};p.prototype.attribute=function(v,r){var E;null!=v&&(v=a(v));if(b(v))for(E in v)m.call(v,E)&&(r=v[E],this.attribute(E,r));else l(r)&&(r=r.apply()),this.options.skipNullAttributes&&null==r||(this.attributes[v]=new c(this,v,r));return this};p.prototype.removeAttribute=function(v){var r;if(null==v)throw Error("Missing attribute name. "+this.debugInfo());v=a(v);if(Array.isArray(v)){var E=0;for(r=v.length;Ez)throw Error("Already at the first node. "+this.debugInfo());return this.parent.children[z-1]};O.prototype.next=function(){var z=this.parent.children.indexOf(this); + if(-1===z||z===this.parent.children.length-1)throw Error("Already at the last node. "+this.debugInfo());return this.parent.children[z+1]};O.prototype.importDocument=function(z){z=z.root().clone();z.parent=this;z.isRoot=!1;this.children.push(z);return this};O.prototype.debugInfo=function(z){var M,f;z=z||this.name;return null!=z||null!=(M=this.parent)&&M.name?null==z?"parent: <"+this.parent.name+">":null!=(f=this.parent)&&f.name?"node: <"+z+">, parent: <"+this.parent.name+">":"node: <"+z+">":""};O.prototype.ele= + function(z,M,f){return this.element(z,M,f)};O.prototype.nod=function(z,M,f){return this.node(z,M,f)};O.prototype.txt=function(z){return this.text(z)};O.prototype.dat=function(z){return this.cdata(z)};O.prototype.com=function(z){return this.comment(z)};O.prototype.ins=function(z,M){return this.instruction(z,M)};O.prototype.doc=function(){return this.document()};O.prototype.dec=function(z,M,f){return this.declaration(z,M,f)};O.prototype.dtd=function(z,M){return this.doctype(z,M)};O.prototype.e=function(z, + M,f){return this.element(z,M,f)};O.prototype.n=function(z,M,f){return this.node(z,M,f)};O.prototype.t=function(z){return this.text(z)};O.prototype.d=function(z){return this.cdata(z)};O.prototype.c=function(z){return this.comment(z)};O.prototype.r=function(z){return this.raw(z)};O.prototype.i=function(z,M){return this.instruction(z,M)};O.prototype.u=function(){return this.up()};O.prototype.importXMLBuilder=function(z){return this.importDocument(z)};return O}()}).call(this)},{"./Utility":158,"./XMLCData":160, + "./XMLComment":161,"./XMLDeclaration":166,"./XMLDocType":167,"./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLText":177}],172:[function(x,W,C){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b},m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c,t){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing instruction target. "+ + this.debugInfo());this.target=this.stringify.insTarget(c);t&&(this.value=this.stringify.insValue(t))}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).processingInstruction(this)};return l}(g)}).call(this)},{"./XMLNode":171}],173:[function(x,W,C){(function(){var n=function(b,l){function a(){this.constructor=b}for(var c in l)m.call(l,c)&&(b[c]=l[c]);a.prototype=l.prototype;b.prototype=new a;b.__super__=l.prototype;return b}, + m={}.hasOwnProperty;var g=x("./XMLNode");W.exports=function(b){function l(a,c){l.__super__.constructor.call(this,a);if(null==c)throw Error("Missing raw text. "+this.debugInfo());this.value=this.stringify.raw(c)}n(l,b);l.prototype.clone=function(){return Object.create(this)};l.prototype.toString=function(a){return this.options.writer.set(a).raw(this)};return l}(g)}).call(this)},{"./XMLNode":171}],174:[function(x,W,C){(function(){var n=function(z,M){function f(){this.constructor=z}for(var N in M)m.call(M, + N)&&(z[N]=M[N]);f.prototype=M.prototype;z.prototype=new f;z.__super__=M.prototype;return z},m={}.hasOwnProperty;var g=x("./XMLDeclaration");var b=x("./XMLDocType");var l=x("./XMLCData");var a=x("./XMLComment");var c=x("./XMLElement");var t=x("./XMLRaw");var p=x("./XMLText");var v=x("./XMLProcessingInstruction");var r=x("./XMLDTDAttList");var E=x("./XMLDTDElement");var K=x("./XMLDTDEntity");var U=x("./XMLDTDNotation");var O=x("./XMLWriterBase");W.exports=function(z){function M(f,N){M.__super__.constructor.call(this, + N);this.stream=f}n(M,z);M.prototype.document=function(f){var N;var T=f.children;var q=0;for(N=T.length;q");return this.stream.write(this.endline(f))};M.prototype.docType=function(f,N){var T;N||(N=0);this.stream.write(this.space(N));this.stream.write("");return this.stream.write(this.endline(f))};M.prototype.element=function(f,N){N||(N=0);var T=this.space(N);this.stream.write(T+"<"+f.name);var q=f.attributes;for(k in q)if(m.call(q,k)){var F=q[k];this.attribute(F)}if(0===f.children.length||f.children.every(function(J){return""===J.value}))this.allowEmpty?this.stream.write(">"):this.stream.write(this.spacebeforeslash+"/>");else if(this.pretty&&1===f.children.length&& + null!=f.children[0].value)this.stream.write(">"),this.stream.write(f.children[0].value),this.stream.write("");else{this.stream.write(">"+this.newline);var G=f.children;var k=0;for(q=G.length;k")}return this.stream.write(this.endline(f))};M.prototype.processingInstruction=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.raw=function(f,N){return this.stream.write(this.space(N)+f.value+this.endline(f))};M.prototype.text=function(f,N){return this.stream.write(this.space(N)+ + f.value+this.endline(f))};M.prototype.dtdAttList=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.dtdElement=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.dtdEntity=function(f,N){this.stream.write(this.space(N)+""+this.endline(f))};M.prototype.dtdNotation=function(f,N){this.stream.write(this.space(N)+ + ""+this.endline(f))};M.prototype.endline=function(f){return f.isLastRootNode?"":this.newline};return M}(O)}).call(this)},{"./XMLCData":160,"./XMLComment":161,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLDeclaration":166, + "./XMLDocType":167,"./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLText":177,"./XMLWriterBase":178}],175:[function(x,W,C){(function(){var n=function(z,M){function f(){this.constructor=z}for(var N in M)m.call(M,N)&&(z[N]=M[N]);f.prototype=M.prototype;z.prototype=new f;z.__super__=M.prototype;return z},m={}.hasOwnProperty;var g=x("./XMLDeclaration");var b=x("./XMLDocType");var l=x("./XMLCData");var a=x("./XMLComment");var c=x("./XMLElement");var t=x("./XMLRaw");var p=x("./XMLText"); + var v=x("./XMLProcessingInstruction");var r=x("./XMLDTDAttList");var E=x("./XMLDTDElement");var K=x("./XMLDTDEntity");var U=x("./XMLDTDNotation");var O=x("./XMLWriterBase");W.exports=function(z){function M(f){M.__super__.constructor.call(this,f)}n(M,z);M.prototype.document=function(f){var N;this.textispresent=!1;var T="";var q=f.children;f=0;for(N=q.length;f";return N+=this.newline};M.prototype.docType=function(f,N){var T;N||(N=0);var q=this.space(N);q+="";return q+=this.newline};M.prototype.element=function(f,N){var T;N||(N=0);var q=!1;this.textispresent?(this.newline="",this.pretty=!1):(this.newline=this.newlinedefault,this.pretty=this.prettydefault);var F=this.space(N);var G=F+"<"+f.name;var k=f.attributes;for(T in k)if(m.call(k,T)){var J=k[T];G+=this.attribute(J)}if(0===f.children.length||f.children.every(function(S){return""===S.value}))G=this.allowEmpty?G+(">"+this.newline):G+(this.spacebeforeslash+"/>"+ + this.newline);else if(this.pretty&&1===f.children.length&&null!=f.children[0].value)G=G+">"+f.children[0].value,G+=""+this.newline;else{if(this.dontprettytextnodes)for(k=f.children,J=0,T=k.length;J"+this.newline;k=f.children;J=0;for(T=k.length;J"+this.newline}return G};M.prototype.processingInstruction= + function(f,N){N=this.space(N)+""+this.newline};M.prototype.raw=function(f,N){return this.space(N)+f.value+this.newline};M.prototype.text=function(f,N){return this.space(N)+f.value+this.newline};M.prototype.dtdAttList=function(f,N){N=this.space(N)+""+this.newline};M.prototype.dtdElement=function(f,N){return this.space(N)+""+this.newline};M.prototype.dtdEntity=function(f,N){N=this.space(N)+""+this.newline};M.prototype.dtdNotation=function(f, + N){N=this.space(N)+""+this.newline};M.prototype.openNode=function(f,N){var T;N||(N=0);if(f instanceof c){var q=this.space(N)+"<"+f.name;var F=f.attributes;for(T in F)m.call(F,T)&&(N=F[T],q+=this.attribute(N));q+=(f.children?">":"/>")+this.newline}else q=this.space(N)+"")+this.newline;return q};M.prototype.closeNode=function(f,N){N||(N=0);switch(!1){case !(f instanceof c):return this.space(N)+""+this.newline;case !(f instanceof b):return this.space(N)+"]>"+this.newline}};return M}(O)}).call(this)},{"./XMLCData":160,"./XMLComment":161,"./XMLDTDAttList":162,"./XMLDTDElement":163,"./XMLDTDEntity":164,"./XMLDTDNotation":165,"./XMLDeclaration":166,"./XMLDocType":167, + "./XMLElement":170,"./XMLProcessingInstruction":172,"./XMLRaw":173,"./XMLText":177,"./XMLWriterBase":178}],176:[function(x,W,C){(function(){var n=function(g,b){return function(){return g.apply(b,arguments)}},m={}.hasOwnProperty;W.exports=function(){function g(b){this.assertLegalChar=n(this.assertLegalChar,this);var l;b||(b={});this.noDoubleEncoding=b.noDoubleEncoding;b=b.stringify||{};for(l in b)if(m.call(b,l)){var a=b[l];this[l]=a}}g.prototype.eleName=function(b){return this.assertLegalChar(""+b|| + "")};g.prototype.eleText=function(b){return this.assertLegalChar(this.elEscape(""+b||""))};g.prototype.cdata=function(b){b=(""+b||"").replace("]]\x3e","]]]]\x3e");return this.assertLegalChar(b)};g.prototype.comment=function(b){b=""+b||"";if(b.match(/--/))throw Error("Comment text cannot contain double-hypen: "+b);return this.assertLegalChar(b)};g.prototype.raw=function(b){return""+b||""};g.prototype.attName=function(b){return""+b||""};g.prototype.attValue=function(b){return this.attEscape(""+ + b||"")};g.prototype.insTarget=function(b){return""+b||""};g.prototype.insValue=function(b){b=""+b||"";if(b.match(/\?>/))throw Error("Invalid processing instruction value: "+b);return b};g.prototype.xmlVersion=function(b){b=""+b||"";if(!b.match(/1\.[0-9]+/))throw Error("Invalid version number: "+b);return b};g.prototype.xmlEncoding=function(b){b=""+b||"";if(!b.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/))throw Error("Invalid encoding: "+b);return b};g.prototype.xmlStandalone=function(b){return b?"yes":"no"}; + g.prototype.dtdPubID=function(b){return""+b||""};g.prototype.dtdSysID=function(b){return""+b||""};g.prototype.dtdElementValue=function(b){return""+b||""};g.prototype.dtdAttType=function(b){return""+b||""};g.prototype.dtdAttDefault=function(b){return null!=b?""+b||"":b};g.prototype.dtdEntityValue=function(b){return""+b||""};g.prototype.dtdNData=function(b){return""+b||""};g.prototype.convertAttKey="@";g.prototype.convertPIKey="?";g.prototype.convertTextKey="#text";g.prototype.convertCDataKey="#cdata"; + g.prototype.convertCommentKey="#comment";g.prototype.convertRawKey="#raw";g.prototype.assertLegalChar=function(b){var l;if(l=b.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/))throw Error("Invalid character in string: "+b+" at index "+l.index);return b};g.prototype.elEscape=function(b){return b.replace(this.noDoubleEncoding?/(?!&\S+;)&/g:/&/g,"&").replace(//g,">").replace(/\r/g," ")};g.prototype.attEscape=function(b){return b.replace(this.noDoubleEncoding? + /(?!&\S+;)&/g:/&/g,"&").replace(/'); + c.ui.registry.addButton("importword",{icon:"importword",tooltip:"\u5bfc\u5165Word",onAction:function(){u()}});return{getMetadata:function(){return{name:"\u5bfc\u5165Word",url:"https://github.com/Five-great/tinymce-plugins"}}}}); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/insertdatetime/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 000000000..5f11c3796 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function l(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))}function s(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])}function r(e,t){if((e=""+e).length'+n+"")):e.insertContent(d(e,t))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),i="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),o="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),u="January February March April May June July August September October November December".split(" "),g=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("insertdatetime",function(e){var n,r,t,a,i,o,u,c;function m(e){return r.execCommand("mceInsertDate",!1,e)}(n=e).addCommand("mceInsertDate",function(e,t){p(n,null!=t?t:n.getParam("insertdatetime_dateformat",n.translate("%Y-%m-%d")))}),n.addCommand("mceInsertTime",function(e,t){p(n,null!=t?t:l(n))}),u=s(r=e),t=0<(o=s(i=r)).length?o[0]:l(i),a=t,c={get:function(){return a},set:function(e){a=e}},r.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:function(e){return e===c.get()},fetch:function(e){e(g.map(u,function(e){return{type:"choiceitem",text:d(r,e),value:e}}))},onAction:function(e){m(c.get())},onItemAction:function(e,t){c.set(t),m(t)}}),r.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:function(){return g.map(u,function(e){return{type:"menuitem",text:d(r,e),onAction:(t=e,function(){c.set(t),m(t)})};var t})}})})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/legacyoutput/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/legacyoutput/plugin.min.js new file mode 100644 index 000000000..bfab85e25 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/legacyoutput/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("legacyoutput",function(e){var s,t;(t=s=e).settings.inline_styles=!1,t.getParam("fontsize_formats")||(t.settings.fontsize_formats="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7"),t.getParam("font_formats")||(t.settings.font_formats="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats"),s.on("PreInit",function(){var e=s,t="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table",i=l.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),a=e.schema;e.formatter.register({alignleft:{selector:t,attributes:{align:"left"}},aligncenter:{selector:t,attributes:{align:"center"}},alignright:{selector:t,attributes:{align:"right"}},alignjustify:{selector:t,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all",preserve_attributes:["class","style"]},{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all",preserve_attributes:["class","style"]},{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",toggle:!1,attributes:{face:"%value"}},fontsize:{inline:"font",toggle:!1,attributes:{size:function(e){return String(l.inArray(i,e.value)+1)}}},forecolor:{inline:"font",attributes:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0}}),l.each("b,i,u,strike".split(","),function(e){a.addValidElements(e+"[*]")}),a.getElementRule("font")||a.addValidElements("font[face|size|color|style]"),l.each(t.split(","),function(e){var t=a.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})})})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/link/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/link/plugin.min.js new file mode 100644 index 000000000..024c63591 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function t(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}}function n(n){return function(t){return typeof t===n}}function h(){}function i(t){return function(){return t}}function e(t){return t}function r(t,n){return t===n}function o(){return v}var u,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.VK"),l=t("string"),d=t("array"),p=function(t){return u===t},f=n("boolean"),s=n("function"),m=i(!1),g=i(!(u=null)),v={fold:function(t,n){return t()},isSome:m,isNone:g,getOr:e,getOrThunk:y,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:y,map:o,each:h,bind:o,exists:m,forall:g,filter:function(){return v},toArray:function(){return[]},toString:i("none()")};function y(t){return t()}function k(t,o,i){return function(t){for(var n,e=0,r=t.length;e=e.childNodes.length?n.data.length:0}:n.previousSibling&&Me(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&Me(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}}function We(e){var t=e.cloneRange(),n=Ve(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);var r=Ve(e.endContainer,e.endOffset);return t.setEnd(r.container,r.offset),t}function Qe(e,t){var n=t||e.selection.getStart(!0);return e.dom.getParent(n,"OL,UL,DL",qt(e,n))}function Xe(e){var t,n,r=e.selection.getSelectedBlocks();return L((t=e,n=Mt.map(r,function(e){return t.dom.getParent(e,"li,dd,dt",qt(t,e))||e}),Xt.unique(n)),Ft)}function qe(e,t){return w(e.dom.getParents(t,"ol,ul",qt(e,t)))}function ze(e,t,n){return void 0===n&&(n=r),e.exists(function(e){return n(e,t)})}function Ye(e,t,n){return e.isSome()&&t.isSome()?E.some(n(e.getOrDie(),t.getOrDie())):E.none()}function Ze(e,t,n){return e.fire("ListMutation",{action:t,element:n})}function Ge(e,t){we(e.item,t.list)}function Je(e,t){for(var n=0;ne.length?tt:et)(r,e,t)},[])).map(function(e){return e.list}).toArray()}function ft(e,t){b(L(e,it),function(e){return function(e){switch(t){case"Indent":e.depth++;break;case"Outdent":e.depth--;break;case"Flatten":e.depth=0}e.dirty=!0}(e),0})}function dt(e,t){var n,r,o,i,a,s,u,c,f,d,l,m,p,g=C((i=qe(o=r=e,o.selection.getStart()),a=L(o.selection.getSelectedBlocks(),_t),s=i.toArray().concat(a),zt(r,s)),me.fromDom),v=C(L(Xe(e),Ht),me.fromDom),h=!1;return(g.length||v.length)&&(n=e.selection.getBookmark(),c=t,b((f=g,p=C(Xe(u=e),me.fromDom),d=Ye(N(p,y(rt)),N(D(p),y(rt)),function(e,t){return{start:e,end:t}}),l=!1,m={get:function(){return l},set:function(e){l=e}},C(f,function(e){return{sourceList:e,entries:Yt(0,d,m,e)}})),function(e){ft(e.entries,c);var t,n,r=(t=u,T(function(e,t){if(0===e.length)return[];for(var n=t(e[0]),r=[],o=[],i=0,a=e.length;i"):"application/x-shockwave-flash"===n.sourcemime?(u='',n.poster&&(u+=''),u+""):-1!==n.sourcemime.indexOf("audio")?(s=n,m?m(s):'"):"script"===n.type?' + + diff --git a/jun_pc_web/assets/module/tinymce/plugins/visualblocks/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/visualblocks/plugin.min.js new file mode 100644 index 000000000..18bf7795d --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/visualblocks/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function f(t,o,e){var n,i;t.dom.toggleClass(t.getBody(),"mce-visualblocks"),e.set(!e.get()),n=t,i=e.get(),n.fire("VisualBlocks",{state:i})}function g(e,n){return function(o){function t(t){return o.setActive(t.state)}return o.setActive(n.get()),e.on("VisualBlocks",t),function(){return e.off("VisualBlocks",t)}}}tinymce.util.Tools.resolve("tinymce.PluginManager").add("visualblocks",function(t,o){var e,n,i,s,c,u,l,a=(e=!1,{get:function(){return e},set:function(t){e=t}});function r(){return s.execCommand("mceVisualBlocks")}i=a,(n=t).addCommand("mceVisualBlocks",function(){f(n,0,i)}),(s=t).ui.registry.addToggleButton("visualblocks",{icon:"visualblocks",tooltip:"Show blocks",onAction:r,onSetup:g(s,c=a)}),s.ui.registry.addToggleMenuItem("visualblocks",{text:"Show blocks",icon:"visualblocks",onAction:r,onSetup:g(s,c)}),l=a,(u=t).on("PreviewFormats AfterPreviewFormats",function(t){l.get()&&u.dom.toggleClass(u.getBody(),"mce-visualblocks","afterpreviewformats"===t.type)}),u.on("init",function(){u.getParam("visualblocks_default_state",!1,"boolean")&&f(u,0,l)})})}(); \ No newline at end of file diff --git a/jun_pc_web/assets/module/tinymce/plugins/visualchars/plugin.min.js b/jun_pc_web/assets/module/tinymce/plugins/visualchars/plugin.min.js new file mode 100644 index 000000000..caa10ab2c --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/plugins/visualchars/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function n(t){return function(n){return typeof n===t}}function i(n){return function(){return n}}function t(n){return n}function e(){return l}var o,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(n){return e=typeof(t=n),(null===t?"null":"object"==e&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":e)===o;var t,e},c=n("boolean"),a=n("number"),s=i(!(o="string")),f=i(!0),l={fold:function(n,t){return n()},isSome:s,isNone:f,getOr:t,getOrThunk:d,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:d,map:e,each:function(){},bind:e,exists:s,forall:f,filter:function(){return l},toArray:function(){return[]},toString:i("none()")};function d(n){return n()}function m(n,t){for(var e=0,o=n.length;e'+n+"
    "}function O(n){var t=p(n);return j(n)&&void 0!==t&&_.test(t)}function C(n){return"span"===n.nodeName.toLowerCase()&&n.classList.contains("mce-nbsp-wrap")}function S(f,n){m(K(M.fromDom(n),O),function(n){var t,e,o,r,i,u=n.dom.parentNode;if(C(u))t=M.fromDom(u),e=U,T(t)?t.dom.classList.add(e):(r=e,i=w(o=t,"class").concat([r]),y(o,"class",i.join(" ")));else{for(var c,a=f.dom.encode(p(n)).replace(F,A),s=f.dom.create("div",null,a);c=s.lastChild;)f.dom.insertAfter(c,n.dom);f.dom.remove(n.dom)}})}function D(r,n){m(r.dom.select(I,n),function(n){var t,e,o;C(n)?(t=M.fromDom(n),e=U,T(t)?t.dom.classList.remove(e):k(t,e),0===(T(o=t)?o.dom.classList:w(o,"class")).length&&b(o,"class")):r.dom.remove(n,!0)})}function E(n){var t=n.getBody(),e=n.selection.getBookmark(),o=function(n,t){for(;n.parentNode;){if(n.parentNode===t)return n;n=n.parentNode}}(n.selection.getNode(),t);D(n,o=void 0!==o?o:t),S(n,o),n.selection.moveToBookmark(e)}function L(n,t){var e=n,o=t.get();e.fire("VisualChars",{state:o});var r=n.getBody();(!0===t.get()?S:D)(n,r)}function x(n,t){n.addCommand("mceVisualChars",function(){!function(n,t){t.set(!t.get());var e=n.selection.getBookmark();L(n,t),n.selection.moveToBookmark(e)}(n,t)})}function B(e,o){return function(t){function n(n){return t.setActive(n.state)}return t.setActive(o.get()),e.on("VisualChars",n),function(){return e.off("VisualChars",n)}}}"undefined"!=typeof window||Function("return this;")();function P(n){if(null==n)throw new Error("Node cannot be null or undefined");return{dom:n}}var V,j=function(n){return 3===n.dom.nodeType},M={fromHtml:function(n,t){var e=(t||document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1t.length-1&&0!==e||0===n&&0===r)){var o=t[e+2];if(0!==n||2!==r&&1!==r&&12!==r||0!==o){var u=t[e-1];return(2!==n&&1!==n&&12!==r||0!==r||0!==u)&&(4!==n&&0!==n||4!==r&&0!==r)&&(3!==n&&1!==n||4!==r||4!==u)&&(4!==n||3!==r&&1!==r||4!==o)&&8!==n&&9!==n&&8!==u&&9!==u&&8!==r&&9!==r&&(5!==n||6!==r)&&(7===n||5===n||6===n||7===r||5===r||6===r||(10!==n||10!==r)&&(11!==r||0!==n&&4!==n&&10!==n&&11!==n)&&(11!==n||0!==r&&4!==r&&10!==r)&&12!==n)}}}(n,f)&&(o=e[f],!r.includeWhitespace&&W.test(o)||!r.includePunctuation&&E.test(o)||(u=f-h.length+1,"http"!==(i=e.slice(u,c=f+1).join(""))&&"https"!==i||(d=f,l=void 0,l=function(t){for(var e=d+1;e]"),new RegExp("@")],u=new RegExp("^[!-#%-*,-\\/:;?@\\[-\\]_{}\xa1\xab\xb7\xbb\xbf;\xb7\u055a-\u055f\u0589\u058a\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1361-\u1368\u1400\u166d\u166e\u169b\u169c\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cd3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205e\u207d\u207e\u208d\u208e\u3008\u3009\u2768-\u2775\u27c5\u27c6\u27e6-\u27ef\u2983-\u2998\u29d8-\u29db\u29fc\u29fd\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e2e\u2e30\u2e31\u3001-\u3003\u3008-\u3011\u3014-\u301f\u3030\u303d\u30a0\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uabeb\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe61\ufe63\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff0a\uff0c-\uff0f\uff1a\uff1b\uff1f\uff20\uff3b-\uff3d\uff3f\uff5b\uff5d\uff5f-\uff65]$"),c=e,i=13,W=/^\s+$/,E=u,a=function(t,e,n){n=m(m({},{includeWhitespace:!1,includePunctuation:!1}),n);for(var r=[],o=[],u=0;uli:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/content.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/content.min.css new file mode 100644 index 000000000..e27b8a020 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/content.mobile.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/content.mobile.min.css new file mode 100644 index 000000000..35f7dc08b --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/content.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff new file mode 100644 index 000000000..1e3be038a Binary files /dev/null and b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff differ diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.min.css new file mode 100644 index 000000000..e71f6f010 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox{box-shadow:none;box-sizing:content-box;color:#2a3746;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #000;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #000;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #000;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#000;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.5);border-color:#207ab7;color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:#3d546f;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:#2b3b4e;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#1a1a1a;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#333;color:#fff;cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#fff;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#4a5562;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(255,255,255,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid #1a1a1a;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #000}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #000}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#4a5562}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(42,55,70,.15),0 0 40px 1px rgba(42,55,70,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:1px solid #000;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #000}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #000;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #000}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(42,55,70,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#000;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #000}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#fff}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fff}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#fff}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#fff;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#000 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #000 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #000 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #000;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #000;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid #000;color:#fff;display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#fff;text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:#fff}.tox .tox-statusbar__resize-handle:focus svg{background-color:#4a5562;border-radius:1px;box-shadow:0 0 0 2px #4a5562}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#4a5562;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #4a5562 inset}.tox .tox-split-button:focus{background:#4a5562;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #000;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #000}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #000}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #000}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:3px;box-shadow:0 2px 4px rgba(42,55,70,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #000;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #000;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.mobile.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.mobile.min.css new file mode 100644 index 000000000..3a45cacf0 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css new file mode 100644 index 000000000..a0893b913 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.inline.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.inline.min.css new file mode 100644 index 000000000..b4ab9a3a5 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.inline.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.min.css new file mode 100644 index 000000000..844858d06 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.mobile.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.mobile.min.css new file mode 100644 index 000000000..35f7dc08b --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/content.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff new file mode 100644 index 000000000..1e3be038a Binary files /dev/null and b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff differ diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.min.css new file mode 100644 index 000000000..15ba6f5ff --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #eee;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:2px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#3c9cff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#3c9cff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#3c9cff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#3c9cff;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3c9cff;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#3c9cff;background-image:none;border-color:#3c9cff;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1E9FFF;background-image:none;border-color:#1E9FFF;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1E9FFF;background-image:none;border-color:#1E9FFF;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#0182E2;background-image:none;border-color:#0182E2;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:2px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:2px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#3c9cff}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#3c9cff}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:2px;box-shadow:inset 0 0 0 1px #3c9cff;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:2px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:2px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:2px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #3c9cff;color:#3c9cff}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#3c9cff;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#0182E2;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#0182E2;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#3c9cff;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:2px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#3c9cff;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#3c9cff;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#3c9cff;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#f9f9f9;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:2px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#222f3e}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:2px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#3c9cff;border:2px solid #0182E2;border-radius:2px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #eee;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:2px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:2px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23eeeeee'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #eee;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #eee}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #eee}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #eee}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:2px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #eee;border-radius:2px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #eee;border-radius:2px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.mobile.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.mobile.min.css new file mode 100644 index 000000000..3a45cacf0 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} diff --git a/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.shadowdom.min.css new file mode 100644 index 000000000..a0893b913 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/skins/ui/oxide/skin.shadowdom.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/jun_pc_web/assets/module/tinymce/themes/mobile/theme.min.js b/jun_pc_web/assets/module/tinymce/themes/mobile/theme.min.js new file mode 100644 index 000000000..7dc195679 --- /dev/null +++ b/jun_pc_web/assets/module/tinymce/themes/mobile/theme.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";var y=function(){return(y=Object.assign||function(n){for(var e,t=1,o=arguments.length;t "+o.toString()},function(n,e){return"state("+n+")"})}).join("\n")+"}"}}},mo=w(fo),go=(Qt=m,_t(function(n){var e=typeof n;return Qt(n)?no(n):eo("Expected type: function but got: "+e)})),po=function(n){return"Errors: \n"+Z(10<(e=n.errors).length?e.slice(0,10).concat([{path:[],getErrorInfo:w("... (only showing first ten failures)")}]):e,function(n){return"Failed path: ("+n.path.join(" > ")+")\n"+n.getErrorInfo()}).join("\n")+"\n\nInput object: "+Dt(n.input);var e},ho=xt,vo=function(n,e){return{tag:"custom",newKey:n,instantiator:e}},bo=[Lt("alpha"),Lt("omega")];function yo(n,e){return(t={})[n]=e,t;var t}function xo(n){return e={},M(n,function(n){e[n.key]=n.value}),e;var e}function wo(n,e,t){return void 0===t&&(t=o),n.exists(function(n){return t(n,e)})}function So(n){for(var e=[],t=function(n){e.push(n)},o=0;o="/*".length&&"/*"===n.substr(e,e+"/*".length)?n.substring(0,n.length-"/*".length):n;var e})},nr=function(t,n,l,i,e,o,r){function u(n){return Re(n,l)?n[l]():mn.none()}var c=De(e,function(n,e){return r=l,t=function(t){for(var n=[],e=1;e"}),mo()),ta=vo("schema",function(){return[Ut("preprocess")]}),oa=Yt("defaults",w({})),ra=Yt("overrides",w({})),ia=lo([Qc,Zc,na,ea,oa,ra]),ua=lo([Qc,Zc,na,oa,ra]),ca=lo([Qc,Zc,na,ea,oa,ra]),aa=lo([Qc,ta,na,Lt("unit"),ea,oa,ra]),sa=Wu(Jc.required,ia);function fa(n,e,t,o){return co(e.defaults(n,t,o),t,{uid:n.partUids[e.name]},e.overrides(n,t,o))}function la(n,e,t){return o=e,r={},i={},M(t,function(n){n.fold(function(o){r[o.pname]=Xc(!0,function(n,e,t){return o.factory.sketch(fa(n,o,e,t))})},function(n){var e=o.parts[n.name];i[n.name]=w(n.factory.sketch(fa(o,n,e[zs()]),e))},function(o){r[o.pname]=Xc(!1,function(n,e,t){return o.factory.sketch(fa(n,o,e,t))})},function(o){r[o.pname]=qc(!0,function(e,n,t){return Z(e[o.name],function(n){return o.factory.sketch(co(o.defaults(e,n,t),n,o.overrides(e,n)))})})})}),{internals:w(r),externals:w(i)};var o,r,i}function da(n,e,t){return o=mn.some(n),i=(r=e).components,s=De(t,function(n,e){return o=n,r=!1,{name:w(t=e),required:function(){return o.fold(function(n,e){return n},function(n,e){return n})},used:function(){return r},replace:function(){if(r)throw new Error("Trying to use the same placeholder more than once: "+t);return r=!0,o}};var t,o,r}),u=o,c=r,a=s,f=B(i,function(n){return Wc(u,c,n,a)}),Ee(s,function(n){if(!1===n.used()&&n.required())throw new Error("Placeholder: "+n.name()+" was not found in components list\nNamespace: "+o.getOr("none")+"\nComponents: "+JSON.stringify(r.components,null,2))}),f;var o,r,i,u,c,a,s,f}function ma(n,e,t){var o=e.partUids[t];return n.getSystem().getByUid(o).toOptional()}function ga(n,e,t){return ma(n,e,t).getOrDie("Could not find part: "+t)}function pa(o){return ho("partUids","partUids",Et(function(n){return e=n.uid,t=Z(o,Uu),xo(Z(t,function(n){return{key:n,value:e+"-"+n}}));var e,t}),mo())}function ha(n){return yo(Ls,n)}function va(o){return n=function(n){for(var e=[],t=1;t
    ')},function(n){return Oa(''+n+"")})}function Da(e){return Hs({name:e+"-edge",overrides:function(n){return n.model.manager.edgeActions[e].fold(function(){return{}},function(o){return{events:qo([Do(Vn(),function(n,e,t){return o(n,t)},[n]),Do(Nn(),function(n,e,t){return o(n,t)},[n]),Do(Hn(),function(n,e,t){t.mouseIsDown.get()&&o(n,t)},[n])])}})}})}function Ma(n,e,t){e.store.manager.onLoad(n,e,t)}function _a(n,e,t){e.store.manager.onUnload(n,e,t)}function Ra(){var n=No(null);return tr({set:n.set,get:n.get,isNotSet:function(){return null===n.get()},clear:function(){n.set(null)},readState:function(){return{mode:"memory",value:n.get()}}})}function Fa(){var i=No({}),u=No({});return tr({readState:function(){return{mode:"dataset",dataByValue:i.get(),dataByText:u.get()}},lookup:function(n){return _e(i.get(),n).orThunk(function(){return _e(u.get(),n)})},update:function(n){var e=i.get(),t=u.get(),o={},r={};M(n,function(e){_e(o[e.value]=e,"meta").each(function(n){_e(n,"text").each(function(n){r[n]=e})})}),i.set(y(y({},e),o)),u.set(y(y({},t),r))},clear:function(){i.set({}),u.set({})}})}function Ia(n,e,t,o){var r=e.store;t.update([o]),r.setValue(n,o),e.onSetValue(n,o)}function Va(n,e){return vf.set(n,e)}function Ba(n){return vf.get(n)}function Aa(n){var e=n.event.raw;return-1===e.type.indexOf("touch")?void 0!==e.clientX?mn.some(e).map(function(n){return yf(n.clientX,n.clientY)}):mn.none():void 0!==e.touches&&1===e.touches.length?mn.some(e.touches[0]).map(function(n){return yf(n.clientX,n.clientY)}):mn.none()}function Na(n){return n.model.minX}function Ha(n){return n.model.minY}function Pa(n){return n.model.minX-1}function za(n){return n.model.minY-1}function ja(n){return n.model.maxX}function La(n){return n.model.maxY}function $a(n){return n.model.maxX+1}function Ga(n){return n.model.maxY+1}function Ua(n,e,t){return e(n)-t(n)}function Wa(n){return Ua(n,ja,Na)}function Xa(n){return Ua(n,La,Ha)}function qa(n){return Wa(n)/2}function Ya(n){return Xa(n)/2}function Ka(n){return n.stepSize}function Ja(n){return n.snapToGrid}function Qa(n){return n.snapStart}function Za(n){return n.rounded}function ns(n,e){return void 0!==n[e+"-edge"]}function es(n){return ns(n,"left")}function ts(n){return ns(n,"right")}function os(n){return ns(n,"top")}function rs(n){return ns(n,"bottom")}function is(n){return n.model.value.get()}function us(n,e){return{x:n,y:e}}function cs(n,e){X(n,xf(),{value:e})}function as(n,e,t,o){return n'),components:[$f.parts["left-edge"](ka('
    ')),$f.parts.spectrum({dom:Oa('
    '),components:[ka('
    ')],behaviours:or([ii.config({toggleClass:ci("thumb-active")})])}),$f.parts["right-edge"](ka('
    ')),$f.parts.thumb({dom:Oa('
    '),behaviours:or([ii.config({toggleClass:ci("thumb-active")})])})],onChange:function(n,e,t){var o=i(t.x());$r(e.element,"background-color",o),r.onChange(n,e,o)},onDragStart:function(n,e){ii.on(e)},onDragEnd:function(n,e){ii.off(e)},onInit:function(n,e,t,o){var r=i(o.x());$r(e.element,"background-color",r)},stepSize:10,model:{mode:"x",minX:0,maxX:360,getInitialValue:function(){return{x:r.getInitialValue()}}},sliderBehaviours:or([Nr($f.refresh)])}))];function i(n){return n<0?"black":360
    '),(e={onChange:n.onChange,sizes:Xf,category:"font",getInitialValue:n.getInitialValue},r=zt("SizeSlider",Wf,e),$f.sketch({dom:{tag:"div",classes:[ci("slider-"+r.category+"-size-container"),ci("slider"),ci("slider-size-container")]},onChange:function(n,e,t){var o=t.x();0<=o&&o'),components:[ka('
    ')]}),$f.parts.thumb({dom:Oa('
    '),behaviours:or([ii.config({toggleClass:ci("thumb-active")})])})]})),ka('')];var e,r}function Ns(n){var e=void 0!==n.uid&&Re(n,"uid")?n.uid:qs("memento");return{get:function(n){return n.getSystem().getByUid(e).getOrDie()},getOpt:function(n){return n.getSystem().getByUid(e).toOptional()},asSpec:function(){return y(y({},n),{uid:e})}}}Wu(Jc.external,ua);var Hs=Wu(Jc.optional,ca),Ps=Wu(Jc.group,aa),zs=w("entirety"),js=function(n,e){return{uiType:Yc(),owner:n,name:e}},Ls=Gu("alloy-premade"),$s=w("alloy-id-"),Gs=w("data-alloy-id"),Us=$s(),Ws=Gs(),Xs=function(n,e){Object.defineProperty(n.dom,Ws,{value:e,writable:!0})},qs=Gu,Ys=function(n){return dt(n,"uid")?n:y(y({},n),{uid:qs("uid")})},Ks=It([Lt("name"),Lt("factory"),Lt("configFields"),Yt("apis",{}),Yt("extraApis",{})]),Js=It([Lt("name"),Lt("factory"),Lt("configFields"),Lt("partFields"),Yt("apis",{}),Yt("extraApis",{})]),Qs=wa({name:"Button",factory:function(n){function t(e){return _e(n.dom,"attributes").bind(function(n){return _e(n,e)})}var e,o=(e=n.action,qo(V([e.map(function(t){return Qo(function(n,e){t(n),e.stop()})}).toArray(),Pr()]))),r=n.dom.tag;return{uid:n.uid,dom:n.dom,components:n.components,events:o,behaviours:$c(n.buttonBehaviours,[fi.config({}),jc.config({mode:"execution",useSpace:!0,useEnter:!0})]),domModification:{attributes:function(){if("button"!==r)return{role:t("role").getOr("button")};var n=t("type").getOr("button"),e=t("role").map(function(n){return{role:n}}).getOr({});return y({type:n},e)}()},eventOrder:n.eventOrder}},configFields:[Yt("uid",void 0),Lt("dom"),Yt("components",[]),Lc("buttonBehaviours",[fi,jc]),Ut("action"),Ut("role"),Yt("eventOrder",{})]}),Zs=Ao({fields:[],name:"unselecting",active:Object.freeze({__proto__:null,events:function(){return qo([Co(Xn(),x)])},exhibit:function(){return Io({styles:{"-webkit-user-select":"none","user-select":"none","-ms-user-select":"none","-moz-user-select":"-moz-none"},attributes:{unselectable:"on"}})}})}),nf=function(n,e,t,o){return Qs.sketch({dom:Ea(n,o),action:e,buttonBehaviours:co(or([Zs.config({})]),t)})},ef=Hs({schema:[Lt("dom")],name:"label"}),tf=Da("top-left"),of=Da("top"),rf=Da("top-right"),uf=Da("right"),cf=Da("bottom-right"),af=Da("bottom"),sf=Da("bottom-left"),ff=[ef,Da("left"),uf,of,af,tf,rf,sf,cf,sa({name:"thumb",defaults:w({dom:{styles:{position:"absolute"}}}),overrides:function(n){return{events:qo([_o(Vn(),n,"spectrum"),_o(Bn(),n,"spectrum"),_o(An(),n,"spectrum"),_o(Nn(),n,"spectrum"),_o(Hn(),n,"spectrum"),_o(Pn(),n,"spectrum")])}}}),sa({schema:[vo("mouseIsDown",function(){return No(!1)})],name:"spectrum",overrides:function(t){function o(e,n){return r.getValueFromEvent(n).map(function(n){return r.setValueFrom(e,t,n)})}var r=t.model.manager;return{behaviours:or([jc.config({mode:"special",onLeft:function(n){return r.onLeft(n,t)},onRight:function(n){return r.onRight(n,t)},onUp:function(n){return r.onUp(n,t)},onDown:function(n){return r.onDown(n,t)}}),fi.config({})]),events:qo([Eo(Vn(),o),Eo(Bn(),o),Eo(Nn(),o),Eo(Hn(),function(n,e){t.mouseIsDown.get()&&o(n,e)})])}}})],lf=Object.freeze({__proto__:null,onLoad:Ma,onUnload:_a,setValue:function(n,e,t,o){e.store.manager.setValue(n,e,t,o)},getValue:function(n,e,t){return e.store.manager.getValue(n,e,t)},getState:function(n,e,t){return t}}),df=Object.freeze({__proto__:null,events:function(t,o){var n=t.resetOnDom?[Yo(function(n,e){Ma(n,t,o)}),Ko(function(n,e){_a(n,t,o)})]:[Vo(t,o,Ma)];return qo(n)}}),mf=Object.freeze({__proto__:null,memory:Ra,dataset:Fa,manual:function(){return tr({readState:Y})},init:function(n){return n.store.manager.state(n)}}),gf=[Ut("initialValue"),Lt("getFallbackEntry"),Lt("getDataKey"),Lt("setValue"),Dr("manager",{setValue:Ia,getValue:function(n,e,t){var o=e.store,r=o.getDataKey(n);return t.lookup(r).getOrThunk(function(){return o.getFallbackEntry(r)})},onLoad:function(e,t,o){t.store.initialValue.each(function(n){Ia(e,t,o,n)})},onUnload:function(n,e,t){t.clear()},state:Fa})],pf=[Lt("getValue"),Yt("setValue",Y),Ut("initialValue"),Dr("manager",{setValue:function(n,e,t,o){e.store.setValue(n,o),e.onSetValue(n,o)},getValue:function(n,e,t){return e.store.getValue(n)},onLoad:function(e,t,n){t.store.initialValue.each(function(n){t.store.setValue(e,n)})},onUnload:Y,state:er.init})],hf=Ao({fields:[Kt("store",{mode:"memory"},jt("mode",{memory:[Ut("initialValue"),Dr("manager",{setValue:function(n,e,t,o){t.set(o),e.onSetValue(n,o)},getValue:function(n,e,t){return t.get()},onLoad:function(n,e,t){e.store.initialValue.each(function(n){t.isNotSet()&&t.set(n)})},onUnload:function(n,e,t){t.clear()},state:Ra})],manual:pf,dataset:gf})),kr("onSetValue"),Yt("resetOnDom",!1)],name:"representing",active:df,apis:lf,extra:{setValueFrom:function(n,e){var t=hf.getValue(e);hf.setValue(n,t)}},state:mf}),vf=Yr("width",function(n){return n.dom.offsetWidth}),bf=function(t,o){return{left:t,top:o,translate:function(n,e){return bf(t+n,o+e)}}},yf=bf,xf=w("slider.change.value"),wf="left",Sf=ks(-1),Of=ks(1),kf=mn.none,Tf=mn.none,Cf={"top-left":mn.none(),top:mn.none(),"top-right":mn.none(),right:mn.some(function(n,e){cs(n,{x:$a(e)})}),"bottom-right":mn.none(),bottom:mn.none(),"bottom-left":mn.none(),left:mn.some(function(n,e){cs(n,{x:Pa(e)})})},Ef=Object.freeze({__proto__:null,setValueFrom:function(n,e,t){var o=Os(n,e,t);return Ss(n,{x:o}),o},setToMin:function(n,e){Ss(n,{x:Na(e)})},setToMax:function(n,e){Ss(n,{x:ja(e)})},findValueOfOffset:Os,getValueFromEvent:function(n){return Aa(n).map(function(n){return n.left})},findPositionOfValue:Ts,setPositionFromValue:function(n,e,t,o){var r=is(t),i=Ts(n,o.getSpectrum(n),r.x,o.getLeftEdge(n),o.getRightEdge(n),t),u=Ba(e.element)/2;$r(e.element,"left",i-u+"px")},onLeft:Sf,onRight:Of,onUp:kf,onDown:Tf,edgeActions:Cf}),Df=mn.none,Mf=mn.none,_f=Ds(-1),Rf=Ds(1),Ff={"top-left":mn.none(),top:mn.some(function(n,e){cs(n,{y:za(e)})}),"top-right":mn.none(),right:mn.none(),"bottom-right":mn.none(),bottom:mn.some(function(n,e){cs(n,{y:Ga(e)})}),"bottom-left":mn.none(),left:mn.none()},If=Object.freeze({__proto__:null,setValueFrom:function(n,e,t){var o=Es(n,e,t);return Cs(n,{y:o}),o},setToMin:function(n,e){Cs(n,{y:Ha(e)})},setToMax:function(n,e){Cs(n,{y:La(e)})},findValueOfOffset:Es,getValueFromEvent:function(n){return Aa(n).map(function(n){return n.top})},findPositionOfValue:Ms,setPositionFromValue:function(n,e,t,o){var r=is(t),i=Ms(n,o.getSpectrum(n),r.y,o.getTopEdge(n),o.getBottomEdge(n),t),u=Kr(e.element)/2;$r(e.element,"top",i-u+"px")},onLeft:Df,onRight:Mf,onUp:_f,onDown:Rf,edgeActions:Ff}),Vf=Aa,Bf=Fs(-1,!1),Af=Fs(1,!1),Nf=Fs(-1,!0),Hf=Fs(1,!0),Pf={"top-left":mn.some(function(n,e){cs(n,us(Pa(e),za(e)))}),top:mn.some(function(n,e){cs(n,us(qa(e),za(e)))}),"top-right":mn.some(function(n,e){cs(n,us($a(e),za(e)))}),right:mn.some(function(n,e){cs(n,us($a(e),Ya(e)))}),"bottom-right":mn.some(function(n,e){cs(n,us($a(e),Ga(e)))}),bottom:mn.some(function(n,e){cs(n,us(qa(e),Ga(e)))}),"bottom-left":mn.some(function(n,e){cs(n,us(Pa(e),Ga(e)))}),left:mn.some(function(n,e){cs(n,us(Pa(e),Ya(e)))})},zf=Object.freeze({__proto__:null,setValueFrom:function(n,e,t){var o=Rs(Os(n,e,t.left),Es(n,e,t.top));return _s(n,o),o},setToMin:function(n,e){_s(n,Rs(Na(e),Ha(e)))},setToMax:function(n,e){_s(n,Rs(ja(e),La(e)))},getValueFromEvent:Vf,setPositionFromValue:function(n,e,t,o){var r=is(t),i=Ts(n,o.getSpectrum(n),r.x,o.getLeftEdge(n),o.getRightEdge(n),t),u=Ms(n,o.getSpectrum(n),r.y,o.getTopEdge(n),o.getBottomEdge(n),t),c=Ba(e.element)/2,a=Kr(e.element)/2;$r(e.element,"left",i-c+"px"),$r(e.element,"top",u-a+"px")},onLeft:Bf,onRight:Af,onUp:Nf,onDown:Hf,edgeActions:Pf}),jf=[Yt("stepSize",1),Yt("onChange",Y),Yt("onChoose",Y),Yt("onInit",Y),Yt("onDragStart",Y),Yt("onDragEnd",Y),Yt("snapToGrid",!1),Yt("rounded",!0),Ut("snapStart"),$t("model",jt("mode",{x:[Yt("minX",0),Yt("maxX",100),vo("value",function(n){return No(n.mode.minX)}),Lt("getInitialValue"),Dr("manager",Ef)],y:[Yt("minY",0),Yt("maxY",100),vo("value",function(n){return No(n.mode.minY)}),Lt("getInitialValue"),Dr("manager",If)],xy:[Yt("minX",0),Yt("maxX",100),Yt("minY",0),Yt("maxY",100),vo("value",function(n){return No({x:n.mode.minX,y:n.mode.minY})}),Lt("getInitialValue"),Dr("manager",zf)]})),ju("sliderBehaviours",[jc,hf]),vo("mouseIsDown",function(){return No(!1)})],Lf=w("mouse.released"),$f=Sa({name:"Slider",configFields:jf,partFields:ff,factory:function(i,n,e,t){function u(n){return ga(n,i,"thumb")}function c(n){return ga(n,i,"spectrum")}function o(n){return ma(n,i,"left-edge")}function r(n){return ma(n,i,"right-edge")}function a(n){return ma(n,i,"top-edge")}function s(n){return ma(n,i,"bottom-edge")}function f(n,e){v.setPositionFromValue(n,e,i,{getLeftEdge:o,getRightEdge:r,getTopEdge:a,getBottomEdge:s,getSpectrum:c})}function l(n,e){h.value.set(e),f(n,u(n))}function d(t){var n=i.mouseIsDown.get();i.mouseIsDown.set(!1),n&&ma(t,i,"thumb").each(function(n){var e=h.value.get();i.onChoose(t,n,e)})}function m(n,e){e.stop(),i.mouseIsDown.set(!0),i.onDragStart(n,u(n))}function g(n,e){e.stop(),i.onDragEnd(n,u(n)),d(n)}var p,h=i.model,v=h.manager;return{uid:i.uid,dom:i.dom,components:n,behaviours:Lu(i.sliderBehaviours,[jc.config({mode:"special",focusIn:function(n){return ma(n,i,"spectrum").map(jc.focusIn).map(x)}}),hf.config({store:{mode:"manual",getValue:function(n){return h.value.get()}}}),ti.config({channels:((p={})[Lf()]={onReceive:d},p)})]),events:qo([Eo(xf(),function(n,e){!function(n,e){l(n,e);var t=u(n);i.onChange(n,t,e),mn.some(!0)}(n,e.event.value)}),Yo(function(n,e){var t=h.getInitialValue();h.value.set(t);var o=u(n);f(n,o);var r=c(n);i.onInit(n,o,r,h.value.get())}),Eo(Vn(),m),Eo(An(),g),Eo(Nn(),m),Eo(Pn(),g)]),apis:{resetToMin:function(n){v.setToMin(n,i)},resetToMax:function(n){v.setToMax(n,i)},setValue:l,refresh:f},domModification:{styles:{position:"relative"}}}},apis:{setValue:function(n,e,t){n.setValue(e,t)},resetToMin:function(n,e){n.resetToMin(e)},resetToMax:function(n,e){n.resetToMax(e)},refresh:function(n,e){n.refresh(e)}}}),Gf=["9px","10px","11px","12px","14px","16px","18px","20px","24px","32px","36px"],Uf=w(Gf),Wf=It([Lt("getInitialValue"),Lt("onChange"),Lt("category"),Lt("sizes")]),Xf=Uf(),qf={},Yf={exports:qf};function Kf(u){var e=Ns({dom:{tag:"input",attributes:{accept:"image/*",type:"file",title:""},styles:{visibility:"hidden",position:"absolute"}},events:qo([Ro(Un()),Eo(Gn(),function(n,e){var t=e.event.raw,o=t.target.files||t.dataTransfer.files;mn.from(o[0]).each(function(n){var r,t,i=u;r=n,t=r,new Jl(function(n){var e=new FileReader;e.onloadend=function(){n(e.result)},e.readAsDataURL(t)}).then(function(n){return n.split(",")[1]}).then(function(o){i.undoManager.transact(function(){var n=i.editorUpload.blobCache,e=n.create(Gu("mceu"),r,o);n.add(e);var t=i.dom.createHTML("img",{src:e.blobUri()});i.insertContent(t)})})})})])});return Qs.sketch({dom:Ea("image",u),components:[e.asSpec()],action:function(n){e.get(n).element.dom.click()}})}function Jf(n){return n.dom.textContent}function Qf(n){return 0'),action:function(n){var e=t.get(n);hf.setValue(e,"")}}));return{name:n,spec:td.sketch({dom:Oa('
    '),components:[t.asSpec(),o.asSpec()],containerBehaviours:or([ii.config({toggleClass:ci("input-container-empty")}),ed.config({find:function(n){return mn.some(t.get(n))}}),el("input-clearing",[Eo($n(),function(n){var e=t.get(n);(0"}function sl(o,r){return Ca(r,"link","link",function(){var n,e,t=hd(o,r);o.setContextToolbar(t),n=r,e=function(){o.focusToolbar()},(Zl.os.isAndroid()?function(n,e){var t=e.selection.getRng();n(),e.selection.setRng(t)}:p)(e,n),Ql(r).each(function(n){r.selection.select(n.dom)})})}function fl(e){function t(n){return"The component must be in a context to execute: "+n+(e?"\n"+$o(e().element)+" is not in context.":"")}function n(n){return function(){throw new Error(t(n))}}function o(n){return function(){console.warn(t(n))}}return{debugInfo:w("fake"),triggerEvent:o("triggerEvent"),triggerFocus:o("triggerFocus"),triggerEscape:o("triggerEscape"),broadcast:o("broadcast"),broadcastOn:o("broadcastOn"),broadcastEvent:o("broadcastEvent"),build:n("build"),addToWorld:n("addToWorld"),removeFromWorld:n("removeFromWorld"),addToGui:n("addToGui"),removeFromGui:n("removeFromGui"),getByUid:n("getByUid"),getByDom:n("getByDom"),isConnected:S}}function ll(n,r){var i={};return Ee(n,function(n,o){Ee(n,function(n,e){var t=_e(i,e).getOr([]);i[e]=t.concat([r(o,n)])})}),i}function dl(n){return n.cHandler}function ml(n,e){return{name:n,handler:e}}function gl(n,e,t){var o=e[t];return o?function(u,c,n,a){try{var e=(t=function(n,e){var t=n[c],o=e[c],r=a.indexOf(t),i=a.indexOf(o);if(-1===r)throw new Error("The ordering for "+u+" does not have an entry for "+t+".\nOrder specified: "+JSON.stringify(a,null,2));if(-1===i)throw new Error("The ordering for "+u+" does not have an entry for "+o+".\nOrder specified: "+JSON.stringify(a,null,2));return r'),components:[td.sketch({dom:Oa('
    '),components:Z(s.fields,function(n,e){return e<=s.maxFieldIndex?td.sketch({dom:Oa('
    '),components:[i(-1,"previous",0'),behaviours:or([Qi.config({highlightClass:ci("dot-active"),itemClass:ci("dot-item")})]),components:B(s.fields,function(n,e){return e<=s.maxFieldIndex?[ka('
    ')]:[]})}),{dom:Oa('
    '),components:[f.asSpec(),l.asSpec()],behaviours:or([jc.config({mode:"special",focusIn:function(n){var e=f.get(n);jc.focusIn(e)}}),el("serializer-wrapper-events",[Eo(Vn(),function(n,e){var t=e.event;s.state.dialogSwipeState.set({xValue:t.raw.touches[0].clientX,points:[]})}),Eo(Bn(),function(n,e){var t=e.event;s.state.dialogSwipeState.on(function(n){e.event.prevent(),s.state.dialogSwipeState.set(function(n,e){if(e===n.xValue)return n;var t=0
    '),action:function(n){X(n,a,{direction:e})},buttonBehaviours:or([md.config({disableClass:ci("toolbar-navigation-disabled"),disabled:function(){return!t}})])})}function u(n,r){var i=Jr(n.element,"."+ci("serialised-dialog-screen"));hi(n.element,"."+ci("serialised-dialog-chain")).each(function(o){0<=s.state.currentScreen.get()+r&&s.state.currentScreen.get()+r "):r[0].name;return yo(u,{handler:t,purpose:o})})});return e={},t=[],o=[],M(a,function(n){n.fold(function(n){t.push(n)},function(n){o.push(n)})}),0<(u={errors:t,values:o}).errors.length?ht.error(V(u.errors)):(i=e,0===(r=u.values).length?ht.value(i):ht.value(co(i,ao.apply(void 0,r))))},Sd="alloy.base.behaviour",Od=lo([ho("dom","dom",Ot(),lo([Lt("tag"),Yt("styles",{}),Yt("classes",[]),Yt("attributes",{}),Ut("value"),Ut("innerHtml")])),Lt("components"),Lt("uid"),Yt("events",{}),Yt("apis",{}),ho("eventOrder","eventOrder",((Kl={})[Zn()]=["disabling",Sd,"toggling","typeaheadevents"],Kl[Yn()]=[Sd,"focusing","keying"],Kl[oe()]=[Sd,"disabling","toggling","representing"],Kl[$n()]=[Sd,"representing","streaming","invalidating"],Kl[ie()]=[Sd,"representing","item-events","tooltipping"],Kl[Nn()]=["focusing",Sd,"item-type-events"],Kl[Vn()]=["focusing",Sd,"item-type-events"],Kl[zn()]=["item-type-events","tooltipping"],Kl[Qn()]=["receiving","reflecting","tooltipping"],Et(w(Kl))),mo()),Ut("domModification")]),kd=qs,Td=function(u){return _e(u,Ls).getOrThunk(function(){var n,e,t,o,r,i=dt(u,"uid")?u:y({uid:kd("")},u);return n=yd(i),e=n.events,t=c(n,["events"]),o=Z(_e(t,"components").getOr([]),Td),r=y(y({},t),{events:y(y({},bd),e),components:o}),ht.value(xl(r)).getOrDie()})},Cd=ha,Ed="alloy.item-hover",Dd="alloy.item-focus",Md=w(Ed),_d=w(Dd),Rd=[Lt("data"),Lt("components"),Lt("dom"),Yt("hasSubmenu",!1),Ut("toggling"),Lc("itemBehaviours",[ii,fi,jc,hf]),Yt("ignoreFocus",!1),Yt("domModification",{}),Dr("builder",function(n){return{dom:n.dom,domModification:y(y({},n.domModification),{attributes:y(y(y({role:n.toggling.isSome()?"menuitemcheckbox":"menuitem"},n.domModification.attributes),{"aria-haspopup":n.hasSubmenu}),n.hasSubmenu?{"aria-expanded":!1}:{})}),behaviours:$c(n.itemBehaviours,[n.toggling.fold(ii.revoke,function(n){return ii.config(y({aria:{mode:"checked"}},n))}),fi.config({ignore:n.ignoreFocus,stopMousedown:n.ignoreFocus,onFocus:function(n){Ol(n)}}),jc.config({mode:"execution"}),hf.config({store:{mode:"memory",initialValue:n.data}}),el("item-type-events",u(u([],Pr(),!0),[Eo(zn(),Sl),Eo(ne(),fi.focus)],!1))]),components:n.components,eventOrder:n.eventOrder}}),Yt("eventOrder",{})],Fd=[Lt("dom"),Lt("components"),Dr("builder",function(n){return{dom:n.dom,components:n.components,events:qo([Eo(ne(),function(n,e){e.stop()})])}})],Id=w("item-widget"),Vd=w([sa({name:"widget",overrides:function(e){return{behaviours:or([hf.config({store:{mode:"manual",getValue:function(n){return e.data},setValue:Y}})])}}})]),Bd=jt("type",{widget:[Lt("uid"),Lt("data"),Lt("components"),Lt("dom"),Yt("autofocus",!1),Yt("ignoreFocus",!1),Lc("widgetBehaviours",[hf,fi,jc]),Yt("domModification",{}),pa(Vd()),Dr("builder",function(t){function o(n){return ma(n,t,"widget").map(function(n){return jc.focusIn(n),n})}function n(n,e){return eu(e.event.target)||t.autofocus&&e.setSource(n.element),mn.none()}var e=la(Id(),t,Vd()),r=da(Id(),t,e.internals());return{dom:t.dom,components:r,domModification:t.domModification,events:qo([Qo(function(n,e){o(n).each(function(n){e.stop()})}),Eo(zn(),Sl),Eo(ne(),function(n,e){t.autofocus?o(n):fi.focus(n)})]),behaviours:$c(t.widgetBehaviours,[hf.config({store:{mode:"memory",initialValue:t.data}}),fi.config({ignore:t.ignoreFocus,onFocus:function(n){Ol(n)}}),jc.config({mode:"special",focusIn:t.autofocus?function(n){o(n)}:ur(),onLeft:n,onRight:n,onEscape:function(n,e){return fi.isFocused(n)||t.autofocus?(t.autofocus&&e.setSource(n.element),mn.none()):(fi.focus(n),mn.some(!0))}})])}})],item:Rd,separator:Fd}),Ad=w([Ps({factory:{sketch:function(n){var e=zt("menu.spec item",Bd,n);return e.builder(e)}},name:"items",unit:"item",defaults:function(n,e){return dt(e,"uid")?e:y(y({},e),{uid:qs("item")})},overrides:function(n,e){return{type:e.type,ignoreFocus:n.fakeFocus,domModification:{classes:[n.markers.item]}}}})]),Nd=w([Lt("value"),Lt("items"),Lt("dom"),Lt("components"),Yt("eventOrder",{}),ju("menuBehaviours",[Qi,hf,ed,jc]),Kt("movement",{mode:"menu",moveOnTab:!0},jt("mode",{grid:[ei(),Dr("config",function(n,e){return{mode:"flatgrid",selector:"."+n.markers.item,initSize:{numColumns:e.initSize.numColumns,numRows:e.initSize.numRows},focusManager:n.focusManager}})],matrix:[Dr("config",function(n,e){return{mode:"matrix",selectors:{row:e.rowSelector,cell:"."+n.markers.item},focusManager:n.focusManager}}),Lt("rowSelector")],menu:[Yt("moveOnTab",!0),Dr("config",function(n,e){return{mode:"menu",selector:"."+n.markers.item,moveOnTab:e.moveOnTab,focusManager:n.focusManager}})]})),$t("markers",ni()),Yt("fakeFocus",!1),Yt("focusManager",Ii()),kr("onHighlight")]),Hd=w("alloy.menu-focus"),Pd=Sa({name:"Menu",configFields:Nd(),partFields:Ad(),factory:function(n,e,t,o){return{uid:n.uid,dom:n.dom,markers:n.markers,behaviours:Lu(n.menuBehaviours,[Qi.config({highlightClass:n.markers.selectedItem,itemClass:n.markers.item,onHighlight:n.onHighlight}),hf.config({store:{mode:"memory",initialValue:n.value}}),ed.config({find:mn.some}),jc.config(n.movement.config(n,n.movement))]),events:qo([Eo(_d(),function(e,t){var n=t.event;e.getSystem().getByDom(n.target).each(function(n){Qi.highlight(e,n),t.stop(),X(e,Hd(),{menu:e,item:n})})}),Eo(Md(),function(n,e){var t=e.event.item;Qi.highlight(n,t)})]),components:e,eventOrder:n.eventOrder,domModification:{attributes:{role:"menu"}}}}}),zd=function(n,e){return n.components()},jd=Ao({fields:[],name:"replacing",apis:Object.freeze({__proto__:null,append:function(n,e,t,o){kl(n,0,Qe,o)},prepend:function(n,e,t,o){kl(n,0,ye,o)},remove:Tl,replaceAt:Cl,replaceBy:function(e,n,t,o,r){return I(zd(e),o).bind(function(n){return Cl(e,0,0,n,r)})},set:function(i,n,e,u){var t,o,r,c;t=function(){var e,n,t,o,r=Z(u,i.getSystem().build);n=r,o=(e=i).components(),M((t=e).components(),function(n){return Ze(n.element)}),we(t.element),t.syncComponents(),M(H(o,n),function(n){ut(n),e.getSystem().removeFromWorld(n)}),M(n,function(n){n.getSystem().isConnected()?Te(e,n):(e.getSystem().addToWorld(n),Te(e,n),rt(e.element)&&ct(n)),e.syncComponents()})},o=i.element,r=tt(o),c=zo(r).bind(function(e){function n(n){return un(e,n)}var r,i;return n(o)?mn.some(o):(r=n,(i=function(n){for(var e=0;e");o[t[0]]=yo(t[1],n),o[t[1]]=yo(t[0],n)}),o},createBistate:function(n,e,t){return xo([{key:n,value:yo(e,t)},{key:e,value:yo(n,t)}])},createTristate:function(n,e,t,o){return xo([{key:n,value:xo([{key:e,value:o},{key:t,value:o}])},{key:e,value:xo([{key:n,value:o},{key:t,value:o}])},{key:t,value:xo([{key:n,value:o},{key:e,value:o}])}])}}}),Qd=ci("scrollable"),Zd=Qd,nm=function(n,e,t,o,r){return{data:{value:n,text:e},type:"item",dom:{tag:"div",classes:r?[ci("styles-item-is-menu")]:[]},toggling:{toggleOnExecute:!1,toggleClass:ci("format-matches"),selected:t},itemBehaviours:or(r?[]:[Ar(n,function(n,e){(e?ii.on:ii.off)(n)})]),components:[{dom:{tag:"div",attributes:{style:o},innerHtml:e}}]}},em=function(n,e,t,o){return{value:n,dom:{tag:"div"},components:[Qs.sketch({dom:{tag:"div",classes:[ci("styles-collapser")]},components:o?[{dom:{tag:"span",classes:[ci("styles-collapse-icon")]}},wl(n)]:[wl(n)],action:function(n){var e;o&&(e=t().get(n),Wd.collapseMenu(e))}}),{dom:{tag:"div",classes:[ci("styles-menu-items-container")]},components:[Pd.parts.items({})],behaviours:or([el("adhoc-scrollable-menu",[Yo(function(n,e){$r(n.element,"overflow-y","auto"),$r(n.element,"-webkit-overflow-scrolling","touch"),_l(n.element)}),Ko(function(n){Xr(n.element,"overflow-y"),Xr(n.element,"-webkit-overflow-scrolling"),Rl(n.element)})])])}],items:e,menuBehaviours:or([Jd.config({initialState:"after",routes:Jd.createTristate("before","current","after",{transition:{property:"transform",transitionClass:"transitioning"}})})])}},tm=function(n){return _(n,function(n,e){var t=Il(e);return{menus:co(n.menus,t.menus),items:[t.item].concat(n.items),expansions:co(n.expansions,t.expansions)}},{menus:{},expansions:{},items:[]})},om=function(n){return B(n,function(n){return(D(n)?om:Bl)(n)})},rm=function(n,e,t,o){n.dom.removeEventListener(e,t,o)},im=x,um=tinymce.util.Tools.resolve("tinymce.util.Delay"),cm=Jt([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]);function am(n,e){var t=le(n);return"input"===t?mg.after(n):T(["br","img"],t)?0===e?mg.before(n):mg.after(n):mg.on(n,e)}function sm(n){return mn.from(n.getSelection())}function fm(n,e,t,o,r){var i=Gl(n,e,t,o,r);sm(n).each(function(n){n.removeAllRanges(),n.addRange(i)})}function lm(n,e,t,o,r){var i,u,c,a,s,f=(i=o,u=r,c=am(e,t),a=am(i,u),pg.relative(c,a));Xl(s=n,f).match({ltr:function(n,e,t,o){fm(s,n,e,t,o)},rtl:function(r,i,u,c){sm(s).each(function(n){if(n.setBaseAndExtent)n.setBaseAndExtent(r.dom,i,u.dom,c);else if(n.extend)try{t=u,o=c,(e=n).collapse(r.dom,i),e.extend(t.dom,o)}catch(n){fm(s,u,c,r,i)}else fm(s,u,c,r,i);var e,t,o})}})}function dm(n){if(0r.innerHeight||n.bottom>r.innerHeight?Math.min(t,n.bottom-r.innerHeight+50):0;0!==e&&r.scrollTo(r.pageXOffset,r.pageYOffset+e)})}),Rm(i,o.innerHeight)});return Rm(i,o.innerHeight),{toEditing:function(){!function(n){n.focus();var e=fe.fromDom(n.document.body);(zo().exists(function(n){return T(["input","textarea"],le(n))})?function(n){um.setTimeout(function(){n()},0)}:p)(function(){zo().each(Po),Ho(e)})}(r)},destroy:function(){n.unbind()}}}function Vm(t,o){function r(){s(i)||(clearTimeout(i),i=null)}var i=null;return{cancel:r,throttle:function(){for(var n=[],e=0;e
    ',e.getDoc());return _e(t,At.fromDom(n.extractContents())),n.insertNode(t.dom),Yt(t).each(function(t){return t.dom.normalize()}),i=gs,(u=function(t){for(var n=Kt(t),e=n.length-1;0<=e;e--){var o=n[e];if(i(o))return vt.some(o);var r=u(o);if(r.isSome())return r}return vt.none()})(t).map(function(t){var n;e.selection.setCursorLocation(t.dom,"img"===Ft(n=t)?1:ms(n).fold(function(){return Kt(n).length},function(t){return t.length}))}),t})}function bp(t){return t.toString().replace(/\u00A0/g," ").replace(/\uFEFF/g,"")}function yp(t){return""!==t&&-1!==" \xa0\f\n\r\t\v".indexOf(t)}function xp(t,n){return t.substring(n.length)}function wp(o,t,r,n){return void 0===n&&(n=0),Dp(At.fromDom(t.startContainer)).fold(function(){return function(t,o,i,r){if(void 0===r&&(r=0),!o.collapsed||3!==o.startContainer.nodeType)return vt.none();var n=t.getParent(o.startContainer,t.isBlock)||t.getRoot();return hp(t,o.startContainer,o.startOffset,function(t,r,n){return function(t,n){for(var e=r-1;0<=e;e--){var o=t.charAt(e);if(yp(o))return vt.none();if(o===n)break}return vt.some(e)}(n,i).getOr(r)},n).bind(function(t){var n=o.cloneRange();if(n.setStart(t.container,t.offset),n.setEnd(o.endContainer,o.endOffset),n.collapsed)return vt.none();var e=bp(n);return 0!==e.lastIndexOf(i)||xp(e,i).length=t.minChars&&t.matches.getOrThunk(function(){return e=n.dom,function(t){var n=Ap(t.startContainer,t.startOffset);return!hp(e,n.container,n.offset,function(t,n){return 0===n?-1:n},e.getRoot()).filter(function(t){return!yp(t.container.data.charAt(t.offset-1))}).isSome()};var e})(e.range,i,e.text)});if(0===u.length)return vt.none();var a=Bp.all(M(u,function(n){return n.fetch(e.text,n.maxResults,o).then(function(t){return{matchText:e.text,items:t,columns:n.columns,onAction:n.onAction,highlightOn:n.highlightOn}})}));return vt.some({lookupData:a,context:e})}var _p,Tp,Ep=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker"),Dp=function(t){return Iu(t,"[data-mce-autocompleter]")},Bp=tinymce.util.Tools.resolve("tinymce.util.Promise"),Mp=function(t){if(3===t.nodeType)return Sp(t,t.data.length);var n=t.childNodes;return 0o}).getOr(r.length);return vt.some({numColumns:e,numRows:Math.ceil(r.length/e)})}return vt.none()}function uh(t,n,e){t.getSystem().broadcastOn([qh],{})}function ah(t){return t.getParam("height",Math.max(t.getElement().offsetHeight,200))}function ch(t){return t.getParam("width",tv.DOM.getStyle(t.getElement(),"width"))}function sh(t){return vt.from(t.getParam("min_width")).filter(u)}function lh(t){return vt.from(t.getParam("min_height")).filter(u)}function fh(t){return vt.from(t.getParam("max_width")).filter(u)}function dh(t){return vt.from(t.getParam("max_height")).filter(u)}function mh(t){return!1!==t.getParam("menubar",!0,"boolean")}function gh(t){var n=t.getParam("toolbar",!0),e=!0===n,o=y(n),r=c(n)&&0'+t+""})}return o}function Dv(t){return{value:t}}function Bv(t){return eb.test(t)||ob.test(t)}function Mv(t){var n=t.toString(16);return(1===n.length?"0"+n:n).toUpperCase()}function Av(t){return Dv(Mv(t.red)+Mv(t.green)+Mv(t.blue))}function Fv(t,n,e,o){return{red:t,green:n,blue:e,alpha:o}}function Iv(t){var n=parseInt(t,10);return n.toString()===t&&0<=n&&n<=255}function Rv(t){var n,e,o,r=(t.hue||0)%360,i=t.saturation/100,u=t.value/100,i=ib(0,rb(i,1)),u=ib(0,rb(u,1));if(0===i)return Fv(n=e=o=ub(255*u),e,o,1);var a=r/60,c=u*i,s=c*(1-Math.abs(a%2-1)),l=u-c;switch(Math.floor(a)){case 0:n=c,e=s,o=0;break;case 1:n=s,e=c,o=0;break;case 2:n=0,e=c,o=s;break;case 3:n=0,e=s,o=c;break;case 4:n=s,e=0,o=c;break;case 5:n=c,e=0,o=s;break;default:n=e=o=0}return Fv(n=ub(255*(n+l)),e=ub(255*(e+l)),o=ub(255*(o+l)),1)}function Vv(t){var n,e,o=(n={value:t.value.replace(eb,function(t,n,e,o){return n+n+e+e+o+o})},null===(e=ob.exec(n.value))?["FFFFFF","FF","FF","FF"]:e);return Fv(parseInt(o[1],16),parseInt(o[2],16),parseInt(o[3],16),1)}function Pv(t,n,e,o){return Fv(parseInt(t,10),parseInt(n,10),parseInt(e,10),parseFloat(o))}function Hv(t){if("transparent"===t)return vt.some(Fv(0,0,0,0));var n=ab.exec(t);if(null!==n)return vt.some(Pv(n[1],n[2],n[3],"1"));var e=cb.exec(t);return null!==e?vt.some(Pv(e[1],e[2],e[3],e[4])):vt.none()}function zv(t){return"rgba("+t.red+","+t.green+","+t.blue+","+t.alpha+")"}function Nv(t,n){return t.fire("ResizeContent",n)}function Lv(t,n,e){return{hue:t,saturation:n,value:e}}function Wv(t){var n,e,o=0,r=t.red/255,i=t.green/255,u=t.blue/255,a=Math.min(r,Math.min(i,u)),c=Math.max(r,Math.max(i,u));return a===c?Lv(0,0,100*(o=a)):(e=60*((r===a?3:u===a?1:5)-(r===a?i-u:u===a?r-i:u-r)/(c-a)),n=(c-a)/c,o=c,Lv(Math.round(e),Math.round(100*n),Math.round(100*o)))}function Uv(t){return Av(Rv(t))}function jv(o){return(Bv(n=o)?vt.some({value:(Dt(t=n,"#")?t.substring("#".length):t).toUpperCase()}):vt.none()).orThunk(function(){return Hv(o).map(Av)}).getOrThunk(function(){var t=document.createElement("canvas");t.height=1,t.width=1;var n=t.getContext("2d");n.clearRect(0,0,t.width,t.height),n.fillStyle="#FFFFFF",n.fillStyle=o,n.fillRect(0,0,1,1);var e=n.getImageData(0,0,1,1).data;return Av(Fv(e[0],e[1],e[2],e[3]))});var t,n}(vh=hh=hh||{}).default="wrap",vh.floating="floating",vh.sliding="sliding",vh.scrolling="scrolling",(yh=bh=bh||{}).auto="auto",yh.top="top",yh.bottom="bottom";function Gv(t){return dd.config({disabled:t,disableClass:"tox-tbtn--disabled"})}var Xv,Yv="silver.readonly",qv=Jo([mo("readonly",nr)]),Kv=function(t){return dd.config({disabled:t})},Jv=function(t){return dd.config({disabled:t,disableClass:"tox-tbtn--disabled",useNative:!1})},$v=((Xv={})[Fi()]=["disabling","alloy.base.behaviour","toggling","item-events"],Xv),Qv=et,Zv=tinymce.util.Tools.resolve("tinymce.Env"),tb=function(t,a){return M(t,function(t){switch(t.type){case"cardcontainer":return r=tb((o=t).items,a),i="vertical"===o.direction?"tox-collection__item-container--column":Mh,u="left"===o.align?"tox-collection__item-container--align-left":"tox-collection__item-container--align-right",{dom:{tag:"div",classes:[Bh,i,u,function(){switch(o.valign){case"top":return"tox-collection__item-container--valign-top";case"middle":return"tox-collection__item-container--valign-middle";case"bottom":return"tox-collection__item-container--valign-bottom"}}()]},components:r};case"cardimage":return e=t.src,{dom:{tag:"img",classes:t.classes,attributes:{src:e,alt:t.alt.getOr("")}}};case"cardtext":var n=t.name.exists(function(t){return wt(a.cardText.highlightOn,t)})?vt.from(a.cardText.matchText).getOr(""):"";return wv(Ev(t.text,n),t.classes)}var e,o,r,i,u})},nb=il(Xg(),Yg()),eb=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,ob=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rb=Math.min,ib=Math.max,ub=Math.round,ab=/^rgb\((\d+),\s*(\d+),\s*(\d+)\)/,cb=/^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/,sb=Fv(255,0,0,1),lb=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),fb="tinymce-custom-colors";function db(t){return!1!==t.getParam("custom_colors")}function mb(t){var n=t.getParam("color_map");return void 0!==n?function(t){for(var n=[],e=0;ee&&i.pop(),lb.setItem(fb,JSON.stringify(i))},state:function(){return i.slice(0)}}}(10),Bb=function(r){return function(e,t){var o=!1;r.windowManager.open({title:"Color Picker",size:"normal",body:{type:"panel",items:[{type:"colorpicker",name:"colorpicker",label:"Color"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{colorpicker:t},onAction:function(t,n){"hex-valid"===n.name&&(o=n.value)},onSubmit:function(t){var n=t.getData().colorpicker;o?(e(vt.from(n)),t.close()):r.windowManager.alert(r.translate(["Invalid hex color code: {0}",n]))},onClose:st,onCancel:function(){e(vt.none())}})}},Mb=function(e,o,r,i,u,a,c){return et(M(e,function(n){return"choiceitem"===n.type?uo("choicemenuitem",Lh,n).fold(eh,function(t){return vt.some(function(n,t,e,o,r,i,u,a){void 0===a&&(a=!0);var c=_v({presets:e,textContent:t?n.text:vt.none(),htmlContent:vt.none(),ariaLabel:n.text,iconContent:n.icon,shortcutContent:t?n.shortcut:vt.none(),checkMark:t?vt.some(kv(u.icons)):vt.none(),caret:vt.none(),value:n.value},u,a);return Xo(vv({data:bv(n),disabled:n.disabled,getApi:function(n){return{setActive:function(t){zg.set(n,t)},isActive:function(){return zg.isOn(n)},isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},onAction:function(t){return o(n.value)},onSetup:function(t){return t.setActive(r),st},triggersSubmenu:!1,itemBehaviours:[]},c,i,u),{toggling:{toggleClass:Oh,toggleOnExecute:!1,selected:n.active}})}(t,1===r,i,o,a(n.value),u,c,nh(e)))}):vt.none()}))},Ab=Fr("cell-over"),Fb=Fr("cell-execute"),Ib={inserttable:function(o){var t=Fr("size-label"),i=function(t){for(var n=[],e=0;e<10;e++){for(var o=[],r=0;r<10;r++)o.push(function(n,e,t){function o(t){return vr(t,Fb,{row:n,col:e})}function r(t,n){n.stop(),o(t)}var i;return _u({dom:{tag:"div",attributes:((i={role:"button"})["aria-labelledby"]=t,i)},behaviours:tc([fm("insert-table-picker-cell",[Cr(hi(),Vg.focus),Cr(Fi(),o),Cr(Ci(),r),Cr(Ri(),r)]),zg.config({toggleClass:"tox-insert-table-picker__selected",toggleOnExecute:!1}),Vg.config({onFocus:function(t){return vr(t,Ab,{row:n,col:e})}})])})}(e,r,t));n.push(o)}return n}(t),u=Pm({dom:{tag:"span",classes:["tox-insert-table-picker__label"],attributes:{id:t}},components:[oi("0x0")],behaviours:tc([Fg.config({})])});return{type:"widget",data:{value:Fr("widget-id")},dom:{tag:"div",classes:["tox-fancymenuitem"]},autofocus:!0,components:[nb.widget({dom:{tag:"div",classes:["tox-insert-table-picker"]},components:z(i,function(t){return M(t,Tu)}).concat(u.asSpec()),behaviours:tc([fm("insert-table-picker",[Tr(Ab,function(t,n,e){var o=e.event.row,r=e.event.col;!function(t,n,e){for(var o=0;o<10;o++)for(var r=0;r<10;r++)zg.set(t[o][r],o<=n&&r<=e)}(i,o,r),Fg.set(u.get(t),[oi(r+1+"x"+(o+1))])}),Tr(Fb,function(t,n,e){o.onAction({numRows:e.event.row+1,numColumns:e.event.col+1}),hr(t,Pi())})]),Mg.config({initSize:{numRows:10,numColumns:10},mode:"flatgrid",selector:'[role="button"]'})])})]}},colorswatch:function(n,t){var e,o,r,i=(o=t,r=(e=n).initData.allowCustomColors&&o.colorinput.hasCustomColors(),e.initData.colors.fold(function(){return bb(o.colorinput.getColors(),r)},function(t){return t.concat(hb(r))})),u=t.colorinput.getColorCols(),a=Cb(Fr("menu-value"),i,function(t){n.onAction({value:t})},u,"color",xh.CLOSE_ON_EXECUTE,O,t.shared.providers),c=lt(lt({},a),{markers:Jp("color"),movement:kb(u,"color")});return{type:"widget",data:{value:Fr("widget-id")},dom:{tag:"div",classes:["tox-fancymenuitem"]},autofocus:!0,components:[nb.widget(Qg.sketch(c))]}}},Rb=function(t){var n=t.text.fold(function(){return{}},function(t){return{innerHtml:t}});return{type:"separator",dom:lt({tag:"div",classes:[Sh,"tox-collection__group-heading"]},n),components:[]}},Vb=function(t,n,e,o){void 0===o&&(o=!0);var r=_v({presets:"normal",iconContent:t.icon,textContent:t.text,htmlContent:vt.none(),ariaLabel:t.text,caret:vt.none(),checkMark:vt.none(),shortcutContent:t.shortcut},e,o);return vv({data:bv(t),getApi:function(n){return{isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},disabled:t.disabled,onAction:t.onAction,onSetup:t.onSetup,triggersSubmenu:!1,itemBehaviours:[]},r,n,e)},Pb=function(t,n,e,o,r){void 0===o&&(o=!0);var i=(r=void 0!==r&&r)?yv("chevron-down",e.icons,[Eh]):yv("chevron-right",e.icons,[Eh]),u=_v({presets:"normal",iconContent:t.icon,textContent:t.text,htmlContent:vt.none(),ariaLabel:t.text,caret:vt.some(i),checkMark:vt.none(),shortcutContent:t.shortcut},e,o);return vv({data:bv(t),getApi:function(n){return{isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},disabled:t.disabled,onAction:st,onSetup:t.onSetup,triggersSubmenu:!0,itemBehaviours:[]},u,n,e)},Hb=function(t,n,e,o){void 0===o&&(o=!0);var r=_v({iconContent:t.icon,textContent:t.text,htmlContent:vt.none(),ariaLabel:t.text,checkMark:vt.some(kv(e.icons)),caret:vt.none(),shortcutContent:t.shortcut,presets:"normal",meta:t.meta},e,o);return Xo(vv({data:bv(t),disabled:t.disabled,getApi:function(n){return{setActive:function(t){zg.set(n,t)},isActive:function(){return zg.isOn(n)},isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},onAction:t.onAction,onSetup:t.onSetup,triggersSubmenu:!1,itemBehaviours:[]},r,n,e),{toggling:{toggleClass:Oh,toggleOnExecute:!1,selected:t.active}})},zb=function(n,e){return tt(Ib,n.fancytype).map(function(t){return t(n,e)})};function Nb(t,u,a,n,c,s,l){var e=1===n,o=!e||nh(t);return et(M(t,function(t){switch(t.type){case"separator":return uo("Autocompleter.Separator",Fp,t).fold(eh,function(t){return vt.some(Rb(t))});case"cardmenuitem":return uo("cardmenuitem",Nh,t).fold(eh,function(n){return vt.some((t=lt(lt({},n),{onAction:function(t){n.onAction(t),a(n.value,n.meta)}}),e=c,o=s,r={itemBehaviours:Tv(n.meta,s),cardText:{matchText:u,highlightOn:l}},i={dom:Ov(t.label),optComponents:[vt.some({dom:{tag:"div",classes:[Bh,Mh]},components:tb(t.items,r)})]},vv({data:bv(lt({text:vt.none()},t)),disabled:t.disabled,getApi:function(e){return{isDisabled:function(){return dd.isDisabled(e)},setDisabled:function(n){dd.set(e,n),St(ps(e.element,"*"),function(t){e.getSystem().getByDom(t).each(function(t){t.hasConfigured(dd)&&dd.set(t,n)})})}}},onAction:t.onAction,onSetup:t.onSetup,triggersSubmenu:!1,itemBehaviours:vt.from(r.itemBehaviours).getOr([])},i,e,o.providers)));var t,e,o,r,i});default:return uo("Autocompleter.Item",Ip,t).fold(eh,function(t){return vt.some(function(n,e,t,o,r,i,u,a){void 0===a&&(a=!0);var c=_v({presets:o,textContent:vt.none(),htmlContent:t?n.text.map(function(t){return Ev(t,e)}):vt.none(),ariaLabel:n.text,iconContent:n.icon,shortcutContent:vt.none(),checkMark:vt.none(),caret:vt.none(),value:n.value},u.providers,a,n.icon);return vv({data:bv(n),disabled:n.disabled,getApi:rt({}),onAction:function(t){return r(n.value,n.meta)},onSetup:rt(st),triggersSubmenu:!1,itemBehaviours:Tv(n.meta,u)},c,i,u.providers)}(t,u,e,"normal",a,c,s,o))})}}))}function Lb(t,n,e,o,r){var i=nh(n),u=et(M(n,function(t){function n(t){return function(t,n,e,o,r){function i(t){return r?lt(lt({},t),{shortcut:vt.none(),icon:t.text.isSome()?vt.none():t.icon}):t}var u=e.shared.providers;switch(t.type){case"menuitem":return uo("menuitem",jh,t).fold(eh,function(t){return vt.some(Vb(i(t),n,u,o))});case"nestedmenuitem":return uo("nestedmenuitem",Gh,t).fold(eh,function(t){return vt.some(Pb(i(t),n,u,o,r))});case"togglemenuitem":return uo("togglemenuitem",Xh,t).fold(eh,function(t){return vt.some(Hb(i(t),n,u,o))});case"separator":return uo("separatormenuitem",Fp,t).fold(eh,function(t){return vt.some(Rb(t))});case"fancymenuitem":return uo("fancymenuitem",Uh,t).fold(eh,function(t){return zb(i(t),e)});default:return console.error("Unknown item in general menu",t),vt.none()}}(t,e,o,r?!Tt(t,"text"):i,r)}return"nestedmenuitem"===t.type&&t.getSubmenuItems().length<=0?n(lt(lt({},t),{disabled:!0})):n(t)}));return(r?oh:rh)(t,i,u,1,"normal")}function Wb(t){return op.singleData(t.value,t)}function Ub(t,n,e){return Iu(t,n,e).isSome()}function jb(e,o){var r=null;return{cancel:function(){null!==r&&(clearTimeout(r),r=null)},schedule:function(){for(var t=[],n=0;n"}function e0(f,d,m,g){function p(t,n,e,o,r){var i,u,a=f(eS+"range"),c=[sy.parts.label({dom:{tag:"label",innerHtml:e,attributes:{"aria-label":o}}}),sy.parts.field({data:r,factory:Oy,inputAttributes:lt({type:"text"},"hex"===n?{"aria-live":"polite"}:{}),inputClasses:[d("textfield")],inputBehaviours:tc([(i=n,u=t,Gy.config({invalidClass:d("invalid"),notify:{onValidate:function(t){vr(t,nS,{type:i})},onValid:function(t){vr(t,Zw,{type:i,value:Tf.getValue(t)})},onInvalid:function(t){vr(t,tS,{type:i,value:Tf.getValue(t)})}},validator:{validate:function(t){var n=Tf.getValue(t),e=u(n)?Re.value(!0):Re.error(f("aria.input.invalid"));return Ly(e)},validateOnLoad:!1}})),fy.config({})]),onSetValue:function(t){Gy.isInvalid(t)&&Gy.run(t).get(st)}})],s="hex"!==n?[sy.parts["aria-descriptor"]({text:a})]:[];return{dom:{tag:"div",attributes:{role:"presentation"}},components:c.concat(s)}}function h(t,n){var e=n.red,o=n.green,r=n.blue;Tf.setValue(t,{red:e,green:o,blue:r})}function v(t,n){b.getOpt(t).each(function(t){fn(t.element,"background-color","#"+n.value)})}var b=Pm({dom:{tag:"div",classes:[d("rgba-preview")],styles:{"background-color":"white"},attributes:{role:"presentation"}}});return wl({factory:function(){function a(t){return o[t].get()}function c(t,n){o[t].set(n)}function n(t,n){var e=n.event;"hex"!==e.type?c(e.type,vt.none()):g(t)}function e(t,n){var r,e,o,i,u=n.event;"hex"===u.type?function(t,n){m(t);var e=Dv(n);c("hex",vt.some(n));var o=Vv(e);h(t,o),s(o),vr(t,qw,{hex:e}),v(t,e)}(t,u.value):(r=t,e=u.type,o=u.value,i=parseInt(o,10),c(e,vt.some(i)),a("red").bind(function(e){return a("green").bind(function(n){return a("blue").map(function(t){return Fv(e,n,t,1)})})}).each(function(t){var n,e,o=(n=r,e=Av(t),Qw.getField(n,"hex").each(function(t){Vg.isFocused(t)||Tf.setValue(n,{hex:e.value})}),e);vr(r,qw,{hex:o}),v(r,o)}))}function t(t){return{label:f(eS+t+".label"),description:f(eS+t+".description")}}function s(t){var n=t.red,e=t.green,o=t.blue;c("red",vt.some(n)),c("green",vt.some(e)),c("blue",vt.some(o))}var o={red:Vo(vt.some(255)),green:Vo(vt.some(255)),blue:Vo(vt.some(255)),hex:Vo(vt.some("ffffff"))},r=t("red"),i=t("green"),u=t("blue"),l=t("hex");return Xo(Qw.sketch(function(t){return{dom:{tag:"form",classes:[d("rgb-form")],attributes:{"aria-label":f("aria.color.picker")}},components:[t.field("red",sy.sketch(p(Iv,"red",r.label,r.description,255))),t.field("green",sy.sketch(p(Iv,"green",i.label,i.description,255))),t.field("blue",sy.sketch(p(Iv,"blue",u.label,u.description,255))),t.field("hex",sy.sketch(p(Bv,"hex",l.label,l.description,"ffffff"))),b.asSpec()],formBehaviours:tc([Gy.config({invalidClass:d("form-invalid")}),fm("rgb-form-events",[Cr(Zw,e),Cr(tS,n),Cr(nS,n)])])}}),{apis:{updateHex:function(t,n){var e;Tf.setValue(t,{hex:n.value}),h(t,e=Vv(n)),s(e),v(t,n)}}})},name:"RgbForm",configFields:[],apis:{updateHex:function(t,n,e){t.updateHex(n,e)}},extraApis:{}})}function o0(x,w){return wl({name:"ColourPicker",configFields:[fo("dom"),To("onValidHex",st),To("onInvalidHex",st)],factory:function(t){function n(t,n,e){v.getOpt(t).each(function(t){g.setHue(t,e)})}function e(t,n){b.getOpt(t).each(function(t){m.updateHex(t,n)})}function r(n,e,o,t){var r=o,i=Vv(e);p.paletteRgba.set(i),p.paletteHue.set(r),St(t,function(t){t(n,e,o)})}var o,i,u,a,c,s,l,f,d,m=e0(x,w,t.onValidHex,t.onInvalidHex),g=(l=w,f=Yw.parts.spectrum({dom:{tag:"canvas",attributes:{role:"presentation"},classes:[l("sv-palette-spectrum")]}}),d=Yw.parts.thumb({dom:{tag:"div",attributes:{role:"presentation"},classes:[l("sv-palette-thumb")],innerHtml:"'}}),wl({factory:function(t){var n=rt({x:0,y:0}),e=tc([ud.config({find:vt.some}),Vg.config({})]);return Yw.sketch({dom:{tag:"div",attributes:{role:"presentation"},classes:[l("sv-palette")]},model:{mode:"xy",getInitialValue:n},rounded:!1,components:[f,d],onChange:function(t,n,e){vr(t,Jw,{value:e})},onInit:function(t,n,e,o){y(e.element.dom,zv(sb))},sliderBehaviours:e})},name:"SaturationBrightnessPalette",configFields:[],apis:{setHue:function(t,n,e){var o=e;y(n.components()[0].element.dom,zv(Rv(Lv(o,100,100))))},setThumb:function(t,n,e){var o=n,r=Wv(Vv(e));Yw.setValue(o,{x:r.saturation,y:100-r.value})}},extraApis:{}})),p={paletteRgba:Vo(sb),paletteHue:Vo(0)},h=Pm((i=Yw.parts.spectrum({dom:{tag:"div",classes:[(o=w)("hue-slider-spectrum")],attributes:{role:"presentation"}}}),u=Yw.parts.thumb({dom:{tag:"div",classes:[o("hue-slider-thumb")],attributes:{role:"presentation"}}}),Yw.sketch({dom:{tag:"div",classes:[o("hue-slider")],attributes:{role:"presentation"}},rounded:!1,model:{mode:"y",getInitialValue:rt({y:0})},components:[i,u],sliderBehaviours:tc([Vg.config({})]),onChange:function(t,n,e){vr(t,Kw,{value:e})}}))),v=Pm(g.sketch({})),b=Pm(m.sketch({}));function y(t,n){var e,o,r=t.width,i=t.height,u=t.getContext("2d");null!==u&&(u.fillStyle=n,u.fillRect(0,0,r,i),(e=u.createLinearGradient(0,0,r,0)).addColorStop(0,"rgba(255,255,255,1)"),e.addColorStop(1,"rgba(255,255,255,0)"),u.fillStyle=e,u.fillRect(0,0,r,i),(o=u.createLinearGradient(0,0,0,i)).addColorStop(0,"rgba(0,0,0,0)"),o.addColorStop(1,"rgba(0,0,0,1)"),u.fillStyle=o,u.fillRect(0,0,r,i))}return{uid:t.uid,dom:t.dom,components:[v.asSpec(),h.asSpec(),b.asSpec()],behaviours:tc([fm("colour-picker-events",[Cr(qw,(s=[n,function(t,n,e){h.getOpt(t).each(function(t){Yw.setValue(t,{y:100-e/360*100})})},function(t,n){v.getOpt(t).each(function(t){g.setThumb(t,n)})}],function(t,n){var e=n.event.hex;r(t,e,Wv(Vv(e)).hue,s)})),Cr(Jw,(c=[e],function(t,n){var e=n.event.value,o=p.paletteHue.get();r(t,Uv(Lv(o,e.x,100-e.y)),o,c)})),Cr(Kw,(a=[n,e],function(t,n){var e=(100-n.event.value.y)/100*360,o=Wv(p.paletteRgba.get());r(t,Uv(Lv(e,o.saturation,o.value)),e,a)}))]),ud.config({find:function(t){return b.getOpt(t)}}),Mg.config({mode:"acyclic"})])}}})}function r0(t){return iS[t]}function i0(t,n,e){return Tf.config(Xo({store:{mode:"manual",getValue:n,setValue:e}},t.map(function(t){return{store:{initialValue:t}}}).getOr({})))}function u0(r,i){function n(t,n){n.stop()}function e(t){return function(n,e){St(t,function(t){t(n,e)})}}function o(t,n){var e;dd.isDisabled(t)||(e=n.event.raw,a(t,e.dataTransfer.files))}function u(t,n){var e=n.event.raw.target;a(t,e.files)}function a(t,n){var e,o;Tf.setValue(t,(e=n,o=aS.explode(i.getSetting("images_file_types","jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp","string")),F(Ct(e),function(n){return T(o,function(t){return Bt(n.name.toLowerCase(),"."+t.toLowerCase())})}))),vr(t,py,{name:r.name})}var c=Pm({dom:{tag:"input",attributes:{type:"file",accept:"image/*"},styles:{display:"none"}},behaviours:tc([fm("input-file-events",[Er(Ci()),Er(Ri())])])});return Qb(r.label.map(function(t){return Zb(t,i)}),sy.parts.field({factory:{sketch:function(t){return{uid:t.uid,dom:{tag:"div",classes:["tox-dropzone-container"]},behaviours:tc([fS([]),ow(),dd.config({}),zg.config({toggleClass:"dragenter",toggleOnExecute:!1}),fm("dropzone-events",[Cr("dragenter",e([n,zg.toggle])),Cr("dragleave",e([n,zg.toggle])),Cr("dragover",n),Cr("drop",e([n,o])),Cr(Si(),u)])]),components:[{dom:{tag:"div",classes:["tox-dropzone"],styles:{}},components:[{dom:{tag:"p",innerHtml:i.translate("Drop an image here")}},sp.sketch({dom:{tag:"button",innerHtml:i.translate("Browse for an image"),styles:{position:"relative"},classes:["tox-button","tox-button--secondary"]},components:[c.asSpec()],action:function(t){c.get(t).element.dom.click()},buttonBehaviours:tc([fy.config({}),Kv(i.isDisabled),mv()])})]}]}}}}),["tox-form__group--stretched"],[])}function a0(t){return{dom:{tag:"div",styles:{width:"1px",height:"1px",outline:"none"},attributes:{tabindex:"0"},classes:t},behaviours:tc([Vg.config({ignore:!0}),fy.config({})])}}function c0(t){return{dom:{tag:"div",classes:["tox-navobj"]},components:[a0([dS]),t,a0([mS])],behaviours:tc([rS(1)])}}function s0(t,n){vr(t,yi(),{raw:{which:9,shiftKey:n}})}function l0(t,n){var e=n.element;qr(e,dS)?s0(t,!0):qr(e,mS)&&s0(t,!1)}function f0(t){return Ub(t,["."+dS,"."+mS].join(","),O)}function d0(t,n){return hS(document.createElement("canvas"),t,n)}function m0(t){var n=d0(t.width,t.height);return pS(n).drawImage(t,0,0),n}function g0(t){return t.naturalWidth||t.width}function p0(t){return t.naturalHeight||t.height}function h0(t,o,r){return o=o||"image/png",m(HTMLCanvasElement.prototype.toBlob)?new Vy(function(n,e){t.toBlob(function(t){t?n(t):e()},o,r)}):(g=t.toDataURL(o,r),new Vy(function(t,n){!function(){var t=g.split(","),n=/data:([^;]+)/.exec(t[0]);if(!n)return vt.none();for(var e=n[1],o=t[1],r=atob(o),i=r.length,u=Math.ceil(i/1024),a=new Array(u),c=0;c").css({position:"absolute",top:0,left:0,width:l.width,height:l.height,zIndex:2147483647,opacity:1e-4,cursor:s}).appendTo(b.body),GS(b).on("mousemove touchmove",m).on("mouseup touchend",x),d.start(t)}),{destroy:function(){GS(y).off()}}}function KS(t,n,e,o,r){return j0({name:t,icon:vt.some(n),disabled:e,tooltip:vt.some(t),primary:!1,borderless:!1},o,r)}function JS(t,n){n?dd.enable(t):dd.disable(t)}var $S=0,QS=function(s,e,l,o,r){function f(t,n){return{x:n.x-t.x,y:n.y-t.y,w:n.w,h:n.h}}function u(t,n,e,o){var r,i=n.x,u=n.y,a=n.w,c=n.h;i+=e*t.deltaX,u+=o*t.deltaY,a+=e*t.deltaW,c+=o*t.deltaH,s=jS.clamp({x:i,y:u,w:a=a<20?20:a,h:c=c<20?20:c},l,"move"===t.name),r=f(l,s),p.fire("updateRect",{rect:r}),g(r)}function i(t){n(s=t)}function n(n){function t(t,n){n.h<0&&(n.h=0),n.w<0&&(n.w=0),GS("#"+c+"-"+t,o).css({left:n.x,top:n.y,width:n.w,height:n.h})}aS.each(d,function(t){GS("#"+c+"-"+t.name,o).css({left:n.w*t.xMul+n.x,top:n.h*t.yMul+n.y})}),t("top",{x:e.x,y:e.y,w:e.w,h:n.y-e.y}),t("right",{x:n.x+n.w,y:n.y,w:e.w-n.x-n.w+e.x,h:n.h}),t("bottom",{x:e.x,y:n.y+n.h,w:e.w,h:e.h-n.y-n.h+e.y}),t("left",{x:e.x,y:n.y,w:n.x-e.x,h:n.h}),t("move",n)}var t,a="tox-",c="tox-crid-"+$S++,d=[{name:"move",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:0,deltaH:0,label:"Crop Mask"},{name:"nw",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:-1,deltaH:-1,label:"Top Left Crop Handle"},{name:"ne",xMul:1,yMul:0,deltaX:0,deltaY:1,deltaW:1,deltaH:-1,label:"Top Right Crop Handle"},{name:"sw",xMul:0,yMul:1,deltaX:1,deltaY:0,deltaW:-1,deltaH:1,label:"Bottom Left Crop Handle"},{name:"se",xMul:1,yMul:1,deltaX:0,deltaY:0,deltaW:1,deltaH:1,label:"Bottom Right Crop Handle"}],m=["top","right","bottom","left"],g=function(t){var n;i((n=l,{x:t.x+n.x,y:t.y+n.y,w:t.w,h:t.h}))};GS('
    ').appendTo(o),aS.each(m,function(t){GS("#"+c,o).append('').css(_e({},r)).appendTo(i)[0];return f.set({caret:o,element:t,before:e}),e&&Wa(o).addClass("mce-visual-caret-before"),c=_r.setInterval(function(){u()?Wa("div.mce-visual-caret",i).toggleClass("mce-visual-caret-hidden"):Wa("div.mce-visual-caret",i).addClass("mce-visual-caret-hidden")},500),(n=t.ownerDocument.createRange()).setStart(l,0),n.setEnd(l,0),n},hide:s,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){f.on(function(e){var t=js(i,e.element,e.before);Wa(e.caret).css(_e({},t))})},destroy:function(){return _r.clearInterval(c)}}}function qs(){return bc.isIE()||bc.isEdge()||bc.isFirefox()}function $s(e){return wc(e)||cn(e)&&qs()}function Ws(e,t){for(var n;n=e(t);)if(!_c(n))return n;return null}function Ks(e,t,n,r,o){var i=new Rr(e,r),a=Sc(e)||_c(e);if(t<0){if(a&&n(e=Ws(i.prev.bind(i),!0)))return e;for(;e=Ws(i.prev.bind(i),o);)if(n(e))return e}if(0=a.data.length-1)return 1===e&&(r=i(a))?Dc(r):n;if(No(a)&&u<=1)return-1===e&&(r=o(a))?Tc(r):n;if(u===a.data.length)return(r=i(a))?Dc(r):n;if(0===u)return(r=o(a))?Tc(r):n}return n}function ec(e,t){return ve.from(Gs(e?0:-1,t)).filter(Sc)}function tc(e,t,n){var r=Zs(e,t,n);return-1===e?as.fromRangeStart(r):as.fromRangeEnd(r)}function nc(e){return ve.from(e.getNode()).map(Nt.fromDom)}function rc(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function oc(e,t){var n=Ys(e,t);return!(n||!Wn(e.getNode()))||n}as.fromRangeStart=function(e){return as(e.startContainer,e.startOffset)},as.fromRangeEnd=function(e){return as(e.endContainer,e.endOffset)},as.after=function(e){return as(e.parentNode,rs(e)+1)},as.before=function(e){return as(e.parentNode,rs(e))},as.isAbove=function(e,t){return dn(Q(t.getClientRects()),Z(e.getClientRects()),Ru).getOr(!1)},as.isBelow=function(e,t){return dn(Z(t.getClientRects()),Q(e.getClientRects()),Du).getOr(!1)},as.isAtStart=function(e){return!!e&&e.isAtStart()},as.isAtEnd=function(e){return!!e&&e.isAtEnd()},as.isTextPosition=function(e){return!!e&&jn(e.container())},as.isElementPosition=function(e){return!1===as.isTextPosition(e)};var ic,ac,uc=jn,sc=sn,cc=Ja.nodeIndex,lc=function(e){var t=e.parentNode;return sc(t)?lc(t):t},fc=function(e){return e?me(e.childNodes,function(e,t){return sc(t)&&"BR"!==t.nodeName?e=e.concat(fc(t)):e.push(t),e},[]):[]},dc=Yn,mc=A(bs,u,!0),gc=Ja.DOM,pc=zn,hc=jn,vc=function(e){pc(e)&&Ir(e)&&(Mr(e)?e.removeAttribute("data-mce-caret"):Is(e)),hc(e)&&(Fs(e),0===e.data.length&&Is(e))},bc=dt().browser,yc=Yn,Cc=Jn,xc=Gn,wc=function(e){return yc(e)||Cc(e)},Sc=Yn,Ec=Jn,Nc=an("display","block table table-cell table-caption list-item"),kc=Ir,_c=Pr,Ac=zn,Rc=jr,Dc=A(Js,!0),Tc=A(Js,!1);function Oc(e,t){return e.hasChildNodes()&&tu.length-1)return qc(c,i,r)||function(t){return tf(i).fold(R,function(e){return t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0})}(r);i=u[s[o]]}3===i.nodeType&&(a=Math.min(s[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(s[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return 1}function Wc(e){return jn(e)&&0=t.data.length&&e.splice(0,1);var n=e[e.length-1];return 0===a&&0L(s)?(_=I(k*E),k=I(_/E)):(k=I(_/E),_=I(k*E))),m(h,k,_),t=b.startPos.x+u,n=b.startPos.y+s,T.setStyles(v,{left:t=0u.childNodes.length-1&&(f=!1),qn(u)&&(u=i,s=0),u===i){if(f&&(d=u.childNodes[0d.bottom&&Zt(n.element,!0===r)}function Yf(e,t,n){return jf(e,Kf,t,n)}function Gf(e,t,n){return qf(e,t,Kf,n)}function Jf(e,t,n){return jf(e,Xf,t,n)}function Qf(e,t,n){return qf(e,t,Xf,n)}function Zf(e,t,n){(e.inline?Yf:Jf)(e,t,n)}function ed(e){var t=Bn(e).dom;return e.dom===t.activeElement}function td(e){return void 0===e&&(e=Nt.fromDom(document)),ve.from(e.dom.activeElement).map(Nt.fromDom)}function nd(e,t){var n=_n(t)?Pl(t).length:Dn(t).length+1;return n\ufeff'),qt(s.element,c),Hf(c,function(){return Ln(c)}));Vf(e,i,t,l,r),l.cleanup()},Rd=function(e,t,n){var r=n.startContainer,o=n.startOffset,i=n.endContainer,a=n.endOffset;t(Nt.fromDom(r),Nt.fromDom(i));var u=e.dom.createRng();u.setStart(r,o),u.setEnd(i,a),e.selection.setRng(n)},Dd=or([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Td=(Dd.before,Dd.on,Dd.after,function(e){return e.fold(u,u,u)}),Od=or([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Bd={domRange:Od.domRange,relative:Od.relative,exact:Od.exact,exactFromRange:function(e){return Od.exact(e.start,e.soffset,e.finish,e.foffset)},getWin:function(e){return Tt(e.match({domRange:function(e){return Nt.fromDom(e.startContainer)},relative:function(e,t){return Td(e)},exact:function(e,t,n,r){return e}}))},range:function(e,t,n,r){return{start:e,soffset:t,finish:n,foffset:r}}},Pd=dt().browser,Ld={isEditorUIElement:function(e){var t=e.className.toString();return-1!==t.indexOf("tox-")||-1!==t.indexOf("mce-")}},Id=Ja.DOM,Md=function(e){return e.editorManager.setActive(e)},Fd={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},Ud=(zd.create=function(e,t){var n=new zd(e,Fd[e]||1);return t&&ne(t,function(e,t){n.attr(t,e)}),n},zd.prototype.replace=function(e){return e.parent&&e.remove(),this.insert(e,this),this.remove(),this},zd.prototype.attr=function(e,t){var n,r=this;if("string"!=typeof e)return null!=e&&ne(e,function(e,t){r.attr(t,e)}),r;if(n=r.attributes){if(void 0===t)return n.map[e];if(null===t){if(e in n.map){delete n.map[e];for(var o=n.length;o--;)if(n[o].name===e)return n.splice(o,1),r}return r}if(e in n.map){for(o=n.length;o--;)if(n[o].name===e){n[o].value=t;break}}else n.push({name:e,value:t});return n.map[e]=t,r}},zd.prototype.clone=function(){var e,t=new zd(this.name,this.type);if(e=this.attributes){var n=[];n.map={};for(var r=0,o=e.length;r=u.length)for(n=0,r=a.length;n=u.length||a[n]!==u[n]){o=n+1;break}if(a.length=a.length||a[n]!==u[n]){o=n+1;break}if(1===o)return t;for(n=0,r=a.length-(o-1);n]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g,i=e.getShortEndedElements(),a=1,u=n;0!==a;)for(r.lastIndex=u;;){var s=r.exec(t);if(null===s)return u;if("!"===s[1]){u=Ge(s[2],"--")?Qd(t,!1,s.index+"!--".length):Qd(t,!0,s.index+1);break}o.lastIndex=r.lastIndex;var c=o.exec(t);if(!l(c)&&c.index===r.lastIndex){"/"===s[1]?--a:Ne(i,s[2])||(a+=1),u=r.lastIndex+c[0].length;break}}return u}function Gd(q,$){var e;void 0===$&&($=to());var W=null!==(e=(q=q||{}).document)&&void 0!==e?e:document,K=W.createElement("form");function n(s,e){void 0===e&&(e="html");for(var t,i,n,c,r,o,a,l,u,f,d,m,g,p,h,v,b,y,C,x=s.html,w=0,S=[],E=0,N=Go.decode,k=Et.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),_="html"===e?0:1,A=function(e){for(var t,n=S.length;n--&&S[n].name!==e;);if(0<=n){for(t=S.length-1;n<=t;t--)(e=S[t]).valid&&Q(e.name);S.length=n}},R=function(e,t){return G(Hd(e,s),t)},D=function(e){""!==e&&(">"===e.charAt(0)&&(e=" "+e),q.allow_conditional_comments||"[if"!==e.substr(0,3).toLowerCase()||(e=" "+e),X(Hd(e,s)))},T=function(e,t){var n=e||"",r=!Ge(n,"--"),o=Qd(x,r,t);return e=x.substr(t,o-t),D(r?n+e:e),o+1},O=new RegExp("<(?:(?:!--([\\w\\W]*?)--!?>)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:![Dd][Oo][Cc][Tt][Yy][Pp][Ee]([\\w\\W]*?)>)|(?:!(--)?)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_:.]*)(\\s(?:[^'\">]+(?:\"[^\"]*\"|'[^']*'))*[^\"'>]*(?:\"[^\">]*|'[^'>]*)?|\\s*|\\/)>))","g"),B=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,P=$.getShortEndedElements(),L=q.self_closing_elements||$.getSelfClosingElements(),I=$.getBoolAttrs(),M=q.validate,F=q.remove_internals,U=q.fix_self_closing,z=$.getSpecialElements(),H=x+">";t=O.exec(H);){var j=t[0];if(wx.length){R(N(x.substr(t.index))),w=t.index+j.length;continue}u=(i=":"===(i=i.toLowerCase()).charAt(0)?i.substr(1):i)in P,U&&L[i]&&0.*/.test(r.substr(u)))){var o=r.indexOf("[endif]",n);return r.indexOf(">",o)}if(t){var i=r.indexOf(">",n);return-1!==i?i:r.length}var a=/--!?>/g;a.lastIndex=n;var u,s=a.exec(e);return s?s.index+s[0].length:r.length};function Zd(e,t){for(var n,r,o,i,a=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,u=e.schema,s=(n=e.getTempAttrs(),r=t,o=new RegExp(["\\s?("+n.join("|")+')="[^"]+"'].join("|"),"gi"),r.replace(o,"")),c=u.getShortEndedElements();i=a.exec(s);){var l=a.lastIndex,f=i[0].length,d=c[i[1]]?l:Gd.findEndTag(u,s,l),s=s.substring(0,l-f)+s.substring(d);a.lastIndex=l-f}return wo(s)}function em(o){return{compare:function(e,t){return e.nodeName===t.nodeName&&!(!r(n(e),n(t))||!r(o.parseStyle(o.getAttrib(e,"style")),o.parseStyle(o.getAttrib(t,"style")))||Yc(e)||Yc(t));function n(n){var r={};return om(o.getAttribs(n),function(e){var t=e.nodeName.toLowerCase();0!==t.indexOf("_")&&"style"!==t&&0!==t.indexOf("data-")&&(r[t]=o.getAttrib(n,t))}),r}function r(e,t){var n,r;for(r in e)if(Ne(e,r)){if(void 0===(n=t[r]))return;if(e[r]!==n)return;delete t[r]}for(r in t)if(Ne(t,r))return;return 1}}}}function tm(e){var u=[],s=(e=e||{}).indent,c=im(e.indent_before||""),l=im(e.indent_after||""),f=Go.getEncodeFunc(e.entity_encoding||"raw",e.entities),d="html"===e.element_format;return{start:function(e,t,n){var r,o,i,a;if(s&&c[e]&&0":" />",n&&s&&l[e]&&0"),s&&l[e]&&0")},comment:function(e){u.push("\x3c!--",e,"--\x3e")},pi:function(e,t){t?u.push(""):u.push(""),s&&u.push("\n")},doctype:function(e){u.push("",s?"\n":"")},reset:function(){u.length=0},getContent:function(){return u.join("").replace(/\n$/,"")}}}function nm(t,g){void 0===g&&(g=to());var p=tm(t);return(t=t||{}).validate=!("validate"in t)||t.validate,{serialize:function(e){var f=t.validate,d={3:function(e){p.text(e.value,e.raw)},8:function(e){p.comment(e.value)},7:function(e){p.pi(e.name,e.value)},10:function(e){p.doctype(e.value)},4:function(e){p.cdata(e.value)},11:function(e){if(e=e.firstChild)for(;m(e),e=e.next;);}};p.reset();var m=function(e){var t=d[e.type];if(t)t(e);else{var n=e.name,r=e.shortEnded,o=e.attributes;if(f&&o&&1'))}function gm(n){Ut(n).each(function(t){Bt(t).each(function(e){lo(n)&&Br(t)&&lo(e)&&Ln(t)})})}function pm(e,t){return o=R,Ve(r=t,n=e)?function(e,t){for(var n=y(t)?t:R,r=e.dom,o=[];null!==r.parentNode&&void 0!==r.parentNode;){var i=r.parentNode,a=Nt.fromDom(i);if(o.push(a),!0===n(a))break;r=i}return o}(n,function(e){return o(e)||je(e,r)}).slice(0,-1):[];var n,r,o}function hm(e,t){return[e].concat(pm(e,t))}function vm(e,t,n){return Jl(e,t,n,cm)}function bm(e,t){return M(hm(Nt.fromDom(t.container()),e),lo)}function ym(e,n,r){return vm(e,n.dom,r).forall(function(t){return bm(n,r).fold(function(){return!1===Ys(t,r,n.dom)},function(e){return!1===Ys(t,r,n.dom)&&Ve(e,Nt.fromDom(t.container()))})})}function Cm(t,n,r){return bm(n,r).fold(function(){return vm(t,n.dom,r).forall(function(e){return!1===Ys(e,r,n.dom)})},function(e){return vm(t,e.dom,r).isNone()})}function xm(e){return nc(e).exists(Br)}function wm(e,t,n){var r=Q(U(hm(Nt.fromDom(n.container()),t),lo)).getOr(t);return Gl(e,r.dom,n).filter(xm)}function Sm(e,t){return nc(t).exists(Br)||wm(!0,e,t).isSome()}function Em(e,t){return ve.from(t.getNode(!0)).map(Nt.fromDom).exists(Br)||wm(!1,e,t).isSome()}function Nm(e){return as.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd()}function km(e,t){return Q(U(hm(Nt.fromDom(t.container()),e),lo)).getOr(e)}function _m(e,t){return Nm(t)?Kg(t):Kg(t)||Zl(km(e,t).dom,t).exists(Kg)}function Am(e,t){return Nm(t)?Wg(t):Wg(t)||Ql(km(e,t).dom,t).exists(Wg)}function Rm(e){return nc(e).bind(function(e){return pr(e,kn)}).exists(function(e){return D(["pre","pre-wrap"],xn(e,"white-space"))})}function Dm(e,t){return!Rm(t)&&(np(e,t)||op(e,t)||Em(e,t)||_m(e,t))}function Tm(e,t){return!Rm(t)&&(rp(e,t)||ip(e,t)||Sm(e,t)||Am(e,t))}function Om(e,t){return Dm(e,t)||Tm(e,(r=(n=t).container(),o=n.offset(),jn(r)&&o=e.data.length&&Tm(o,as(e,e.data.length)),u=0===t&&Dm(o,as(e,0)),e.replaceData(t,n,(c=u,l=a,L(s=i,function(e,t){return Gc(t)||of(t)?e.previousCharIsSpace||""===e.str&&c||e.str.length===s.length-1&&l?{previousCharIsSpace:!1,str:e.str+yo}:{previousCharIsSpace:!0,str:e.str+" "}:{previousCharIsSpace:!1,str:e.str+t}},{previousCharIsSpace:!1,str:""}).str)))}function Fm(e,t){var n=e.data.slice(t);Mm(e,t,n.length-Qe(n).length)}function Um(e,t){var n=e.data.slice(0,t),r=n.length-Ze(n).length;Mm(e,t-r,r)}function zm(e,t,n,r){void 0===r&&(r=!0);var o=Ze(e.data).length,i=r?e:t,a=r?t:e;return r?i.appendData(a.data):i.insertData(0,a.data),Ln(Nt.fromDom(a)),n&&Fm(i,o),i}function Hm(e,t){return r=e,o=(n=t).container(),i=n.offset(),!1===as.isTextPosition(n)&&o===r.parentNode&&i>as.before(r).offset()?as(t.container(),t.offset()-1):t;var n,r,o,i}function jm(e){return jr(e.previousSibling)?ve.some((t=e.previousSibling,jn(t)?as(t,t.data.length):as.after(t))):e.previousSibling?tf(e.previousSibling):ve.none();var t}function Vm(e){return jr(e.nextSibling)?ve.some((t=e.nextSibling,jn(t)?as(t,0):as.before(t))):e.nextSibling?ef(e.nextSibling):ve.none();var t}function qm(r,o){return jm(o).orThunk(function(){return Vm(o)}).orThunk(function(){return e=r,n=as.before((t=o).previousSibling||t.parentNode),Zl(e,n).fold(function(){return Ql(e,as.after(t))},ve.some);var e,t,n})}function $m(n,r){return Vm(r).orThunk(function(){return jm(r)}).orThunk(function(){return Ql(e=n,as.after(t=r)).fold(function(){return Zl(e,as.before(t))},ve.some);var e,t})}function Wm(t,n,e){e.fold(function(){t.focus()},function(e){t.selection.setRng(e.toRange(),n)})}function Km(e,t){return t&&Ne(e.schema.getBlockElements(),kt(t))}function Xm(e){if(Wr(e)){var t=Nt.fromHtml('
    ');return Xt(e),Pn(e,t),ve.some(as.before(t.dom))}return ve.none()}function Ym(t,n,e,r){void 0===r&&(r=!0);var o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(p=n,h=t.getBody(),v=e.dom,(p?$m:qm)(h,v).map(A(Hm,v))),y=gr(e,A(Km,t),(o=t.getBody(),function(e){return e.dom===o})),C=(u=b,i=a=e,s=Ne(t.schema.getTextInlineElements(),kt(i)),m=Bt(a).filter(_n),g=Pt(a).filter(_n),Ln(a),l=g,f=u,d=function(e,t,n){var r=e.dom,o=t.dom,i=r.data.length;return zm(r,o,s),n.container()===o?as(r,i):n},((c=m).isSome()&&l.isSome()&&f.isSome()?ve.some(d(c.getOrDie(),l.getOrDie(),f.getOrDie())):ve.none()).orThunk(function(){return s&&(m.each(function(e){return Um(e.dom,e.dom.length)}),g.each(function(e){return Fm(e.dom,0)})),u}));t.dom.isEmpty(t.getBody())?(t.setContent(""),t.selection.setCursorLocation()):y.bind(Xm).fold(function(){r&&Wm(t,n,C)},function(e){r&&Wm(t,n,ve.some(e))})}function Gm(e){return hu(e,"td,th")}function Jm(e,t){return{start:e,end:t}}function Qm(e,t){return br(Nt.fromDom(e),"td,th",t)}function Zm(e){return!je(e.start,e.end)}function eg(e,n){return Al(e.start,n).bind(function(t){return Al(e.end,n).bind(function(e){return je(t,e)?ve.some(t):ve.none()})})}function tg(e){return function(t){return eg(t,e).map(function(e){return{rng:t,table:e,cells:Gm(e)}})}}function ng(e,t,n,r){if(n.collapsed||!e.forall(Zm))return ve.none();if(t.isSameTable){var o=e.bind(tg(r));return ve.some({start:o,end:o})}var i,a,u=Qm(n.startContainer,r),s=Qm(n.endContainer,r),c=u.bind((a=r,function(t){return Al(t,a).bind(function(e){return Z(Gm(e)).map(function(e){return Jm(t,e)})})})).bind(tg(r)),l=s.bind((i=r,function(t){return Al(t,i).bind(function(e){return Q(Gm(e)).map(function(e){return Jm(e,t)})})})).bind(tg(r));return ve.some({start:c,end:l})}function rg(e,t){return z(e,function(e){return je(e,t)})}function og(n){return dn(rg(n.cells,n.rng.start),rg(n.cells,n.rng.end),function(e,t){return n.cells.slice(e,t+1)})}function ig(e,t){var n=t.startTable,r=t.endTable,o=e.cloneRange();return n.each(function(e){return o.setStartAfter(e.dom)}),r.each(function(e){return o.setEndBefore(e.dom)}),o}function ag(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(n=e,function(e){return je(n,e)}),y=dn(Qm((r=t).startContainer,o=b),Qm(r.endContainer,o),Jm),C=(l=b,f=x((c=t).startContainer),d=x(c.endContainer),m=f.isSome(),g=d.isSome(),p=dn(f,d,je).getOr(!1),{startTable:f,endTable:d,isStartInTable:m,isEndInTable:g,isSameTable:p,isMultiTable:!p&&m&&g});function x(e){return Al(Nt.fromDom(e),l)}return h=t,v=b,y.exists(function(e){return!Zm(t=e)&&eg(t,v).exists(function(e){var t=e.dom.rows;return 1===t.length&&1===t[0].cells.length})&&Rl(e.start,h);var t})?y.map(function(e){return sp.singleCellTable(t,e.start)}):C.isMultiTable?ng(y,u=C,s=t,b).bind(function(e){var t=e.start,n=e.end,r=t.bind(og).getOr([]),o=n.bind(og).getOr([]);if(0)?$/," "):i.replace(/ ()?$/," "));var c=e.parser,l=n.merge,f=nm({validate:e.getParam("validate")},e.schema),d='',m=e.fire("BeforeSetContent",{content:t,format:"html",selection:!0,paste:n.paste});if(m.isDefaultPrevented())e.fire("SetContent",{content:m.content,format:"html",selection:!0,paste:n.paste});else{-1===(t=m.content).indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,d);var g,p,h=(g=u.getRng()).startContainer||(g.parentElement?g.parentElement():null),v=e.getBody();h===v&&u.isCollapsed()&&s.isBlock(v.firstChild)&&((p=v.firstChild)&&!e.schema.getShortEndedElements()[p.nodeName])&&s.isEmpty(v.firstChild)&&((g=s.createRng()).setStart(v.firstChild,0),g.setEnd(v.firstChild,0),u.setRng(g)),u.isCollapsed()||function(e){var t=e.dom,n=vg(e.selection.getRng());e.selection.setRng(n);var r,o=t.getParent(n.startContainer,mp),i=n;null!==(r=o)&&r===t.getParent(i.endContainer,mp)&&Rl(Nt.fromDom(r),i)?lp(e,n,Nt.fromDom(o)):e.getDoc().execCommand("Delete",!1,null)}(e);var b,y,C,x,w,S,E,N,k,_,A,R,D,T,O={context:(I=u.getNode()).nodeName.toLowerCase(),data:n.data,insert:!0},B=c.parse(t,O);if(!0===n.paste&&bg(e.schema,B)&&Cg(s,I))return g=wg(f,s,u.getRng(),B),u.setRng(g),void e.fire("SetContent",m);if(function(){for(var e=B;e=e.walk();)1===e.type&&e.attr("data-mce-fragment","1")}(),"mce_marker"===(L=B.lastChild).attr("id"))for(var P=L,L=L.prev;L;L=L.walk(!0))if(3===L.type||!s.isBlock(L.name)){e.schema.isValidChild(L.parent.name,"span")&&L.parent.insert(P,L,"br"===L.name);break}if(e._selectionOverrides.showBlockCaretContainer(I),O.invalid){e.selection.setContent(d);var I=u.getNode(),M=e.getBody();for(9===I.nodeType?I=L=M:L=I;L!==M;)L=(I=L).parentNode;t=I===M?M.innerHTML:s.getOuterHTML(I),t=f.serialize(c.parse(t.replace(//i,function(){return f.serialize(B)}))),I===M?s.setHTML(M,t):s.setOuterHTML(I,t)}else b=e,y=t=f.serialize(B),"all"===(C=I).getAttribute("data-mce-bogus")?C.parentNode.insertBefore(b.dom.createFragment(y),C):(x=C.firstChild,w=C.lastChild,!x||x===w&&"BR"===x.nodeName?b.dom.setHTML(C,y):b.selection.setContent(y));E=l,_=(S=e).schema.getTextInlineElements(),A=S.dom,E&&(N=S.getBody(),k=em(A),Et.each(A.select("*[data-mce-fragment]"),function(e){if(V(_[e.nodeName.toLowerCase()])&&j(um(A,e),function(e){return!am.has(e)}))for(var t=e.parentNode;V(t)&&t!==N&&!function(r,o,i){function a(e){var t=r.getStyle(o,e),n=r.getStyle(i,e);return Be(t)&&Be(n)&&t!==n}var e=um(r,o),u=um(r,i);return F(e,function(t){function e(e){return F(e,function(e){return e===t})}if(e(u)||!e($g))return a(t);var n=U(u,function(t){return F($g,function(e){return Ge(t,e)})});return F(n,a)})}(A,e,t);t=t.parentNode)if(k.compare(t,e)){A.remove(e,!0);break}})),function(n,e){var t,r=n.dom,o=n.selection;if(e){o.scrollIntoView(e);var i=pf(n.getBody(),e);if("false"===r.getContentEditable(i))return r.remove(e),o.select(i);var a,u=r.createRng(),s=e.previousSibling;jn(s)?(u.setStart(s,s.nodeValue.length),xt.ie||(a=e.nextSibling,jn(a)&&(s.appendData(a.data),a.parentNode.removeChild(a)))):(u.setStartBefore(e),u.setEndBefore(e));var c=r.getParent(e,r.isBlock);r.remove(e),c&&r.isEmpty(c)&&(n.$(c).empty(),u.setStart(c,0),u.setEnd(c,0),mp(c)||c.getAttribute("data-mce-fragment")||!(t=function(e){var t=as.fromRangeStart(e);if(t=Pc(n.getBody()).next(t))return t.toRange()}(u))?r.add(c,r.create("br",{"data-mce-bogus":"1"})):(u=t,r.remove(c))),o.setRng(u)}}(e,s.get("mce_marker")),R=e.getBody(),Et.each(R.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")}),D=s,T=u.getStart(),ve.from(D.getParent(T,"td,th")).map(Nt.fromDom).each(gm),e.fire("SetContent",m),e.addVisual()}}function Eg(e){return e instanceof Ud}function Ng(e,t,n){var r;e.dom.setHTML(e.getBody(),t),!0!==n&&vd(r=e)&&ef(r.getBody()).each(function(e){var t=e.getNode(),n=cn(t)?ef(t).getOr(e):e;r.selection.setRng(n.toRange())})}function kg(u,s,e){var t,n=(t=s,_e(_e({format:"html"},e),{set:!0,content:Eg(t)?"":t})),c=e.no_events?n:u.fire("BeforeSetContent",n);return Eg(s)||(s=c.content),ve.from(u.getBody()).fold(J(s),function(e){return Eg(s)?function(e,t,n,r){var o,i,u,a;o=e.parser.getNodeFilters(),i=e.parser.getAttributeFilters(),u=n,a=function(e,n){var t,r,o={},i={},a=[];for(t in u.firstChild&&gp(u.firstChild,function(t){Y(e,function(e){e.name===t.name&&(o[e.name]?o[e.name].nodes.push(t):o[e.name]={filter:e,nodes:[t]})}),Y(n,function(e){"string"==typeof t.attr(e.name)&&(i[e.name]?i[e.name].nodes.push(t):i[e.name]={filter:e,nodes:[t]})})}),o)Ne(o,t)&&a.push(o[t]);for(r in i)Ne(i,r)&&a.push(i[r]);return a}(o,i),Y(a,function(t){Y(t.filter.callbacks,function(e){e(t.nodes,t.filter.name,{})})});var s=nm({validate:e.validate},e.schema).serialize(n);return r.content=vo(Nt.fromDom(t))?s:Et.trim(s),Ng(e,r.content,r.no_selection),r.no_events||e.fire("SetContent",r),n}(u,e,s,c):(t=u,n=e,o=c,0===(r=s).length||/^\s+$/.test(r)?(i='
    ',"TABLE"===n.nodeName?r="
    "+i+"
    + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/contract/cate/cate.json b/jun_pc_web/contract/cate/cate.json new file mode 100644 index 000000000..1c74b157d --- /dev/null +++ b/jun_pc_web/contract/cate/cate.json @@ -0,0 +1,337 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "销售合同12", + "status": 1, + "create_time": 1637987189, + "update_time": 1705305684 + }, + { + "id": 6, + "title": "其他合同", + "status": 1, + "create_time": 1637987199, + "update_time": 1704278725 + }, + { + "id": 5, + "title": "代理协议", + "status": 1, + "create_time": 1637987199, + "update_time": 1704027285 + }, + { + "id": 4, + "title": "委托协议", + "status": 1, + "create_time": 1637987199, + "update_time": 1702531435 + }, + { + "id": 3, + "title": "租赁合同", + "status": 1, + "create_time": 1637987199, + "update_time": 1700034214 + }, + { + "id": 2, + "title": "采购合同", + "status": 1, + "create_time": 1637987199, + "update_time": 1701063151 + }, + { + "id": 7, + "title": "123", + "status": 1, + "create_time": 1685947893, + "update_time": 1697563814 + }, + { + "id": 8, + "title": "发票合同", + "status": 1, + "create_time": 1686189424, + "update_time": 1697703563 + }, + { + "id": 9, + "title": "应酬合同", + "status": 1, + "create_time": 1686621411, + "update_time": 1689902356 + }, + { + "id": 10, + "title": "22", + "status": 1, + "create_time": 1686622052, + "update_time": 0 + }, + { + "id": 11, + "title": "测试合同", + "status": 1, + "create_time": 1686713827, + "update_time": 1698033470 + }, + { + "id": 12, + "title": "测试", + "status": 1, + "create_time": 1688021909, + "update_time": 1700212982 + }, + { + "id": 13, + "title": "是", + "status": 1, + "create_time": 1688115740, + "update_time": 1693974468 + }, + { + "id": 14, + "title": "房孺复", + "status": 1, + "create_time": 1688605635, + "update_time": 0 + }, + { + "id": 15, + "title": "222", + "status": 1, + "create_time": 1689216483, + "update_time": 0 + }, + { + "id": 16, + "title": "333", + "status": 0, + "create_time": 1689582974, + "update_time": 1689582979 + }, + { + "id": 17, + "title": "sad ", + "status": 0, + "create_time": 1690363243, + "update_time": 1690363246 + }, + { + "id": 18, + "title": "dfds", + "status": 0, + "create_time": 1690436639, + "update_time": 1691126534 + }, + { + "id": 19, + "title": "524", + "status": 0, + "create_time": 1691563236, + "update_time": 0 + }, + { + "id": 20, + "title": "劳动合同", + "status": 1, + "create_time": 1692178628, + "update_time": 1702691704 + }, + { + "id": 21, + "title": "k;lk;", + "status": 1, + "create_time": 1692677714, + "update_time": 0 + }, + { + "id": 22, + "title": "开发合同", + "status": 0, + "create_time": 1693392882, + "update_time": 0 + }, + { + "id": 23, + "title": "啊啊啊协议", + "status": 1, + "create_time": 1694655623, + "update_time": 0 + }, + { + "id": 24, + "title": "去去去", + "status": 0, + "create_time": 1694655656, + "update_time": 0 + }, + { + "id": 25, + "title": "测试类别1", + "status": 1, + "create_time": 1695451124, + "update_time": 1704863689 + }, + { + "id": 26, + "title": "买卖合同", + "status": 1, + "create_time": 1697181595, + "update_time": 0 + }, + { + "id": 27, + "title": "lll", + "status": 1, + "create_time": 1697251750, + "update_time": 0 + }, + { + "id": 28, + "title": "普通", + "status": 1, + "create_time": 1697259317, + "update_time": 0 + }, + { + "id": 29, + "title": "普通合同", + "status": 1, + "create_time": 1698657233, + "update_time": 1702451905 + }, + { + "id": 30, + "title": "威威", + "status": 1, + "create_time": 1699173127, + "update_time": 0 + }, + { + "id": 31, + "title": "11", + "status": 1, + "create_time": 1699491798, + "update_time": 0 + }, + { + "id": 32, + "title": "25464", + "status": 1, + "create_time": 1699867983, + "update_time": 0 + }, + { + "id": 33, + "title": "963", + "status": 0, + "create_time": 1700036705, + "update_time": 0 + }, + { + "id": 34, + "title": "新加类型", + "status": 0, + "create_time": 1700116905, + "update_time": 0 + }, + { + "id": 35, + "title": "AD", + "status": 1, + "create_time": 1700400079, + "update_time": 0 + }, + { + "id": 36, + "title": "212", + "status": 0, + "create_time": 1701225343, + "update_time": 0 + }, + { + "id": 37, + "title": "12", + "status": 1, + "create_time": 1701249442, + "update_time": 0 + }, + { + "id": 38, + "title": "\t 销售合同", + "status": 1, + "create_time": 1701310177, + "update_time": 0 + }, + { + "id": 39, + "title": "aaa", + "status": 1, + "create_time": 1701806638, + "update_time": 0 + }, + { + "id": 40, + "title": "kkk1111111111", + "status": 1, + "create_time": 1701862848, + "update_time": 0 + }, + { + "id": 41, + "title": "55", + "status": 1, + "create_time": 1702261091, + "update_time": 1702261120 + }, + { + "id": 42, + "title": "qq12", + "status": 1, + "create_time": 1702885950, + "update_time": 0 + }, + { + "id": 43, + "title": "1111", + "status": 1, + "create_time": 1702998894, + "update_time": 0 + }, + { + "id": 44, + "title": "23", + "status": 1, + "create_time": 1703660134, + "update_time": 0 + }, + { + "id": 45, + "title": "111", + "status": 1, + "create_time": 1704442778, + "update_time": 0 + }, + { + "id": 46, + "title": "..", + "status": 1, + "create_time": 1704690828, + "update_time": 0 + }, + { + "id": 47, + "title": "嘻嘻嘻", + "status": 1, + "create_time": 1704772393, + "update_time": 1704772401 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/contract/cate/cate2.html b/jun_pc_web/contract/cate/cate2.html new file mode 100644 index 000000000..f9aeb5d07 --- /dev/null +++ b/jun_pc_web/contract/cate/cate2.html @@ -0,0 +1,129 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +

    说明

    +

    合同性质分为:普通合同、框架合同、补充协议、其他合同

    +

    1、普通合同有合同金额,且金额为必填项;

    +

    2、框架合同无合同金额;

    +

    3、补充协议和其它合同有合同金额,但合同金额不是必填项;

    +

    4、补充协议必须要选择一个母合同。

    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/contract/index.html b/jun_pc_web/contract/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/contract/index.json b/jun_pc_web/contract/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/contract/index/add.html b/jun_pc_web/contract/index/add.html new file mode 100644 index 000000000..2da6e7d87 --- /dev/null +++ b/jun_pc_web/contract/index/add.html @@ -0,0 +1,307 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +

    新增合同

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    合同名称*合同性质 + + 普通合同
    签约主体(乙方)* + + 合同编号* + + 合同类别* + +
    客户名称(甲方)* + + + + + 签约客户代表* + + 客户联系电话* + +
    客户联系地址 + + 合同始止日期* +
    +
    + +
    + ~ +
    + +
    +
    +
    合同金额* + + 是否含税 + + + 税点(百分比) + +
    签订信息
    合同签订人* +
    + +
    +
    + + +
    合同签订时间* + + 合同制定人* + + +
    合同保管人* + + + 合同共享人员 + + +
    相关附件
    + + +
    + +
    +
    备注信息
    + +
    +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/contract/index/add2.html b/jun_pc_web/contract/index/add2.html new file mode 100644 index 000000000..a5d0e6125 --- /dev/null +++ b/jun_pc_web/contract/index/add2.html @@ -0,0 +1,259 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    新增合同

    + + {gt name="$pid" value="0"} + + + + + {/gt} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {neq name="$type" value="2"} + + + + + + + + + {/neq} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    母合同名称{$p_contract.name}
    合同名称*合同性质 + + {eq name="$type" value="1" }普通合同{/eq} + {eq name="$type" value="2" }框架合同{/eq} + {eq name="$type" value="3" }补充协议{/eq} + {eq name="$type" value="4" }其他合同{/eq} +
    签约主体(乙方)* + + 合同编号* + + 合同类别* + +
    客户名称(甲方)* + {gt name="$pid" value="0"} + + + {else/} + + {if condition="(isModule('customer') > 0) AND ($is_customer == 1)"} + + + {else/} + + + {/if} + + {/gt} + + 签约客户代表* + + 客户联系电话* + +
    客户联系地址 + + 合同始止日期* +
    +
    + +
    + ~ +
    + +
    +
    +
    合同金额{eq name="$type" value="1"}*{/eq} + + 是否含税 + + + 税点(百分比) + +
    签订信息
    合同签订人* +
    + +
    +
    + + +
    合同签订时间* + + 合同制定人* + + +
    合同保管人* + + + 合同共享人员 + + +
    相关附件
    + + +
    + +
    +
    备注信息
    + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/contract/index/archive.html b/jun_pc_web/contract/index/archive.html new file mode 100644 index 000000000..323e48b6a --- /dev/null +++ b/jun_pc_web/contract/index/archive.html @@ -0,0 +1,224 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/contract/index/archive.json b/jun_pc_web/contract/index/archive.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/contract/index/archive.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/contract/index/archive2.html b/jun_pc_web/contract/index/archive2.html new file mode 100644 index 000000000..54040fb6c --- /dev/null +++ b/jun_pc_web/contract/index/archive2.html @@ -0,0 +1,151 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/contract/index/edit2.html b/jun_pc_web/contract/index/edit2.html new file mode 100644 index 000000000..d556bca28 --- /dev/null +++ b/jun_pc_web/contract/index/edit2.html @@ -0,0 +1,257 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    编辑合同

    + + {gt name="$detail.pid" value="0"} + + + + + {/gt} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {neq name="$detail.type" value="2"} + + + + + + + + + {/neq} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    母合同名称{$detail.pname}
    合同名称*合同性质 + {eq name="$detail.type" value="1" }普通合同{/eq} + {eq name="$detail.type" value="2" }框架合同{/eq} + {eq name="$detail.type" value="3" }补充协议{/eq} + {eq name="$detail.type" value="4" }其他合同{/eq} +
    签约主体(乙方)* + + 合同编号* + + 合同类别* + +
    客户名称(甲方)* + {if condition="(isModule('customer') > 0) AND ($is_customer == 1)"} + + {else/} + + {/if} + + 签约客户代表 + + 客户联系电话* + +
    客户联系地址 + + 合同始止日期* +
    +
    + +
    + ~ +
    + +
    +
    +
    合同金额{eq name="$detail.type" value="1"}*{/eq} + + 是否含税 + + + 税点(百分比) + +
    签订信息
    合同签订人* +
    + +
    +
    部门:{$detail.sign_department}
    + + +
    合同签订时间* + + 合同制定人* + + +
    合同保管人* + + + 合同共享人员 + + +
    相关附件
    + + +
    + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo)}
    + {/volist} + {/notempty} +
    +
    备注信息
    + +
    +
    + + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/contract/index/index.html b/jun_pc_web/contract/index/index.html new file mode 100644 index 000000000..95696e795 --- /dev/null +++ b/jun_pc_web/contract/index/index.html @@ -0,0 +1,405 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/contract/index/index.json b/jun_pc_web/contract/index/index.json new file mode 100644 index 000000000..161775074 --- /dev/null +++ b/jun_pc_web/contract/index/index.json @@ -0,0 +1,413 @@ +{ + "code": 0, + "msg": "", + "count": 7, + "data": [ + { + "id": 1092, + "pid": 0, + "code": "12023121021272015", + "name": "卡卡卡是收入合同", + "cate_id": 38, + "type": 1, + "subject_id": "1", + "customer_id": 1004, + "customer": "张先生", + "customer_name": "杨个人", + "customer_mobile": "13688888889", + "customer_address": "11111", + "start_time": 1702137600, + "end_time": 1704816000, + "admin_id": 7, + "prepared_uid": 3, + "sign_uid": 8, + "keeper_uid": 4, + "share_ids": "", + "file_ids": "", + "sign_time": "2023-12-10", + "sign_did": 5, + "cost": "12.00", + "is_tax": 1, + "tax": "6.00", + "check_status": 1, + "check_step_sort": 0, + "check_admin_ids": "3", + "flow_admin_ids": "", + "last_admin_id": "0", + "copy_uids": "4,99,6,23,13,51", + "check_uid": 0, + "check_time": 0, + "check_remark": null, + "stop_uid": 0, + "stop_time": 0, + "stop_remark": null, + "void_uid": 0, + "void_time": 0, + "void_remark": null, + "archive_status": 0, + "archive_uid": 0, + "archive_time": 0, + "remark": "", + "create_time": "2023-12-10 21:28:32", + "update_time": null, + "delete_time": 0, + "type_a": 1, + "cate_title": "\t 销售合同", + "sign_department": "销售部", + "keeper_name": "风采铃", + "sign_name": "谈无欲", + "interval_time": "2023-12-10 至 2024-01-10", + "type_name": "普通合同", + "status_name": "审核中", + "delay": 0 + }, + { + "id": 1081, + "pid": 0, + "code": "12023111708263535", + "name": "335", + "cate_id": 29, + "type": 2, + "subject_id": "1", + "customer_id": 1059, + "customer": "安迈科技", + "customer_name": "22222222", + "customer_mobile": "12563254785", + "customer_address": "扩展名", + "start_time": 1700150400, + "end_time": 1734364800, + "admin_id": 7, + "prepared_uid": 8, + "sign_uid": 24, + "keeper_uid": 30, + "share_ids": "", + "file_ids": "", + "sign_time": "2023-11-17", + "sign_did": 9, + "cost": "-", + "is_tax": 0, + "tax": "0.00", + "check_status": 1, + "check_step_sort": 0, + "check_admin_ids": "7", + "flow_admin_ids": "", + "last_admin_id": "0", + "copy_uids": "", + "check_uid": 0, + "check_time": 0, + "check_remark": null, + "stop_uid": 0, + "stop_time": 0, + "stop_remark": null, + "void_uid": 0, + "void_time": 0, + "void_remark": null, + "archive_status": 0, + "archive_uid": 0, + "archive_time": 0, + "remark": "", + "create_time": "2023-11-17 08:28:57", + "update_time": null, + "delete_time": 0, + "type_a": 2, + "cate_title": "普通合同", + "sign_department": "销售二部", + "keeper_name": "言倾城", + "sign_name": "剑子仙迹", + "interval_time": "2023-11-17 至 2024-12-17", + "type_name": "框架合同", + "status_name": "审核中", + "delay": 337 + }, + { + "id": 1060, + "pid": 0, + "code": "12023101111294172", + "name": "测试合同", + "cate_id": 25, + "type": 1, + "subject_id": "1", + "customer_id": 1003, + "customer": "测试客户", + "customer_name": "张章", + "customer_mobile": "12312312312", + "customer_address": "xxx市xx区", + "start_time": 1697731200, + "end_time": 1701273600, + "admin_id": 2, + "prepared_uid": 6, + "sign_uid": 2, + "keeper_uid": 7, + "share_ids": "", + "file_ids": "", + "sign_time": "2023-10-11", + "sign_did": 1, + "cost": "100000.00", + "is_tax": 0, + "tax": "0.00", + "check_status": 1, + "check_step_sort": 0, + "check_admin_ids": "2", + "flow_admin_ids": "", + "last_admin_id": "0", + "copy_uids": "", + "check_uid": 0, + "check_time": 0, + "check_remark": null, + "stop_uid": 0, + "stop_time": 0, + "stop_remark": null, + "void_uid": 0, + "void_time": 0, + "void_remark": null, + "archive_status": 0, + "archive_uid": 0, + "archive_time": 0, + "remark": "", + "create_time": "2023-10-11 11:30:31", + "update_time": null, + "delete_time": 0, + "type_a": 1, + "cate_title": "测试类别1", + "sign_department": "董事会", + "keeper_name": "叶小钗", + "sign_name": "素还真", + "interval_time": "2023-10-20 至 2023-11-30", + "type_name": "普通合同", + "status_name": "审核中", + "delay": 0 + }, + { + "id": 1055, + "pid": 0, + "code": "12023100117042991", + "name": "123", + "cate_id": 22, + "type": 1, + "subject_id": "1", + "customer_id": 1004, + "customer": "张先生", + "customer_name": "杨个人", + "customer_mobile": "13688888889", + "customer_address": "11111", + "start_time": 1696435200, + "end_time": 1698768000, + "admin_id": 2, + "prepared_uid": 5, + "sign_uid": 60, + "keeper_uid": 2, + "share_ids": "88", + "file_ids": "", + "sign_time": "2023-11-01", + "sign_did": 12, + "cost": "21312.00", + "is_tax": 1, + "tax": "12312.00", + "check_status": 1, + "check_step_sort": 0, + "check_admin_ids": "71", + "flow_admin_ids": "", + "last_admin_id": "0", + "copy_uids": "", + "check_uid": 0, + "check_time": 0, + "check_remark": null, + "stop_uid": 0, + "stop_time": 0, + "stop_remark": null, + "void_uid": 0, + "void_time": 0, + "void_remark": null, + "archive_status": 0, + "archive_uid": 0, + "archive_time": 0, + "remark": "", + "create_time": "2023-10-01 17:20:00", + "update_time": "2023-10-02 10:13:45", + "delete_time": 0, + "type_a": 1, + "cate_title": "开发合同", + "sign_department": "设计部", + "keeper_name": "素还真", + "sign_name": "欧阳翎", + "interval_time": "2023-10-05 至 2023-11-01", + "type_name": "普通合同", + "status_name": "审核中", + "delay": 0 + }, + { + "id": 1037, + "pid": 0, + "code": "12023083110322941", + "name": "xvcx", + "cate_id": 22, + "type": 1, + "subject_id": "1", + "customer_id": 1006, + "customer": "济南", + "customer_name": "大s =0", + "customer_mobile": "13188885555", + "customer_address": "阿达大大", + "start_time": 1690819200, + "end_time": 1696003200, + "admin_id": 7, + "prepared_uid": 8, + "sign_uid": 8, + "keeper_uid": 23, + "share_ids": "", + "file_ids": "", + "sign_time": "2023-08-31", + "sign_did": 5, + "cost": "213.00", + "is_tax": 1, + "tax": "13.00", + "check_status": 1, + "check_step_sort": 0, + "check_admin_ids": "2", + "flow_admin_ids": "", + "last_admin_id": "0", + "copy_uids": "", + "check_uid": 0, + "check_time": 0, + "check_remark": null, + "stop_uid": 0, + "stop_time": 0, + "stop_remark": null, + "void_uid": 0, + "void_time": 0, + "void_remark": null, + "archive_status": 0, + "archive_uid": 0, + "archive_time": 0, + "remark": "2132132", + "create_time": "2023-08-31 10:33:11", + "update_time": null, + "delete_time": 0, + "type_a": 1, + "cate_title": "开发合同", + "sign_department": "销售部", + "keeper_name": "佛剑分说", + "sign_name": "谈无欲", + "interval_time": "2023-08-01 至 2023-09-30", + "type_name": "普通合同", + "status_name": "审核中", + "delay": 0 + }, + { + "id": 1023, + "pid": 0, + "code": "12023072408431325", + "name": "恶妇神鼎飞丹砂", + "cate_id": 4, + "type": 1, + "subject_id": "1", + "customer_id": 1003, + "customer": "测试客户", + "customer_name": "张章", + "customer_mobile": "12312312312", + "customer_address": "xxx市xx区", + "start_time": 1690128000, + "end_time": 1692201600, + "admin_id": 7, + "prepared_uid": 88, + "sign_uid": 11, + "keeper_uid": 57, + "share_ids": "57", + "file_ids": "", + "sign_time": "2023-07-24", + "sign_did": 4, + "cost": "1000000.00", + "is_tax": 1, + "tax": "6.00", + "check_status": 1, + "check_step_sort": 0, + "check_admin_ids": "23", + "flow_admin_ids": "", + "last_admin_id": "0", + "copy_uids": "54", + "check_uid": 0, + "check_time": 0, + "check_remark": null, + "stop_uid": 0, + "stop_time": 0, + "stop_remark": null, + "void_uid": 2, + "void_time": 1692147412, + "void_remark": "", + "archive_status": 0, + "archive_uid": 0, + "archive_time": 0, + "remark": "萨达撒", + "create_time": "2023-07-24 08:44:38", + "update_time": null, + "delete_time": 0, + "type_a": 1, + "cate_title": "委托协议", + "sign_department": "市场部", + "keeper_name": "灯头人", + "sign_name": "刀兽", + "interval_time": "2023-07-24 至 2023-08-17", + "type_name": "普通合同", + "status_name": "审核中", + "delay": 0 + }, + { + "id": 1016, + "pid": 0, + "code": "12023062800251690", + "name": "金麟湾", + "cate_id": 9, + "type": 1, + "subject_id": "1", + "customer_id": 1004, + "customer": "张先生", + "customer_name": "杨个人", + "customer_mobile": "13688888889", + "customer_address": "11111", + "start_time": 1687881600, + "end_time": 1690819200, + "admin_id": 7, + "prepared_uid": 11, + "sign_uid": 5, + "keeper_uid": 23, + "share_ids": "30,32", + "file_ids": "", + "sign_time": "2023-06-20", + "sign_did": 2, + "cost": "555.00", + "is_tax": 1, + "tax": "11.00", + "check_status": 1, + "check_step_sort": 0, + "check_admin_ids": "13", + "flow_admin_ids": "", + "last_admin_id": "0", + "copy_uids": "66", + "check_uid": 0, + "check_time": 0, + "check_remark": null, + "stop_uid": 0, + "stop_time": 0, + "stop_remark": null, + "void_uid": 4, + "void_time": 1688551138, + "void_remark": "", + "archive_status": 0, + "archive_uid": 0, + "archive_time": 0, + "remark": "", + "create_time": "2023-06-28 00:26:09", + "update_time": "2023-07-24 15:44:23", + "delete_time": 0, + "type_a": 1, + "cate_title": "应酬合同", + "sign_department": "人事部", + "keeper_name": "佛剑分说", + "sign_name": "玉辞心", + "interval_time": "2023-06-28 至 2023-08-01", + "type_name": "普通合同", + "status_name": "审核中", + "delay": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/contract/index/index2.html b/jun_pc_web/contract/index/index2.html new file mode 100644 index 000000000..659cba0da --- /dev/null +++ b/jun_pc_web/contract/index/index2.html @@ -0,0 +1,332 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/contract/index/view.html b/jun_pc_web/contract/index/view.html new file mode 100644 index 000000000..55007b791 --- /dev/null +++ b/jun_pc_web/contract/index/view.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
    +
    +
      +
    • 合同详情
    • +
    • 操作记录
    • +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    合同名称卡卡卡是收入合同合同编号12023121021272015
    签约主体(乙方) + 勾股信息科技有限公司 合同性质 + 普通合同 合同类别 + 销售合同
    客户名称(甲方)张先生签约客户代表杨个人客户联系电话13688888889
    客户联系地址11111合同开始日期2023-12-10合同结束日期2024-01-10
    合同金额12.00是否含税税点(百分比)6.00%
    补充附件
    + + +
    +
    +
    签订信息
    合同制定人一页书 合同签订人谈无欲合同签订时间2023-12-10合同签订部门销售部
    合同保管人风采铃合同共享人员
    审核信息
    合同状态审核中录入人叶小钗 录入时间2023-12-10 21:28:32
    历史审批记录 +
      + +
    • + +

      2023-12-10 21:29叶小钗提交了此申请。操作意见:提交申请

      +
    • +
    +
    + + + + + + + + + + + + +
    当前审核人一页书抄送人风采铃,秦假仙,符应女,佛剑分说,照世明灯,张三
    审批流程 +
    +
    + +
    叶小钗
    +
    提交申请
    + +
    +
    +
    + + + + +
    + 撤回 +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/contract/index/view2.html b/jun_pc_web/contract/index/view2.html new file mode 100644 index 000000000..de6661d20 --- /dev/null +++ b/jun_pc_web/contract/index/view2.html @@ -0,0 +1,428 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +
    +
      +
    • 合同详情
    • +
    • 操作记录
    • +
    +
    +
    + + {gt name="$detail.pid" value="0"} + + + + + {/gt} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {neq name="$detail.type" value="2"} + + + + {eq name="$detail.is_tax" value="1" } + + + + + {/eq} + {eq name="$detail.is_tax" value="0" } + + + {/eq} + + {/neq} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$check_record"} + + + + + {/notempty} +
    母合同名称{$detail.pname}
    合同名称{$detail.name}合同编号{$detail.code}
    签约主体(乙方) + {volist name=":contract_subject()" id="v"} + {eq name="$v.id" value="$detail.subject_id" }{$v.title}{/eq} + {/volist} + 合同性质 + {eq name="$detail.type" value="1" }普通合同{/eq} + {eq name="$detail.type" value="2" }框架合同{/eq} + {eq name="$detail.type" value="3" }补充协议{/eq} + {eq name="$detail.type" value="4" }其他合同{/eq} + 合同类别 + {volist name=":contract_cate()" id="v"} + {eq name="$v.id" value="$detail.cate_id" }{$v.title}{/eq} + {/volist} +
    客户名称(甲方){$detail.customer}签约客户代表{$detail.customer_name}客户联系电话{$detail.customer_mobile}
    客户联系地址{$detail.customer_address}合同开始日期{$detail.start_time}合同结束日期{$detail.end_time}
    合同金额{$detail.cost}是否含税税点(百分比){$detail.tax}%是否含税
    备注信息{$detail.remark|default=''}
    相关附件 +
    + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo,'view')}
    + {/volist} +
    +
    补充附件
    + + +
    + {volist name="$detail.file_array_other" id="vo"} +
    {:file_card($vo)}
    + {/volist} +
    +
    签订信息
    合同制定人{$detail.prepared_name} 合同签订人{$detail.sign_name}合同签订时间{$detail.sign_time}合同签订部门{$detail.sign_department}
    合同保管人{$detail.keeper_name}{gt name="$auth" value="0"}更改{/gt}合同共享人员{$detail.share_names}{gt name="$auth" value="0"}更改{/gt}
    审核信息
    合同状态{$detail.status_name}录入人{$detail.admin_name|default=''} 录入时间{$detail.create_time|default=''}
    历史审批记录 +
      + {volist name="$check_record" id="vo"} +
    • + +

      {$vo.check_time_str}{$vo.name}{$vo.status_str}了此申请。操作意见:{$vo.content}

      +
    • + {/volist} +
    +
    + + {if ($detail.check_status == 1)} + {include file="/index/view_step" /} + {elseif ($detail.check_status == 0) OR ($detail.check_status == 4)} + {include file="/index/view_set" /} + {else /} + + {eq name="$detail.check_status" value="2" } + + + {eq name="$detail.archive_status" value="0" } + + {else/} + + + + + + {/eq} + + {/eq} + + {eq name="$detail.check_status" value="5" } + + + + + + + + + + + {/eq} + + {eq name="$detail.check_status" value="6" } + + + + + + + + + + + {/eq} +
    归档状态{$detail.archive_status_name}{$detail.archive_status_name}归档人{$detail.archive_name|default=''} 归档时间{$detail.archive_time|default=''}
    中止人{$detail.stop_name|default=''} 中止时间{$detail.stop_time|default=''}
    中止备注{$detail.stop_remark|default=''}
    作废人{$detail.void_name|default=''} 作废时间{$detail.void_time|default=''}
    作废备注{$detail.void_remark|default=''}
    +
    + {gt name="$auth" value="0"} + {eq name="$detail.check_status" value="2" } + {eq name="$detail.archive_status" value="1" } + 反确认归档 + {else/} + 合同归档 + 反确认审核 + {/eq} + {/eq} + {eq name="$detail.check_status" value="5" } +
    + 反中止合同 +
    + {/eq} + + {eq name="$detail.check_status" value="6" } +
    + 反作废合同 +
    + {/eq} + {/gt} + {if ( $detail.check_status eq 3) AND ( $is_create_admin eq 1) } + 撤回 + {/if} +
    + {/if} + +
    +
    + {include file="/index/view_log" /} +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/contract/index/view_log2.html b/jun_pc_web/contract/index/view_log2.html new file mode 100644 index 000000000..048cc4a5a --- /dev/null +++ b/jun_pc_web/contract/index/view_log2.html @@ -0,0 +1,68 @@ +
    +
    +
    + \ No newline at end of file diff --git a/jun_pc_web/contract/index/view_set2.html b/jun_pc_web/contract/index/view_set2.html new file mode 100644 index 000000000..287b16b46 --- /dev/null +++ b/jun_pc_web/contract/index/view_set2.html @@ -0,0 +1,174 @@ +{eq name="$is_create_admin" value = "1"} + + + + + + + + + +
    选择审批流程* + +
    审核人* + + +
    +{/eq} +
    + {eq name="$is_create_admin" value = "1"} + + 编辑合同 + {/eq} + {gt name="$auth" value="0"} + 中止合同 + 作废合同 + {/gt} +
    + \ No newline at end of file diff --git a/jun_pc_web/contract/index/view_step2.html b/jun_pc_web/contract/index/view_step2.html new file mode 100644 index 000000000..32182a635 --- /dev/null +++ b/jun_pc_web/contract/index/view_step2.html @@ -0,0 +1,253 @@ + + + + + + + + + + {if ( $is_check_admin eq 1) } + {eq name="$flows.flow_type" value="0"} + + + + + {/eq} + + + + + {/if} +
    当前审核人{$detail.check_user}
    审批流程 +
    +
    + +
    {$detail.create_user}
    +
    提交申请
    + +
    +
    +
    审批节点 * + + +
    + +
    +
    审批意见 * + +
    + + + + +
    + {eq name="$is_check_admin" value='1'} + 通过 + {$flows.flow_type == 5?'回退':'拒绝'} + {/eq} + {eq name="$is_create_admin" value='1'} + 撤回 + {/eq} +
    + \ No newline at end of file diff --git a/jun_pc_web/customer/api/add_chance2.html b/jun_pc_web/customer/api/add_chance2.html new file mode 100644 index 000000000..211d64eb5 --- /dev/null +++ b/jun_pc_web/customer/api/add_chance2.html @@ -0,0 +1,107 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    新增销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$customer_name}客户联系人* + +
    机会标题* + + 发现时间* + +
    销售阶段* + + 预计金额* + + 预计签单时间* + +
    需求描述* + +
    归属人员* + + + 协助人员 + + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/api/add_trace2.html b/jun_pc_web/customer/api/add_trace2.html new file mode 100644 index 000000000..ff3992213 --- /dev/null +++ b/jun_pc_web/customer/api/add_trace2.html @@ -0,0 +1,126 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    新增跟进记录

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$customer_name}客户联系人* + +
    跟进方式* + + 跟进时间* + + 下次沟通时间* + +
    沟通内容* + +
    销售机会 + + 当前阶段 + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/api/edit_chance2.html b/jun_pc_web/customer/api/edit_chance2.html new file mode 100644 index 000000000..8f27d7d09 --- /dev/null +++ b/jun_pc_web/customer/api/edit_chance2.html @@ -0,0 +1,107 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    编辑销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$detail.customer}客户联系人* + +
    机会标题* + + 发现时间* + +
    销售阶段* + + 预计金额* + + 预计签单时间* + +
    需求描述* + +
    归属人员* + + + 协助人员 + + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/api/edit_trace2.html b/jun_pc_web/customer/api/edit_trace2.html new file mode 100644 index 000000000..721174219 --- /dev/null +++ b/jun_pc_web/customer/api/edit_trace2.html @@ -0,0 +1,126 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    编辑跟进记录

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$detail.customer}联 系 人* + +
    跟进方式* + + 跟进时间* + + 下次沟通时间* + +
    沟通内容* + +
    销售机会 + + 当前阶段 + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/api/view_chance2.html b/jun_pc_web/customer/api/view_chance2.html new file mode 100644 index 000000000..f6d0c2eea --- /dev/null +++ b/jun_pc_web/customer/api/view_chance2.html @@ -0,0 +1,52 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$detail.customer}客户联系人 + {volist name=":customer_contact($detail.cid)" id="v"} + {eq name="$v.id" value="$detail.contact_id"}{$v.name}{/eq} + {/volist} +
    机会标题{$detail.title}发现时间{$detail.discovery_time}
    销售阶段{$detail.stage_name}预计金额{$detail.expected_amount}预计签单时间{$detail.expected_time}
    需求描述{$detail.content}
    归属人员{$detail.belong_name}协助人员{$detail.assist_names}
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/api/view_trace2.html b/jun_pc_web/customer/api/view_trace2.html new file mode 100644 index 000000000..acda78342 --- /dev/null +++ b/jun_pc_web/customer/api/view_trace2.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    跟进记录

    + + + + + + + + + + + + + + + + + + + + {gt name="$detail.chance_id" value="0"} + + + + + + + {/gt} +
    客户名称{$detail.customer}联 系 人{$detail.contact_name}
    跟进方式{$detail.type_name}跟进时间{$detail.follow_time}下次沟通时间{$detail.next_time}
    沟通内容{$detail.content}
    销售机会 + {$detail.chance_name} + 当前阶段{$detail.stage_name}
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/chance/chance_add.html b/jun_pc_web/customer/chance/chance_add.html new file mode 100644 index 000000000..daf9013b8 --- /dev/null +++ b/jun_pc_web/customer/chance/chance_add.html @@ -0,0 +1,147 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +

    编辑销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称济南客户联系人* + +
    机会标题* + + 发现时间* + +
    销售阶段* + + 预计金额* + + 预计签单时间* + +
    需求描述* + +
    归属人员* + + + 协助人员 + + +
    +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/chance/chance_add2.html b/jun_pc_web/customer/chance/chance_add2.html new file mode 100644 index 000000000..fcdbf23cb --- /dev/null +++ b/jun_pc_web/customer/chance/chance_add2.html @@ -0,0 +1,106 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    新增销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$customer_name}客户联系人* + +
    机会标题* + + 发现时间* + +
    销售阶段* + + 预计金额* + + 预计签单时间* + +
    需求描述* + +
    归属人员* + + + 协助人员 + + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/chance/chance_edit2.html b/jun_pc_web/customer/chance/chance_edit2.html new file mode 100644 index 000000000..4e73fa0ec --- /dev/null +++ b/jun_pc_web/customer/chance/chance_edit2.html @@ -0,0 +1,106 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    编辑销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$detail.customer}客户联系人* + +
    机会标题* + + 发现时间* + +
    销售阶段* + + 预计金额* + + 预计签单时间* + +
    需求描述* + +
    归属人员* + + + 协助人员 + + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/chance/chance_view.html b/jun_pc_web/customer/chance/chance_view.html new file mode 100644 index 000000000..d8824dcaa --- /dev/null +++ b/jun_pc_web/customer/chance/chance_view.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +

    销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称济南客户联系人 + 大s =0
    机会标题个人法国人发现时间2023-07-25
    销售阶段立项评估预计金额15648.00预计签单时间2023-07-26
    需求描述个人
    归属人员风采铃协助人员
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/chance/chance_view2.html b/jun_pc_web/customer/chance/chance_view2.html new file mode 100644 index 000000000..f6d0c2eea --- /dev/null +++ b/jun_pc_web/customer/chance/chance_view2.html @@ -0,0 +1,52 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    销售机会

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$detail.customer}客户联系人 + {volist name=":customer_contact($detail.cid)" id="v"} + {eq name="$v.id" value="$detail.contact_id"}{$v.name}{/eq} + {/volist} +
    机会标题{$detail.title}发现时间{$detail.discovery_time}
    销售阶段{$detail.stage_name}预计金额{$detail.expected_amount}预计签单时间{$detail.expected_time}
    需求描述{$detail.content}
    归属人员{$detail.belong_name}协助人员{$detail.assist_names}
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/chance/index.html b/jun_pc_web/customer/chance/index.html new file mode 100644 index 000000000..4e77ac25f --- /dev/null +++ b/jun_pc_web/customer/chance/index.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/chance/index.json b/jun_pc_web/customer/chance/index.json new file mode 100644 index 000000000..5e21789f0 --- /dev/null +++ b/jun_pc_web/customer/chance/index.json @@ -0,0 +1,29 @@ +{ + "code": 0, + "msg": "", + "count": 1, + "data": [ + { + "id": 3, + "title": "个人法国人", + "cid": 1006, + "contact_id": 7, + "services_id": 0, + "stage": 1, + "content": "个人", + "discovery_time": "2023-07-25", + "expected_time": "2023-07-26", + "expected_amount": "15648.00", + "admin_id": 4, + "belong_uid": 4, + "assist_ids": "", + "create_time": "1970-01-01 08:32:50", + "update_time": null, + "delete_time": 0, + "customer": "济南", + "belong_name": "风采铃", + "stage_name": "立项评估", + "services_name": null + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/customer/chance/index2.html b/jun_pc_web/customer/chance/index2.html new file mode 100644 index 000000000..25b30503d --- /dev/null +++ b/jun_pc_web/customer/chance/index2.html @@ -0,0 +1,107 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/contact/contact_add.html b/jun_pc_web/customer/contact/contact_add.html new file mode 100644 index 000000000..5fb2a9d88 --- /dev/null +++ b/jun_pc_web/customer/contact/contact_add.html @@ -0,0 +1,137 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +

    编辑联系人

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称王绍峰
    姓名* + + 联系电话* + + 性别* + + +
    微 信 号 + + QQ号码 + + 电子邮箱 + +
    称谓 + + 部门 + + 职务 + +
    +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/contact/contact_add2.html b/jun_pc_web/customer/contact/contact_add2.html new file mode 100644 index 000000000..a3c29bec3 --- /dev/null +++ b/jun_pc_web/customer/contact/contact_add2.html @@ -0,0 +1,99 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    新增联系人

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$customer_name}
    姓名* + + 联系电话* + + 性别* + + +
    微 信 号 + + QQ号码 + + 电子邮箱 + +
    称谓 + + 部门 + + 职务 + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/contact/contact_edit2.html b/jun_pc_web/customer/contact/contact_edit2.html new file mode 100644 index 000000000..1c581a053 --- /dev/null +++ b/jun_pc_web/customer/contact/contact_edit2.html @@ -0,0 +1,99 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    编辑联系人

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称{$detail.customer}
    姓名* + + 联系电话* + + 性别* + + +
    微 信 号 + + QQ号码 + + 电子邮箱 + +
    称谓 + + 部门 + + 职务 + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/contact/index.html b/jun_pc_web/customer/contact/index.html new file mode 100644 index 000000000..c61ca1245 --- /dev/null +++ b/jun_pc_web/customer/contact/index.html @@ -0,0 +1,155 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/contact/index.json b/jun_pc_web/customer/contact/index.json new file mode 100644 index 000000000..b1470e3a1 --- /dev/null +++ b/jun_pc_web/customer/contact/index.json @@ -0,0 +1,45 @@ +{ + "code": 0, + "msg": "", + "count": 2, + "data": [ + { + "id": 18, + "cid": 1016, + "is_default": 1, + "name": "www", + "sex": 1, + "mobile": "19833032571", + "qq": "", + "wechat": "", + "email": "", + "nickname": "", + "department": "", + "position": "", + "admin_id": 2, + "create_time": "1970-01-01 08:32:50", + "update_time": null, + "delete_time": 0, + "customer": "王绍峰" + }, + { + "id": 7, + "cid": 1006, + "is_default": 1, + "name": "大s =0", + "sex": 1, + "mobile": "13188885555", + "qq": "", + "wechat": "", + "email": "", + "nickname": "", + "department": "", + "position": "", + "admin_id": 2, + "create_time": "1970-01-01 08:32:50", + "update_time": "2023-08-11 10:45:53", + "delete_time": 0, + "customer": "济南" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/customer/contact/index2.html b/jun_pc_web/customer/contact/index2.html new file mode 100644 index 000000000..1f3915100 --- /dev/null +++ b/jun_pc_web/customer/contact/index2.html @@ -0,0 +1,117 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/grade/index.html b/jun_pc_web/customer/grade/index.html new file mode 100644 index 000000000..282989e96 --- /dev/null +++ b/jun_pc_web/customer/grade/index.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/grade/index.json b/jun_pc_web/customer/grade/index.json new file mode 100644 index 000000000..e38849c05 --- /dev/null +++ b/jun_pc_web/customer/grade/index.json @@ -0,0 +1,43 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "普通客户", + "status": 1, + "create_time": 1637987189, + "update_time": 0 + }, + { + "id": 2, + "title": "VIP客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 3, + "title": "白银客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 4, + "title": "黄金客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 5, + "title": "钻石客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/customer/grade/index2.html b/jun_pc_web/customer/grade/index2.html new file mode 100644 index 000000000..b0cd46630 --- /dev/null +++ b/jun_pc_web/customer/grade/index2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/index.html b/jun_pc_web/customer/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/customer/index.json b/jun_pc_web/customer/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/customer/index/add.html b/jun_pc_web/customer/index/add.html new file mode 100644 index 000000000..20628b5d3 --- /dev/null +++ b/jun_pc_web/customer/index/add.html @@ -0,0 +1,217 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +

    新增客户

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称*客户来源* + +
    联系地址* + + 所属行业* + + 客户等级* + +
    归属员工* + + + + 归属部门 + + 共享员工 + + +
    客户介绍* + +
    经营业务 + +
    首要联系人信息
    联 系 人* + + 联系电话* + + 性别* + + +
    微 信 号 + + QQ号码 + + 电子邮箱 + +
    备注信息
    + +
    +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/index/add2.html b/jun_pc_web/customer/index/add2.html new file mode 100644 index 000000000..d46a7bd41 --- /dev/null +++ b/jun_pc_web/customer/index/add2.html @@ -0,0 +1,169 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    新增客户

    + + + + + + + + + + + + + + + + {eq name="$sea" value="0"} + + + + + + + + + {/eq} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    客户名称*客户来源* + +
    联系地址* + + 所属行业* + + 客户等级* + +
    归属员工* + + + + 归属部门 + + 共享员工 + + +
    客户介绍* + +
    经营业务 + +
    首要联系人信息
    联 系 人* + + 联系电话* + + 性别* + + +
    微 信 号 + + QQ号码 + + 电子邮箱 + +
    备注信息
    + +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/index/edit2.html b/jun_pc_web/customer/index/edit2.html new file mode 100644 index 000000000..c94b342d3 --- /dev/null +++ b/jun_pc_web/customer/index/edit2.html @@ -0,0 +1,154 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    编辑客户

    + + + + + + + + + + + + + + + + + + + + + + {eq name="$sea" value="0"} + + + + + + + {/eq} + + + + + + + + + + + + +
    客户名称*客户来源* + +
    联系地址* + + 客户等级* + +
    所属行业* + + 意向状态 + + 客户状态 + +
    归属员工* +
    + +
    +
    部门:{$detail.belong_department}
    + + +
    共享员工 + + +
    客户介绍* + +
    经营业务 + +
    备注信息 + +
    +
    + + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/index/index.html b/jun_pc_web/customer/index/index.html new file mode 100644 index 000000000..cdd1108bb --- /dev/null +++ b/jun_pc_web/customer/index/index.html @@ -0,0 +1,420 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
    +
    +
    +
      +
    • 全部客户
    • +
    • 我的客户
    • +
    • 下属客户
    • +
    • 共享客户
    • +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/index/index.json b/jun_pc_web/customer/index/index.json new file mode 100644 index 000000000..4154f7926 --- /dev/null +++ b/jun_pc_web/customer/index/index.json @@ -0,0 +1,151 @@ +{ + "code": 0, + "msg": "", + "count": 3, + "data": [ + { + "id": 1006, + "name": "济南", + "source_id": 1, + "grade_id": 1, + "industry_id": 1, + "services_id": 0, + "provinceid": 0, + "cityid": 0, + "distid": 0, + "townid": 0, + "address": "阿达大大", + "status": 4, + "intent_status": 1, + "contact_first": 0, + "admin_id": 2, + "belong_uid": 65, + "belong_did": 13, + "belong_time": 0, + "distribute_time": 1690447216, + "share_ids": "23", + "content": "洒点水", + "market": "", + "remark": "", + "bank": "", + "bank_sn": "", + "tax_num": "", + "cperson_mobile": "", + "cperson_address": "", + "discard_time": 0, + "create_time": "2023-06-08 00:30", + "update_time": "2023-12-15 09:03", + "delete_time": 0, + "belong_department": "研发部", + "grade": "普通客户", + "source": "独立开发", + "industry": "工业品企业", + "follow_time": "2023-06-14 00:00:00", + "next_time": "2023-06-09 00:00:00", + "belong_name": "洛子商", + "intent_status_name": "意向不明", + "status_name": "流失客户", + "user": "大s =0", + "mobile": "13188885555", + "qq": "", + "wechat": "", + "services_name": "-" + }, + { + "id": 1059, + "name": "安迈科技", + "source_id": 1, + "grade_id": 2, + "industry_id": 1, + "services_id": 0, + "provinceid": 0, + "cityid": 0, + "distid": 0, + "townid": 0, + "address": "扩展名", + "status": 1, + "intent_status": 1, + "contact_first": 0, + "admin_id": 7, + "belong_uid": 7, + "belong_did": 6, + "belong_time": 0, + "distribute_time": 0, + "share_ids": "", + "content": "111111111111111111111", + "market": "", + "remark": "", + "bank": "", + "bank_sn": "", + "tax_num": "", + "cperson_mobile": "", + "cperson_address": "", + "discard_time": 0, + "create_time": "2023-11-17 08:27", + "update_time": "-", + "delete_time": 0, + "belong_department": "技术部", + "grade": "VIP客户", + "source": "独立开发", + "industry": "工业品企业", + "follow_time": "-", + "next_time": "-", + "belong_name": "叶小钗", + "intent_status_name": "意向不明", + "status_name": "新进客户", + "user": "22222222", + "mobile": "12563254785", + "qq": "", + "wechat": "", + "services_name": "-" + }, + { + "id": 1016, + "name": "王绍峰", + "source_id": 1, + "grade_id": 5, + "industry_id": 1, + "services_id": 0, + "provinceid": 0, + "cityid": 0, + "distid": 0, + "townid": 0, + "address": "高毅", + "status": 1, + "intent_status": 1, + "contact_first": 0, + "admin_id": 2, + "belong_uid": 7, + "belong_did": 6, + "belong_time": 1690028348, + "distribute_time": 0, + "share_ids": "", + "content": "111", + "market": "", + "remark": "", + "bank": "", + "bank_sn": "", + "tax_num": "", + "cperson_mobile": "", + "cperson_address": "", + "discard_time": 0, + "create_time": "2023-07-12 09:07", + "update_time": "-", + "delete_time": 0, + "belong_department": "技术部", + "grade": "钻石客户", + "source": "独立开发", + "industry": "工业品企业", + "follow_time": "-", + "next_time": "-", + "belong_name": "叶小钗", + "intent_status_name": "意向不明", + "status_name": "新进客户", + "user": "www", + "mobile": "19833032571", + "qq": "", + "wechat": "", + "services_name": "-" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/customer/index/index2.html b/jun_pc_web/customer/index/index2.html new file mode 100644 index 000000000..af1476e88 --- /dev/null +++ b/jun_pc_web/customer/index/index2.html @@ -0,0 +1,382 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +
    +
    +
      +
    • 全部客户
    • +
    • 我的客户
    • +
    • 下属客户
    • +
    • 共享客户
    • +
    +
    +
    +
    + {eq name="$auth" value="1"} +
    + + +
    + {/eq} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/customer/index/rush.html b/jun_pc_web/customer/index/rush.html new file mode 100644 index 000000000..8e391fef1 --- /dev/null +++ b/jun_pc_web/customer/index/rush.html @@ -0,0 +1,156 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/index/rush.json b/jun_pc_web/customer/index/rush.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/customer/index/rush.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/customer/index/rush2.html b/jun_pc_web/customer/index/rush2.html new file mode 100644 index 000000000..1587ef1d5 --- /dev/null +++ b/jun_pc_web/customer/index/rush2.html @@ -0,0 +1,118 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/customer/index/sea.html b/jun_pc_web/customer/index/sea.html new file mode 100644 index 000000000..2ae165e3c --- /dev/null +++ b/jun_pc_web/customer/index/sea.html @@ -0,0 +1,358 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/index/sea.json b/jun_pc_web/customer/index/sea.json new file mode 100644 index 000000000..1ba352f8e --- /dev/null +++ b/jun_pc_web/customer/index/sea.json @@ -0,0 +1,53 @@ +{ + "code": 0, + "msg": "", + "count": 1, + "data": [ + { + "id": 1059, + "name": "安迈科技", + "source_id": 1, + "grade_id": 2, + "industry_id": 1, + "services_id": 0, + "provinceid": 0, + "cityid": 0, + "distid": 0, + "townid": 0, + "address": "扩展名", + "status": 1, + "intent_status": 1, + "contact_first": 0, + "admin_id": 7, + "belong_uid": 0, + "belong_did": 0, + "belong_time": 0, + "distribute_time": 0, + "share_ids": "", + "content": "111111111111111111111", + "market": "", + "remark": "", + "bank": "", + "bank_sn": "", + "tax_num": "", + "cperson_mobile": "", + "cperson_address": "", + "discard_time": 0, + "create_time": "2023-11-17 08:27", + "update_time": "-", + "delete_time": 0, + "belong_department": null, + "grade": "VIP客户", + "source": "独立开发", + "industry": "工业品企业", + "belong_name": null, + "intent_status_name": "意向不明", + "status_name": "新进客户", + "user": "22222222", + "mobile": "12563254785", + "qq": "", + "wechat": "", + "services_name": "-" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/customer/index/sea2.html b/jun_pc_web/customer/index/sea2.html new file mode 100644 index 000000000..1964bbc43 --- /dev/null +++ b/jun_pc_web/customer/index/sea2.html @@ -0,0 +1,311 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/customer/index/trash.html b/jun_pc_web/customer/index/trash.html new file mode 100644 index 000000000..94abde6b7 --- /dev/null +++ b/jun_pc_web/customer/index/trash.html @@ -0,0 +1,216 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/index/trash.json b/jun_pc_web/customer/index/trash.json new file mode 100644 index 000000000..35bd04583 --- /dev/null +++ b/jun_pc_web/customer/index/trash.json @@ -0,0 +1,53 @@ +{ + "code": 0, + "msg": "", + "count": 1, + "data": [ + { + "id": 1059, + "name": "安迈科技", + "source_id": 1, + "grade_id": 2, + "industry_id": 1, + "services_id": 0, + "provinceid": 0, + "cityid": 0, + "distid": 0, + "townid": 0, + "address": "扩展名", + "status": 1, + "intent_status": 1, + "contact_first": 0, + "admin_id": 7, + "belong_uid": 0, + "belong_did": 0, + "belong_time": 0, + "distribute_time": 0, + "share_ids": "", + "content": "111111111111111111111", + "market": "", + "remark": "", + "bank": "", + "bank_sn": "", + "tax_num": "", + "cperson_mobile": "", + "cperson_address": "", + "discard_time": 0, + "create_time": "2023-11-17 08:27", + "update_time": "-", + "delete_time": 1705308790, + "belong_department": null, + "grade": "VIP客户", + "source": "独立开发", + "industry": "工业品企业", + "belong_name": null, + "intent_status_name": "意向不明", + "status_name": "新进客户", + "user": "22222222", + "mobile": "12563254785", + "qq": "", + "wechat": "", + "services_name": "-" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/customer/index/trash2.html b/jun_pc_web/customer/index/trash2.html new file mode 100644 index 000000000..b6667b61a --- /dev/null +++ b/jun_pc_web/customer/index/trash2.html @@ -0,0 +1,168 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/customer/index/view2.html b/jun_pc_web/customer/index/view2.html new file mode 100644 index 000000000..a35307825 --- /dev/null +++ b/jun_pc_web/customer/index/view2.html @@ -0,0 +1,233 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +

    客户详情

    + + + + + + + + + + + + + + + + + + + + + + + + {gt name="$detail['belong_uid']" value="0"} + + + + + + + + + {/gt} + + + + + + + + + + + + + + + + + {notempty name="$contact"} + + + + + + + + + + + + + + {/notempty} + {notempty name="$detail.trace"} + + + + + + + + + + + + + + + + + + + + {/notempty} +
    客户名称{$detail.name}录入人 + {$detail.admin_name} +
    联系地址 + {$detail.address} + 客户等级 + {volist name=":customer_grade()" id="v"} + {eq name="$v.id" value="$detail.grade_id"}{$v.title}{/eq} + {/volist} +
    所属行业 + {volist name=":get_industry()" id="v"} + {eq name="$v.id" value="$detail.industry_id"}{$v.title}{/eq} + {/volist} + 意向状态 + {eq name="$detail.intent_status" value="0"}-{/eq} + {eq name="$detail.intent_status" value="1"}意向不明{/eq} + {eq name="$detail.intent_status" value="2"}意向模糊{/eq} + {eq name="$detail.intent_status" value="3"}意向一般{/eq} + {eq name="$detail.intent_status" value="4"}意向强烈{/eq} + 客户状态 + {eq name="$detail.status" value="0"}-{/eq} + {eq name="$detail.status" value="1"}新进客户{/eq} + {eq name="$detail.status" value="2"}跟进客户{/eq} + {eq name="$detail.status" value="3"}正式客户{/eq} + {eq name="$detail.status" value="4"}流失客户{/eq} + {eq name="$detail.status" value="5"}已成交客户{/eq} + 客户来源 + {volist name=":customer_source()" id="v"} + {eq name="$v.id" value="$detail.source_id" }{$v.title}{/eq} + {/volist} +
    归属员工{$detail.belong_name}归属部门{$detail.belong_department}共享员工{$detail.share_names}
    客户介绍{$detail.content}
    经营范围{$detail.market}
    备注信息{$detail.remark}
    +
    相关附件
    + {eq name="$detail.status" value="1" }
    {/eq} +
    +
    + {volist name="$detail.file_array" id="vo"} +
    {:file_card($vo)}
    + {/volist} +
    +
    首要联系人信息
    姓名称呼{$contact.name} 手机号码{$contact.mobile}QQ号码{$contact.qq}微信号码{$contact.wechat}
    最近沟通记录
    沟通时间{$detail.trace.follow_time}沟通人{$detail.trace.contact_name}跟进方式{$detail.trace.type_name}当前阶段{$detail.trace.stage_name}
    下次联系时间{$detail.trace.next_time}沟通内容{$detail.trace.content}
    +
    +
      +
    • 跟进记录
    • +
    • 联 系 人
    • +
    • 销售机会
    • +
    • 操作记录
    • +
    +
    +
    + {include file="/index/view_trace" /} +
    +
    + {include file="/index/view_contact" /} +
    +
    + {include file="/index/view_chance" /} +
    +
    + {include file="/index/view_log" /} +
    +
    +
    + + +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/index/view_chance2.html b/jun_pc_web/customer/index/view_chance2.html new file mode 100644 index 000000000..be117e883 --- /dev/null +++ b/jun_pc_web/customer/index/view_chance2.html @@ -0,0 +1,70 @@ +
    + +
    +
    +
    +
    + \ No newline at end of file diff --git a/jun_pc_web/customer/index/view_contact2.html b/jun_pc_web/customer/index/view_contact2.html new file mode 100644 index 000000000..51329c04e --- /dev/null +++ b/jun_pc_web/customer/index/view_contact2.html @@ -0,0 +1,98 @@ +
    + +
    +
    +
    +
    + \ No newline at end of file diff --git a/jun_pc_web/customer/index/view_log2.html b/jun_pc_web/customer/index/view_log2.html new file mode 100644 index 000000000..ef3bbbdd6 --- /dev/null +++ b/jun_pc_web/customer/index/view_log2.html @@ -0,0 +1,68 @@ +
    +
    +
    + \ No newline at end of file diff --git a/jun_pc_web/customer/index/view_trace2.html b/jun_pc_web/customer/index/view_trace2.html new file mode 100644 index 000000000..b1438b872 --- /dev/null +++ b/jun_pc_web/customer/index/view_trace2.html @@ -0,0 +1,73 @@ +
    + +
    +
    +
    +
    + \ No newline at end of file diff --git "a/jun_pc_web/customer/index/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/jun_pc_web/customer/index/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" new file mode 100644 index 000000000..217b1e862 Binary files /dev/null and "b/jun_pc_web/customer/index/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" differ diff --git a/jun_pc_web/customer/source/index.html b/jun_pc_web/customer/source/index.html new file mode 100644 index 000000000..8d7bd57bc --- /dev/null +++ b/jun_pc_web/customer/source/index.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/source/index.json b/jun_pc_web/customer/source/index.json new file mode 100644 index 000000000..f8dfc3d8a --- /dev/null +++ b/jun_pc_web/customer/source/index.json @@ -0,0 +1,64 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "独立开发", + "status": 1, + "create_time": 1637987189, + "update_time": 0 + }, + { + "id": 2, + "title": "微信公众号", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 3, + "title": "今日头条", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 4, + "title": "百度搜索", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 5, + "title": "销售活动", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 6, + "title": "电话来访", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 7, + "title": "客户介绍", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 8, + "title": "其他来源", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/customer/source/index2.html b/jun_pc_web/customer/source/index2.html new file mode 100644 index 000000000..ec3db6830 --- /dev/null +++ b/jun_pc_web/customer/source/index2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/customer/trace/index.html b/jun_pc_web/customer/trace/index.html new file mode 100644 index 000000000..5a5ea67ea --- /dev/null +++ b/jun_pc_web/customer/trace/index.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/customer/trace/index.json b/jun_pc_web/customer/trace/index.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/customer/trace/index.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/customer/trace/index2.html b/jun_pc_web/customer/trace/index2.html new file mode 100644 index 000000000..bc14a0b76 --- /dev/null +++ b/jun_pc_web/customer/trace/index2.html @@ -0,0 +1,115 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/favicon.ico b/jun_pc_web/favicon.ico new file mode 100644 index 000000000..e73c72ac8 Binary files /dev/null and b/jun_pc_web/favicon.ico differ diff --git a/jun_pc_web/finance/expense/add.html b/jun_pc_web/finance/expense/add.html new file mode 100644 index 000000000..425e69850 --- /dev/null +++ b/jun_pc_web/finance/expense/add.html @@ -0,0 +1,339 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
    +

    报销信息

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    报销人 + 超级员工 报销部门 + 董事会 +
    报销凭证编号* + + 原始单据日期* + + 入账月份* + +
    关联的项目 + + +
    报销选项* + + + + + + + + + + + + + +
    报销金额报销项目备注信息操作
    + + 删除
    +
    + +
    +
    附件
    +
    + +
    +
    审批流程* + +
    审核人* + +
    抄送人 + +
    + +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/expense/add2.html b/jun_pc_web/finance/expense/add2.html new file mode 100644 index 000000000..49705478c --- /dev/null +++ b/jun_pc_web/finance/expense/add2.html @@ -0,0 +1,398 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +

    报销信息

    + {if condition="($id == 0)"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    报销人 + {$user.name} + 报销部门 + {$user.department} +
    报销凭证编号* + + 原始单据日期* + + 入账月份* + +
    关联的项目 + + +
    报销选项* + + + + + + + + + + + + + +
    报销金额报销项目备注信息操作
    + + 删除
    +
    + +
    +
    附件
    +
    + +
    +
    审批流程* + +
    审核人* + +
    抄送人 + +
    + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    报销人{$expense.create_user}报销部门{$expense.department}
    报销凭证编号* + + 原始单据日期* + + 入账月份* + +
    关联的项目 + + +
    报销选项* + + + + + + + + {volist name="$expense.list" id="val"} + + + + + + + {/volist} +
    报销金额报销类别备注信息操作
    + + 删除
    +
    + +
    +
    附件
    +
    + + {notempty name="$expense.file_ids"} + {volist name="$expense.fileArray" id="vo"} +
    {:file_card($vo)}
    + {/volist} + {/notempty} +
    +
    审批流程* + +
    审核人* + +
    抄送人 + +
    + {/if} + +
    + + + +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/finance/expense/checkedlist.html b/jun_pc_web/finance/expense/checkedlist.html new file mode 100644 index 000000000..9bf79522c --- /dev/null +++ b/jun_pc_web/finance/expense/checkedlist.html @@ -0,0 +1,230 @@ + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/expense/checkedlist2.html b/jun_pc_web/finance/expense/checkedlist2.html new file mode 100644 index 000000000..25a7440ba --- /dev/null +++ b/jun_pc_web/finance/expense/checkedlist2.html @@ -0,0 +1,197 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/expense/copy.html b/jun_pc_web/finance/expense/copy.html new file mode 100644 index 000000000..b65bfde20 --- /dev/null +++ b/jun_pc_web/finance/expense/copy.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/expense/copy.json b/jun_pc_web/finance/expense/copy.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/finance/expense/copy.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/finance/expense/copy2.html b/jun_pc_web/finance/expense/copy2.html new file mode 100644 index 000000000..90fd7eae5 --- /dev/null +++ b/jun_pc_web/finance/expense/copy2.html @@ -0,0 +1,139 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/expense/index.html b/jun_pc_web/finance/expense/index.html new file mode 100644 index 000000000..483fe5d7e --- /dev/null +++ b/jun_pc_web/finance/expense/index.html @@ -0,0 +1,254 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/expense/index.json b/jun_pc_web/finance/expense/index.json new file mode 100644 index 000000000..80c659372 --- /dev/null +++ b/jun_pc_web/finance/expense/index.json @@ -0,0 +1,115 @@ +{ + "code": 0, + "msg": "", + "count": 4, + "data": [ + { + "id": 87, + "code": "111", + "income_month": "2023-12", + "expense_time": "2023-12-29", + "admin_id": 7, + "did": 6, + "ptid": 0, + "check_step_sort": 0, + "check_admin_ids": "51", + "flow_admin_ids": "", + "copy_uids": "", + "file_ids": "", + "check_status": 1, + "last_admin_id": "0", + "pay_admin_id": 0, + "pay_time": "-", + "remark": "", + "create_time": "2023-12-29 11:20:35", + "update_time": null, + "delete_time": 0, + "admin_name": "叶小钗", + "department": "技术部", + "pay_name": null, + "amount": 11, + "check_user": "照世明灯" + }, + { + "id": 81, + "code": "11111", + "income_month": "2023-02", + "expense_time": "2023-12-13", + "admin_id": 7, + "did": 6, + "ptid": 1077, + "check_step_sort": 0, + "check_admin_ids": "5", + "flow_admin_ids": "", + "copy_uids": "71", + "file_ids": "", + "check_status": 1, + "last_admin_id": "0", + "pay_admin_id": 0, + "pay_time": "-", + "remark": "", + "create_time": "2023-12-22 11:09:35", + "update_time": null, + "delete_time": 0, + "admin_name": "叶小钗", + "department": "技术部", + "pay_name": null, + "amount": 3122, + "check_user": "玉辞心" + }, + { + "id": 67, + "code": "1", + "income_month": "2023-11", + "expense_time": "2023-11-30", + "admin_id": 7, + "did": 6, + "ptid": 0, + "check_step_sort": 0, + "check_admin_ids": "4", + "flow_admin_ids": "", + "copy_uids": "", + "file_ids": "", + "check_status": 1, + "last_admin_id": "0", + "pay_admin_id": 0, + "pay_time": "-", + "remark": "", + "create_time": "2023-11-30 16:24:47", + "update_time": null, + "delete_time": 0, + "admin_name": "叶小钗", + "department": "技术部", + "pay_name": null, + "amount": 610, + "check_user": "风采铃" + }, + { + "id": 2, + "code": "1111", + "income_month": "2023-07", + "expense_time": "2023-06-06", + "admin_id": 7, + "did": 6, + "ptid": 1002, + "check_step_sort": 0, + "check_admin_ids": "4", + "flow_admin_ids": "", + "copy_uids": "88", + "file_ids": "", + "check_status": 1, + "last_admin_id": "0", + "pay_admin_id": 0, + "pay_time": "-", + "remark": "", + "create_time": "2023-06-06 15:05:28", + "update_time": null, + "delete_time": 0, + "admin_name": "叶小钗", + "department": "技术部", + "pay_name": null, + "amount": 1, + "check_user": "风采铃" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/finance/expense/index2.html b/jun_pc_web/finance/expense/index2.html new file mode 100644 index 000000000..018954d2b --- /dev/null +++ b/jun_pc_web/finance/expense/index2.html @@ -0,0 +1,216 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/expense/list.html b/jun_pc_web/finance/expense/list.html new file mode 100644 index 000000000..77fcdf99d --- /dev/null +++ b/jun_pc_web/finance/expense/list.html @@ -0,0 +1,184 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    +
      +
    • 全部
    • +
    • 待我审批
    • +
    • 我已审批
    • +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/expense/list.json b/jun_pc_web/finance/expense/list.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/finance/expense/list.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/finance/expense/list2.html b/jun_pc_web/finance/expense/list2.html new file mode 100644 index 000000000..a8be8e099 --- /dev/null +++ b/jun_pc_web/finance/expense/list2.html @@ -0,0 +1,146 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    +
      +
    • 全部
    • +
    • 待我审批
    • +
    • 我已审批
    • +
    +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/expense/view.html b/jun_pc_web/finance/expense/view.html new file mode 100644 index 000000000..97c598d59 --- /dev/null +++ b/jun_pc_web/finance/expense/view.html @@ -0,0 +1,378 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
    +

    报销详情

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    报销凭证编号43214321入账月份2024-01原始单据日期2024-01-01
    关联的项目新增TTT
    报销人超级员工报销部门董事会报销总费用(元)33
    费用金额 + + + + + + + + + + + + + + + + + + + + + +
    报销金额(元)报销类别备注信息
    11.00住宿费
    11.00招待费
    11.00住宿费111
    +
    + + + + + + + + + + + + + + + + + + +
    审核状态审批中 当前审核人张三抄送人-
    审批流程 +
    +
    + +
    超级员工
    +
    创建
    + +
    +
    +
    审批记录 +
      + +
    • + +

      2024-01-19 15:13超级员工提交了此申请。操作意见:提交申请

      +
    • +
    +
    + + + + +
    + 撤回 +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/expense/view2.html b/jun_pc_web/finance/expense/view2.html new file mode 100644 index 000000000..2564f2de8 --- /dev/null +++ b/jun_pc_web/finance/expense/view2.html @@ -0,0 +1,408 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +

    报销详情

    + + + + + + + + + + {if condition="$detail.ptid > 0"} + + + + + {/if} + + + + + + + + + {if condition="$detail.pay_admin_id > 0"} + + + + + + + {/if} + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {if ( $detail.check_status eq 5)} + + + + + + + + + {/if} +
    报销凭证编号{$detail.code}入账月份{$detail.income_month}原始单据日期{$detail.expense_time}
    关联的项目{$detail.ptname}
    报销人{$detail.create_user}报销部门{$detail.department}报销总费用(元){$detail.amount}
    打款人{$detail.pay_admin}打款时间{$detail.pay_time}
    费用金额 + + + + + + + {volist name="$detail.list" id="vo"} + + + + + + {/volist} +
    报销金额(元)报销类别备注信息
    {$vo.amount}{$vo.cate_title}{$vo.remarks}
    +
    相关附件 +
    + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo,'view')}
    + {/volist} +
    +
    报销状态已打款打款人{$detail.pay_admin}打款时间{$detail.pay_time}
    + + + + + + + + + + + + + + + {notempty name="$check_record"} + + + + + {/notempty} + {if ( $detail.check_status eq 1) AND ( $is_check_admin eq 1) } + {eq name="$flows.flow_type" value="0"} + + + + + {/eq} + + + + + {/if} +
    审核状态{eq name="$detail.check_status" value="0"}待审批{/eq} + {eq name="$detail.check_status" value="1"}审批中{/eq} + {eq name="$detail.check_status" value="2"}已通过,待打款{/eq} + {eq name="$detail.check_status" value="3"}已拒绝{/eq} + {eq name="$detail.check_status" value="4"}已撤销{/eq} + {eq name="$detail.check_status" value="5"}已通过,并打款{/eq} + 当前审核人{$detail.check_user}抄送人{$detail.copy_user}
    审批流程 +
    +
    + +
    {$detail.create_user}
    +
    创建
    + +
    +
    +
    审批记录 +
      + {volist name="$check_record" id="vo"} +
    • + +

      {$vo.check_time_str}{$vo.name}{$vo.status_str}了此申请。操作意见:{$vo.content}

      +
    • + {/volist} +
    +
    审批节点 * + + +
    + +
    +
    审批意见 * + +
    + + + + +
    + {eq name="$detail.check_status" value='1'} + {eq name="$is_check_admin" value='1'} + 通过 + {$flows.flow_type == 5?'回退':'拒绝'} + {/eq} + {eq name="$is_create_admin" value='1'} + 撤回 + {/eq} + {/eq} + {if ( $detail.check_status eq 3) AND ( $is_create_admin eq 1) } + 撤回 + {/if} + {if ( $detail.check_status eq 4) AND ( $is_create_admin eq 1) } + 重新编辑 + {/if} +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/finance/income/add2.html b/jun_pc_web/finance/income/add2.html new file mode 100644 index 000000000..153fbbd89 --- /dev/null +++ b/jun_pc_web/finance/income/add2.html @@ -0,0 +1,362 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +

    发票信息

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + + + + + {if condition="$detail.open_admin_id > 0"} + + + + + + + + + {/if} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + +
    发票金额 + {$detail.amount} + 发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} + 发票主体 + {volist name=":finance_invoice_subject()" id="vo"} + {eq name="$vo.id" value="$detail.invoice_subject"}{$vo.title}{/eq} + {/volist} +
    抬头类型 + {eq name="$detail.type" value="1"}企业{/eq} + {eq name="$detail.type" value="2"}个人{/eq} + 发票抬头{$detail.invoice_title}电话号码{$detail.invoice_phone}
    纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
    银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
    备注信息{$detail.remark}
    发票状态 + {if condition="($detail.check_status == 0)"} + 待审核 + {elseif condition="($detail.check_status == 1)"} + 审核中 + {elseif condition="($detail.check_status == 2)"} + 审核通过,待开具 + {elseif condition="($detail.check_status == 3)"} + 审核不通过 + {elseif condition="($detail.check_status == 4)"} + 已撤销 + {elseif condition="($detail.check_status == 5)"} + 已开具 + {elseif condition="($detail.check_status == 10)"} + 已作废 + {/if} +
    开票人{$detail.open_admin}开票时间{$detail.open_time}发票号码{$detail.code}
    关联附件 +
    + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo,'view')}
    + {/volist} +
    +
    +
    其他附件
    +
    + +
    +
    +
    + + {notempty name="$detail.other_file_ids"} + {volist name="$detail.fileArrayOther" id="vo"} +
    {:file_card($vo)}
    + {/volist} + {/notempty} +
    +
    + +

    到账信息

    + + + + + + + + + + + + + + +
    到账状态 + {if condition="($detail.is_cash == 0)"} + 未到账 + {elseif condition="($detail.is_cash == 1)"} + 部分到账 + {elseif condition="($detail.is_cash == 2)"} + 全部到账 + {/if} + 未到账金额(元){$detail.not_income}已到账金额(元){$detail.enter_amount}
    到账记录 + + + + + + + + {empty name="$detail.income"} + + + + {else/} + {volist name="$detail.income" id="vo"} + + + + + + + {/volist} + {/empty} +
    到账日期到帐金额(元)备注操作
    暂无到账记录
    {$vo.enter_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}删除
    + {if condition="($detail.is_cash lt 2)"} +
    + {/if} +
    +
    + + + {if condition="($detail.is_cash lt 2)"} + + + {/if} + {if condition="($detail.is_cash eq 0)"} + 全部到账 + {/if} + {if condition="($detail.is_cash eq 1)"} + 剩余部分全部到账 + {/if} + {if condition="($detail.is_cash gt 0)"} + 全部反到账 + {/if} +
    +
    + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/finance/income/index.html b/jun_pc_web/finance/income/index.html new file mode 100644 index 000000000..fc03257fb --- /dev/null +++ b/jun_pc_web/finance/income/index.html @@ -0,0 +1,248 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/income/index.json b/jun_pc_web/finance/income/index.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/finance/income/index.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/finance/income/index2.html b/jun_pc_web/finance/income/index2.html new file mode 100644 index 000000000..76863349f --- /dev/null +++ b/jun_pc_web/finance/income/index2.html @@ -0,0 +1,210 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/income/view2.html b/jun_pc_web/finance/income/view2.html new file mode 100644 index 000000000..a9d643638 --- /dev/null +++ b/jun_pc_web/finance/income/view2.html @@ -0,0 +1,219 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +

    发票信息

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + + + + + {if condition="$detail.open_admin_id > 0"} + + + + + + + + + {/if} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + +
    发票金额(元) + {$detail.amount} + 发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} + 发票主体 + {volist name=":finance_invoice_subject()" id="vo"} + {eq name="$vo.id" value="$detail.invoice_subject"}{$vo.title}{/eq} + {/volist} +
    抬头类型 + {eq name="$detail.type" value="1"}企业{/eq} + {eq name="$detail.type" value="2"}个人{/eq} + 发票抬头{$detail.invoice_title}电话号码{$detail.invoice_phone}
    纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
    银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
    备注信息{$detail.remark}
    发票状态 + {if condition="($detail.check_status == 0)"} + 待审核 + {elseif condition="($detail.check_status == 1)"} + 审核中 + {elseif condition="($detail.check_status == 2)"} + 审核通过,待开具 + {elseif condition="($detail.check_status == 3)"} + 审核不通过 + {elseif condition="($detail.check_status == 4)"} + 已撤销 + {elseif condition="($detail.check_status == 5)"} + 已开具 + {elseif condition="($detail.check_status == 10)"} + 已作废 + {/if} +
    开票人{$detail.open_admin}开票时间{$detail.open_time}发票号码{$detail.code}
    关联附件 +
    + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo,'view')}
    + {/volist} +
    +
    +
    其他附件
    +
    + +
    +
    +
    + + {notempty name="$detail.other_file_ids"} + {volist name="$detail.fileArrayOther" id="vo"} +
    {:file_card($vo)}
    + {/volist} + {/notempty} +
    +
    + +

    到账信息

    + + + + + + + + + + + + + + +
    到账状态 + {if condition="($detail.is_cash == 0)"} + 未到账 + {elseif condition="($detail.is_cash == 1)"} + 部分到账 + {elseif condition="($detail.is_cash == 2)"} + 全部到账 + {/if} + 未到账金额(元){$detail.not_income}已到账金额(元){$detail.enter_amount}
    到账记录 + + + + + + + + + {empty name="$detail.income"} + + + + {else/} + {volist name="$detail.income" id="vo"} + + + + + + + + {/volist} + {/empty} +
    到账日期到帐金额(元)备注登记人登记时间
    暂无到账记录
    {$vo.enter_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}{$vo.admin}{$vo.create_time | date='Y-m-d H:i:s'}
    +
    +
    + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/finance/index.html b/jun_pc_web/finance/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/finance/index.json b/jun_pc_web/finance/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/finance/invoice/add.html b/jun_pc_web/finance/invoice/add.html new file mode 100644 index 000000000..bb0b5c5a9 --- /dev/null +++ b/jun_pc_web/finance/invoice/add.html @@ -0,0 +1,265 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
    +

    申请开票

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    开票金额* + + 开票类型* + + 开票主体* + +
    抬头类型* + + + 开票抬头*电话号码
    纳税人识别号开户行银行账号
    银行营业网点地址
    关联合同 + + +
    +
    关联附件
    +
    + +
    +
    +
    + +
    +
    备注信息
    审批流程* + +
    审核人* + +
    抄送人 + +
    + +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/invoice/add2.html b/jun_pc_web/finance/invoice/add2.html new file mode 100644 index 000000000..646388b61 --- /dev/null +++ b/jun_pc_web/finance/invoice/add2.html @@ -0,0 +1,342 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +

    申请开票

    + {if condition="($id == 0)"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {gt name=":isModule('contract')" value="0"} + + + + + {/gt} + + + + + + + + + + + + + + + + + + + + +
    开票金额* + + 开票类型* + + 开票主体* + +
    抬头类型* + + + 开票抬头*电话号码
    纳税人识别号开户行银行账号
    银行营业网点地址
    关联合同 + + +
    +
    关联附件
    +
    + +
    +
    +
    + +
    +
    备注信息
    审批流程* + +
    审核人* + +
    抄送人 + +
    + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {gt name=":isModule('contract')" value="0"} + + + + + {/gt} + + + + + + + + + + + + + + + + + + + + +
    开票金额* + + 开票类型* + + 开票主体* + +
    抬头类型* + + + 开票抬头*电话号码
    纳税人识别号开户行银行账号
    银行营业网点地址
    关联合同 + + +
    +
    关联附件
    +
    + +
    +
    +
    + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo)}
    + {/volist} + {/notempty} +
    +
    备注信息
    审批流程* + +
    审核人* + +
    抄送人 + +
    + {/if} + +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/finance/invoice/checkedlist.html b/jun_pc_web/finance/invoice/checkedlist.html new file mode 100644 index 000000000..751ec94d0 --- /dev/null +++ b/jun_pc_web/finance/invoice/checkedlist.html @@ -0,0 +1,363 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/invoice/checkedlist.json b/jun_pc_web/finance/invoice/checkedlist.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/finance/invoice/checkedlist.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/finance/invoice/checkedlist2.html b/jun_pc_web/finance/invoice/checkedlist2.html new file mode 100644 index 000000000..f19fd7b10 --- /dev/null +++ b/jun_pc_web/finance/invoice/checkedlist2.html @@ -0,0 +1,328 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/invoice/copy.html b/jun_pc_web/finance/invoice/copy.html new file mode 100644 index 000000000..df1e9211f --- /dev/null +++ b/jun_pc_web/finance/invoice/copy.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/invoice/copy.json b/jun_pc_web/finance/invoice/copy.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/finance/invoice/copy.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/finance/invoice/copy2.html b/jun_pc_web/finance/invoice/copy2.html new file mode 100644 index 000000000..5d53ff306 --- /dev/null +++ b/jun_pc_web/finance/invoice/copy2.html @@ -0,0 +1,171 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/invoice/index.html b/jun_pc_web/finance/invoice/index.html new file mode 100644 index 000000000..00262e6e5 --- /dev/null +++ b/jun_pc_web/finance/invoice/index.html @@ -0,0 +1,282 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/invoice/index.json b/jun_pc_web/finance/invoice/index.json new file mode 100644 index 000000000..1db5fa200 --- /dev/null +++ b/jun_pc_web/finance/invoice/index.json @@ -0,0 +1,53 @@ +{ + "code": 0, + "msg": "", + "count": 1, + "data": [ + { + "id": 24, + "code": "", + "customer_id": 0, + "contract_id": 0, + "project_id": 0, + "cash_type": 1, + "is_cash": 0, + "amount": "20.00", + "enter_amount": "0.00", + "did": 6, + "admin_id": 7, + "check_admin_id": 0, + "check_time": 0, + "open_admin_id": 0, + "open_time": "", + "delivery": "", + "type": 1, + "invoice_subject": 1, + "invoice_type": 1, + "invoice_title": "1313", + "invoice_phone": "", + "invoice_tax": "111", + "invoice_bank": "哈哈哈", + "invoice_account": "111", + "invoice_banking": "哈哈哈", + "invoice_address": "3333", + "check_step_sort": 0, + "check_admin_ids": "5", + "flow_admin_ids": "", + "copy_uids": "", + "file_ids": "", + "other_file_ids": "", + "check_status": 1, + "last_admin_id": "0", + "check_remark": null, + "remark": "", + "enter_time": 0, + "create_time": "2023-11-29 11:00:27", + "update_time": null, + "delete_time": 0, + "name": "叶小钗", + "department_name": "技术部", + "check_user": "玉辞心", + "open_name": "-" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/finance/invoice/index2.html b/jun_pc_web/finance/invoice/index2.html new file mode 100644 index 000000000..098e94156 --- /dev/null +++ b/jun_pc_web/finance/invoice/index2.html @@ -0,0 +1,244 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/finance/invoice/list.html b/jun_pc_web/finance/invoice/list.html new file mode 100644 index 000000000..46d3d53cc --- /dev/null +++ b/jun_pc_web/finance/invoice/list.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
    +
    +
    +
      +
    • 全部
    • +
    • 待我审批
    • +
    • 我已审批
    • +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/invoice/list.json b/jun_pc_web/finance/invoice/list.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/finance/invoice/list.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/finance/invoice/list2.html b/jun_pc_web/finance/invoice/list2.html new file mode 100644 index 000000000..5236ccb0d --- /dev/null +++ b/jun_pc_web/finance/invoice/list2.html @@ -0,0 +1,176 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    +
      +
    • 全部
    • +
    • 待我审批
    • +
    • 我已审批
    • +
    +
    +
    +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/finance/invoice/view.html b/jun_pc_web/finance/invoice/view.html new file mode 100644 index 000000000..c4d47dcec --- /dev/null +++ b/jun_pc_web/finance/invoice/view.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
    +

    发票详情

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    开票金额(元) + 11.00 开票类型 + 普通发票 开票主体 + 勾股信息科技有限公司
    抬头类型 + 企业 开票抬头1电话号码1
    纳税人识别号1开户行1银行账号1
    银行营业网点1地址1
    备注信息1
    发票状态 + 审核中 + 当前审核人张三抄送人-
    审批流程 +
    +
    + +
    超级员工
    +
    创建
    + +
    +
    +
    审批记录 +
      + +
    • + +

      2024-01-19 15:17超级员工提交了此申请。操作意见:提交申请

      +
    • +
    +
    + + + + +
    + 撤回 +
    + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/finance/invoice/view2.html b/jun_pc_web/finance/invoice/view2.html new file mode 100644 index 000000000..a013d40a1 --- /dev/null +++ b/jun_pc_web/finance/invoice/view2.html @@ -0,0 +1,477 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +

    发票详情

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {if condition="$detail.contract_id > 0"} + + + + + {/if} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + + + + + + + + + + {notempty name="$check_record"} + + + + + {/notempty} + {if ( $detail.check_status eq 1) AND ( $is_check_admin eq 1) } + {eq name="$flows.flow_type" value="0"} + + + + + {/eq} + + + + + {/if} + {if ( $detail.check_status gt 4)} + + + + + + + + + + + + + + + + + {/if} +
    开票金额(元) + {$detail.amount} + 开票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} + 开票主体 + {volist name=":finance_invoice_subject()" id="vo"} + {eq name="$vo.id" value="$detail.invoice_subject"}{$vo.title}{/eq} + {/volist} +
    抬头类型 + {eq name="$detail.type" value="1"}企业{/eq} + {eq name="$detail.type" value="2"}个人{/eq} + 开票抬头{$detail.invoice_title}电话号码{$detail.invoice_phone}
    纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
    银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
    关联的合同{$detail.contract_name}
    备注信息{$detail.remark}
    关联附件 +
    + {volist name="$detail.fileArray" id="vo"} +
    {:file_card($vo,'view')}
    + {/volist} +
    +
    发票状态 + {if condition="($detail.check_status == 0)"} + 待审核 + {elseif condition="($detail.check_status == 1)"} + 审核中 + {elseif condition="($detail.check_status == 2)"} + 审核通过,待开具 + {elseif condition="($detail.check_status == 3)"} + 审核不通过 + {elseif condition="($detail.check_status == 4)"} + 已撤销 + {elseif condition="($detail.check_status == 5)"} + 已开具 + {elseif condition="($detail.check_status == 10)"} + 已作废 + {/if} + 当前审核人{$detail.check_user}抄送人{$detail.copy_user}
    审批流程 +
    +
    + +
    {$detail.create_user}
    +
    创建
    + +
    +
    +
    审批记录 +
      + {volist name="$check_record" id="vo"} +
    • + +

      {$vo.check_time_str}{$vo.name}{$vo.status_str}了此申请。操作意见:{$vo.content}

      +
    • + {/volist} +
    +
    审批节点 * + + + +
    + +
    + +
    审批意见 * + +
    开票人{$detail.open_admin}发票号码{$detail.code}开票时间{$detail.open_time}
    物流单号{$detail.delivery}
    +
    其他附件
    +
    + +
    +
    +
    + + {notempty name="$detail.other_file_ids"} + {volist name="$detail.fileArrayOther" id="vo"} +
    {:file_card($vo)}
    + {/volist} + {/notempty} +
    +
    + + + + +
    + {eq name="$detail.check_status" value='1'} + {eq name="$is_check_admin" value='1'} + 通过 + {$flows.flow_type == 5?'回退':'拒绝'} + {/eq} + {eq name="$is_create_admin" value='1'} + 撤回 + {/eq} + {/eq} + {if ( $detail.check_status eq 3) AND ( $is_create_admin eq 1) } + 撤回 + {/if} + {if ( $detail.check_status eq 4) AND ( $is_create_admin eq 1) } + 重新编辑 + {/if} +
    + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/finance/list.html b/jun_pc_web/finance/list.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/finance/list.json b/jun_pc_web/finance/list.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/home/2/conf/add2.html b/jun_pc_web/home/2/conf/add2.html new file mode 100644 index 000000000..282528608 --- /dev/null +++ b/jun_pc_web/home/2/conf/add2.html @@ -0,0 +1,68 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    配置项

    + + + + + + + + + + + + + + +
    配置名称* + + + + 状态* + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
    + 配置标识* + + +
    + 注意:新增配置项以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的配置模板文件,然后根据需求修改对应的表单即可。 +
    +
    + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/conf/email2.html b/jun_pc_web/home/2/conf/email2.html new file mode 100644 index 000000000..2e21bfbae --- /dev/null +++ b/jun_pc_web/home/2/conf/email2.html @@ -0,0 +1,120 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    邮箱配置

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SMTP地址* + + + + 如:QQ邮箱的SMTP服务器地址是smtp.qq.com,163邮箱的SMTP服务器地址是smtp.163.com +
    协议端口号* + + 如:QQ邮箱的ssl协议方式端口号是465/587,163邮箱的ssl协议方式端口号是465/994 +
    邮箱账户*如:gougucms@qq.com +
    邮箱密码*不一定是登录密码,如QQ邮箱的是第三方授权登录码,要自己去开启,在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 +
    发送人* + + 用于展示给发送方,如:勾股CMS系统管理员 +
    显示的邮箱* + + 可以不同于上面的账户,用于展示给发送方的邮箱,如:admin@gougucms.com +
    邮件模板 +
    +
    + + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/conf/index22.html b/jun_pc_web/home/2/conf/index22.html new file mode 100644 index 000000000..20b5e91ba --- /dev/null +++ b/jun_pc_web/home/2/conf/index22.html @@ -0,0 +1,103 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/conf/other2.html b/jun_pc_web/home/2/conf/other2.html new file mode 100644 index 000000000..75e18fc12 --- /dev/null +++ b/jun_pc_web/home/2/conf/other2.html @@ -0,0 +1,46 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    其他配置

    + + + + + + + +
    开发者 + + + 开发版本号
    + +
    + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/conf/token2.html b/jun_pc_web/home/2/conf/token2.html new file mode 100644 index 000000000..c5553cea8 --- /dev/null +++ b/jun_pc_web/home/2/conf/token2.html @@ -0,0 +1,127 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    TOKEN配置

    + + + + + + + + + + + + + +
    Token签发组织 + + + Token签发作者 + +
    Token Secrect + + Token过期时间 + +
    +
    + + +
    + +
    + Api测试登录 + Token测试 +
    +
    +

    先点击登录,在点击测试,会有好的结果哦!

    + 测试结果: +
    +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/conf/web2.html b/jun_pc_web/home/2/conf/web2.html new file mode 100644 index 000000000..62a65abea --- /dev/null +++ b/jun_pc_web/home/2/conf/web2.html @@ -0,0 +1,169 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    系统配置

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    系统名称* + + + + 左侧菜单模式 + {empty name="$config.menu_mode"} + + + {else/} + + + {/empty} +
    系统域名* + + + 系统大LOGO +
    + + +
    +
    系统小LOGO +
    + + +
    +
    ICP备案号 + +
    公安备案号 + +
    系统关键词* + +
    系统描述* + + +
    代码版本号* + + + 版权信息 + +
    开启新消息声音提醒 + {empty name="$config.msg_sound"} + + + {else/} + + + {/empty} + 开启系统页面水印 + {empty name="$config.watermark"} + + + {else/} + + + {/empty} +
    + +
    + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/database/backuplist2.html b/jun_pc_web/home/2/database/backuplist2.html new file mode 100644 index 000000000..1044419ab --- /dev/null +++ b/jun_pc_web/home/2/database/backuplist2.html @@ -0,0 +1,154 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +

    数据还原

    +
    + + + + + + + + + + {empty name="list"} + + + + {/empty} + {volist name="list" id="vo" key="k"} + + + + + + + + + {for start="0" end="$vo.data.part" step="1"} + + + + + {/for} + {/volist} +
    文件名称文件格式分隔符文件总大小分卷总数操作
    暂无备份数据
    备份时间:{$vo.time}{if $vo.timespan == $lock_time}该备份不是完整备份,请删除重新备份{/if}.sql{$vo.data.compress}{:format_bytes($vo.data.size)}{$vo.data.part} +
    + {if $vo.timespan == $lock_time} + 清除不完整的备份 + {else/} + 数据还原 + 删除备份 + {/if} +
    +
    + {:date("Ymd",$vo.timespan)}{$vo.data.compress}{:date("His",$vo.timespan)}{$vo.data.compress}{$i+1}.sql + + 下载备份(分卷{$i+1}) +
    +
    + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/database/database2.html b/jun_pc_web/home/2/database/database2.html new file mode 100644 index 000000000..bc07133d3 --- /dev/null +++ b/jun_pc_web/home/2/database/database2.html @@ -0,0 +1,201 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +
    +
    + +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/edit_password2.html b/jun_pc_web/home/2/index/edit_password2.html new file mode 100644 index 000000000..3c7dedcd8 --- /dev/null +++ b/jun_pc_web/home/2/index/edit_password2.html @@ -0,0 +1,74 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    + {notempty name="$admin.reg_pwd"} +
    初始化密码才能正常使用系统
    + {/notempty} +

    重置密码

    + + + + + + + + + + + + + +
    旧密码* + + 用户名{$admin.username}
    新密码* + + 确认新密码* + +
    +
    + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/edit_personal2.html b/jun_pc_web/home/2/index/edit_personal2.html new file mode 100644 index 000000000..e6e4d0f46 --- /dev/null +++ b/jun_pc_web/home/2/index/edit_personal2.html @@ -0,0 +1,108 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
    +

    修改个人信息

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    用户名{$admin.username}姓名{$admin.name}头像 +
    + +
    + + +
    +
    +
    手机号码{$admin.mobile}性别 + + +
    所在部门{$admin.department}岗位职称{$admin.position}
    员工类型 + {eq name="$admin.type" value="3"}实 习 生{/eq} + {eq name="$admin.type" value="2"}试用员工{/eq} + {eq name="$admin.type" value="1"}正式员工{/eq} + 入职日期 + {$admin.entry_time | date='Y-m-d'} +
    个人简介 + +
    +
    + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/index2.html b/jun_pc_web/home/2/index/index2.html new file mode 100644 index 000000000..ddf34e827 --- /dev/null +++ b/jun_pc_web/home/2/index/index2.html @@ -0,0 +1,265 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +
    +
    +
    + +
    + + + + + + + + + +
    + + +
    + + + {empty name="$web.menu_mode"} + {include file="/index/menu_classical" /} + {else/} + {if ($web.menu_mode == 'expand') } + {include file="/index/menu_expand" /} + {else/} + {include file="/index/menu_classical" /} + {/if} + {/empty} + +
    +
    +
    +
    + +
    +
    +
      +
    • +
    +
    +
    + + +
    +
    + +
    +
    + +
    + +
    +
    +
    + +{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_action2.html b/jun_pc_web/home/2/index/layout_action2.html new file mode 100644 index 000000000..f4854e103 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_action2.html @@ -0,0 +1,33 @@ +
    +

    员工动态

    更多
    +
    +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_article2.html b/jun_pc_web/home/2/index/layout_article2.html new file mode 100644 index 000000000..c3b8e0a80 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_article2.html @@ -0,0 +1,26 @@ +
      +
      +
      +
      知识列表
      +
      +
      +
      +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_chartview2.html b/jun_pc_web/home/2/index/layout_chartview2.html new file mode 100644 index 000000000..dbed63cb5 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_chartview2.html @@ -0,0 +1,122 @@ +
      +
      +
      +
      +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_chartyear2.html b/jun_pc_web/home/2/index/layout_chartyear2.html new file mode 100644 index 000000000..56dd851bf --- /dev/null +++ b/jun_pc_web/home/2/index/layout_chartyear2.html @@ -0,0 +1,84 @@ +
      +
      +
      +
      +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_count2.html b/jun_pc_web/home/2/index/layout_count2.html new file mode 100644 index 000000000..3bfe90b45 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_count2.html @@ -0,0 +1,16 @@ +
      +
      +
      + + + {volist name="$total" id="vo"} + + {/volist} + +
      +
      {$vo.name}
      +
      {$vo.num}
      +
      +
      +
      +
      \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_event2.html b/jun_pc_web/home/2/index/layout_event2.html new file mode 100644 index 000000000..bbbff97b8 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_event2.html @@ -0,0 +1,104 @@ + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_fastentry2.html b/jun_pc_web/home/2/index/layout_fastentry2.html new file mode 100644 index 000000000..b4458d7fb --- /dev/null +++ b/jun_pc_web/home/2/index/layout_fastentry2.html @@ -0,0 +1,70 @@ + + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_note2.html b/jun_pc_web/home/2/index/layout_note2.html new file mode 100644 index 000000000..1d3301a09 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_note2.html @@ -0,0 +1,25 @@ +
      +
      +
      +
      公告列表
      +
      +
      +
      +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_project2.html b/jun_pc_web/home/2/index/layout_project2.html new file mode 100644 index 000000000..9a2be2747 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_project2.html @@ -0,0 +1,34 @@ +
      +
      +
      +
      项目列表
      +
      +
      +
      +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_ranking2.html b/jun_pc_web/home/2/index/layout_ranking2.html new file mode 100644 index 000000000..dfda04cf1 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_ranking2.html @@ -0,0 +1,58 @@ +
      +

      最活跃员工最近30天前十的活跃度

      +
      +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_system2.html b/jun_pc_web/home/2/index/layout_system2.html new file mode 100644 index 000000000..1aa002d97 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_system2.html @@ -0,0 +1,69 @@ +
      +
      系统信息
      +
      + + {if condition="($install == true)"} + + + + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。
      服务器系统{:get_system_info('os')}PHP版本{:get_system_info('php')}
      上传附件限制{:get_system_info('upload_max_filesize')}执行时间限制{:get_system_info('max_execution_time')}
      勾股OA{:CMS_VERSION}勾股OA文档
      ThinkPHP版本{$TP_VERSION}TP8文档
      Layui版本{:LAYUI_VERSION}Layui文档
      合作联系微信号:hdm588,业务合作、功能定制请备注
      QQ交流群搜Q群:24641076(满),46924914(满),295256660
      或点击 gougucms交流群
      同系列开源软件勾股CMS勾股BLOG勾股DEV勾股ADMIN
      🍗🍗 给作者加鸡腿 🍗🍗
      + +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/layout_task2.html b/jun_pc_web/home/2/index/layout_task2.html new file mode 100644 index 000000000..11240b6a9 --- /dev/null +++ b/jun_pc_web/home/2/index/layout_task2.html @@ -0,0 +1,34 @@ +
      +
      +
      +
      任务列表
      +
      +
      +
      +
      +
      +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/log_list2.html b/jun_pc_web/home/2/index/log_list2.html new file mode 100644 index 000000000..e2b75953d --- /dev/null +++ b/jun_pc_web/home/2/index/log_list2.html @@ -0,0 +1,87 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
      +
      +

      员工动态

      + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/mail_list2.html b/jun_pc_web/home/2/index/mail_list2.html new file mode 100644 index 000000000..7340daaac --- /dev/null +++ b/jun_pc_web/home/2/index/mail_list2.html @@ -0,0 +1,193 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
      +
      +

      企业通讯录

      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/main2.html b/jun_pc_web/home/2/index/main2.html new file mode 100644 index 000000000..c67a6c406 --- /dev/null +++ b/jun_pc_web/home/2/index/main2.html @@ -0,0 +1,224 @@ +{extend name="../../base/view/common/base" /} + +{block name="style"} + +{/block} + +{block name="body"} +
      +
      +
      + {volist name="$layout_selected" id="layout"} + + {if ( $layout.row == 1) AND ( $layout.name == 'count') } + {include file="/index/layout_count" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'event') } + {include file="/index/layout_event" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'note') } + {include file="/index/layout_note" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'article') } + {include file="/index/layout_article" /} + {/if} + + {gt name=":isModule('project')" value="0"} + + {if ( $layout.row == 1) AND ( $layout.name == 'project') } + {include file="/index/layout_project" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'task') } + {include file="/index/layout_task" /} + {/if} + + {/gt} + + {if ( $layout.row == 1) AND ( $layout.name == 'chartview') } + {include file="/index/layout_chartview" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'chartyear') } + {include file="/index/layout_chartyear" /} + {/if} + + {/volist} +
      +
      + {volist name="$layout_selected" id="layout"} + {if ( $layout.row == 2) AND ( $layout.name == 'fastentry') } + {include file="/index/layout_fastentry" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'system') } + {include file="/index/layout_system" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'ranking') } + {include file="/index/layout_ranking" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'action') } + {include file="/index/layout_action" /} + {/if} + {/volist} +
      +
      +
      +{/block} + + + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/menu_classical2.html b/jun_pc_web/home/2/index/menu_classical2.html new file mode 100644 index 000000000..4fb74e48d --- /dev/null +++ b/jun_pc_web/home/2/index/menu_classical2.html @@ -0,0 +1,47 @@ +
      + + + +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/index/menu_expand2.html b/jun_pc_web/home/2/index/menu_expand2.html new file mode 100644 index 000000000..3079cfaf9 --- /dev/null +++ b/jun_pc_web/home/2/index/menu_expand2.html @@ -0,0 +1,70 @@ +
      + + +
      + \ No newline at end of file diff --git a/jun_pc_web/home/2/log/index2.html b/jun_pc_web/home/2/log/index2.html new file mode 100644 index 000000000..64b05b10c --- /dev/null +++ b/jun_pc_web/home/2/log/index2.html @@ -0,0 +1,94 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +
      +
      + +
      +
      + + +
      +
      +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/login/index2.html b/jun_pc_web/home/2/login/index2.html new file mode 100644 index 000000000..66a61f9bb --- /dev/null +++ b/jun_pc_web/home/2/login/index2.html @@ -0,0 +1,111 @@ + + + + + + + + {:get_system_config('web','admin_title')} + + + + +
      + + +
      + {:get_system_config('web','copyright')} ,勾股OA - v{:CMS_VERSION},Powered by GouguCMS +
      +
      + + + + diff --git a/jun_pc_web/home/2/login/lock2.html b/jun_pc_web/home/2/login/lock2.html new file mode 100644 index 000000000..b68973e02 --- /dev/null +++ b/jun_pc_web/home/2/login/lock2.html @@ -0,0 +1,100 @@ + + + + + + + + {:get_system_config('web','admin_title')} + + + + +
      +
      + + +
      + + + + diff --git a/jun_pc_web/home/2/module/index22.html b/jun_pc_web/home/2/module/index22.html new file mode 100644 index 000000000..d4e538477 --- /dev/null +++ b/jun_pc_web/home/2/module/index22.html @@ -0,0 +1,112 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      + + + + + + + + + + + {empty name="module"} + + + + {/empty} + {volist name="module" id="vo" key="k"} + + + + + + + {eq name="$vo.is_install" value="0"} + + + {/eq} + {eq name="$vo.is_install" value="1"} + + + {/eq} + + {/volist} +
      模块名称模块所在目录功能描述类型作者状态操作
      暂无数据
      {$vo.title}app/{$vo.name}{$vo.desc} + {eq name="$vo.type" value="1"}系统模块{/eq} + {eq name="$vo.type" value="2"}普通模块{/eq} + + {eq name="$vo.sourse" value="1"}勾股OA{/eq} + {eq name="$vo.sourse" value="2"}第三方{/eq} + + 未安装 + +
      + {eq name = "$vo.is_file" value="0"} + 下载 + {/eq} + {eq name = "$vo.is_file" value="1"} + 安装 + {/eq} + 演示 +
      +
      + 已安装 + +
      + 卸载 +
      +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/rule/add22.html b/jun_pc_web/home/2/rule/add22.html new file mode 100644 index 000000000..9b1c1528c --- /dev/null +++ b/jun_pc_web/home/2/rule/add22.html @@ -0,0 +1,188 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      功能菜单/节点

      + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      父级菜单/节点* + + + 所属功能模块* + +
      菜单/节点名称* + + + 操作日志名称* + + +
      菜单/节点URL + + 菜单排序 + +
      左侧菜单显示* + + + 菜单图标 + + 如:icon-jichupeizhi[查看图标] +
      注意:作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。
      + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      父级菜单/节点* + + + 所属功能模块* + +
      菜单/节点名称* + + + 操作日志名称* + + +
      菜单/节点URL + + 菜单排序 + +
      左侧菜单显示* + + + 菜单图标 + + [查看图标] +
      注意:作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。
      + {/if} +
      + + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/2/rule/index22.html b/jun_pc_web/home/2/rule/index22.html new file mode 100644 index 000000000..6594827cf --- /dev/null +++ b/jun_pc_web/home/2/rule/index22.html @@ -0,0 +1,101 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      + +
      +
      +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/car_cate2.html b/jun_pc_web/home/cate/car_cate2.html new file mode 100644 index 000000000..30e6c9848 --- /dev/null +++ b/jun_pc_web/home/cate/car_cate2.html @@ -0,0 +1,146 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/cost_cate.html b/jun_pc_web/home/cate/cost_cate.html new file mode 100644 index 000000000..cf66afebe --- /dev/null +++ b/jun_pc_web/home/cate/cost_cate.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/cost_cate.json b/jun_pc_web/home/cate/cost_cate.json new file mode 100644 index 000000000..bfc08bfee --- /dev/null +++ b/jun_pc_web/home/cate/cost_cate.json @@ -0,0 +1,57 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "差旅费", + "status": 1, + "create_time": 1639898199, + "update_time": 1685761005 + }, + { + "id": 2, + "title": "办公费", + "status": 1, + "create_time": 1639898434, + "update_time": 0 + }, + { + "id": 3, + "title": "招待费", + "status": 1, + "create_time": 1639898564, + "update_time": 0 + }, + { + "id": 4, + "title": "交通费", + "status": 1, + "create_time": 1639898564, + "update_time": 0 + }, + { + "id": 5, + "title": "通讯费", + "status": 1, + "create_time": 1639898564, + "update_time": 0 + }, + { + "id": 6, + "title": "采购付款", + "status": 1, + "create_time": 1639898564, + "update_time": 0 + }, + { + "id": 7, + "title": "其他", + "status": 1, + "create_time": 1639898564, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/cate/cost_cate2.html b/jun_pc_web/home/cate/cost_cate2.html new file mode 100644 index 000000000..d23f817ed --- /dev/null +++ b/jun_pc_web/home/cate/cost_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/expense_cate.html b/jun_pc_web/home/cate/expense_cate.html new file mode 100644 index 000000000..a2e661bc6 --- /dev/null +++ b/jun_pc_web/home/cate/expense_cate.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/expense_cate.json b/jun_pc_web/home/cate/expense_cate.json new file mode 100644 index 000000000..969972e53 --- /dev/null +++ b/jun_pc_web/home/cate/expense_cate.json @@ -0,0 +1,50 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "交通费", + "status": 1, + "create_time": 1637987189, + "update_time": 0 + }, + { + "id": 2, + "title": "住宿费", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 4, + "title": "招待费", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 5, + "title": "汽油费", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 6, + "title": "其他费", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 3, + "title": "餐补费", + "status": 1, + "create_time": 1638088518, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/cate/expense_cate2.html b/jun_pc_web/home/cate/expense_cate2.html new file mode 100644 index 000000000..70448eb2e --- /dev/null +++ b/jun_pc_web/home/cate/expense_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/flow_type.html b/jun_pc_web/home/cate/flow_type.html new file mode 100644 index 000000000..76c9b39b6 --- /dev/null +++ b/jun_pc_web/home/cate/flow_type.html @@ -0,0 +1,140 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/flow_type.json b/jun_pc_web/home/cate/flow_type.json new file mode 100644 index 000000000..7a475d9af --- /dev/null +++ b/jun_pc_web/home/cate/flow_type.json @@ -0,0 +1,346 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "type": 1, + "title": "请假", + "name": "qingjia", + "icon": "icon-kechengziyuanguanli", + "department_ids": "", + "status": 1, + "create_time": 1639896302, + "update_time": 0, + "type_name": "假勤", + "department": "全公司" + }, + { + "id": 2, + "type": 1, + "title": "出差", + "name": "chuchai", + "icon": "icon-jiaoshiguanli", + "department_ids": "", + "status": 1, + "create_time": 1641802838, + "update_time": 0, + "type_name": "假勤", + "department": "全公司" + }, + { + "id": 3, + "type": 1, + "title": "外出", + "name": "waichu", + "icon": "icon-tuiguangguanli", + "department_ids": "", + "status": 1, + "create_time": 1641802858, + "update_time": 0, + "type_name": "假勤", + "department": "全公司" + }, + { + "id": 4, + "type": 1, + "title": "加班", + "name": "jiaban", + "icon": "icon-xueshengchengji", + "department_ids": "", + "status": 1, + "create_time": 1641802892, + "update_time": 0, + "type_name": "假勤", + "department": "全公司" + }, + { + "id": 5, + "type": 2, + "title": "会议室预定", + "name": "huiyishi", + "icon": "icon-kehuguanli", + "department_ids": "", + "status": 1, + "create_time": 1641802939, + "update_time": 0, + "type_name": "行政", + "department": "全公司" + }, + { + "id": 6, + "type": 2, + "title": "公文流转", + "name": "gongwen", + "icon": "icon-jiaoxuejihua", + "department_ids": "", + "status": 1, + "create_time": 1641802976, + "update_time": 0, + "type_name": "行政", + "department": "全公司" + }, + { + "id": 7, + "type": 2, + "title": "物品维修", + "name": "weixiu", + "icon": "icon-chuangjianxitong", + "department_ids": "", + "status": 1, + "create_time": 1641803005, + "update_time": 0, + "type_name": "行政", + "department": "全公司" + }, + { + "id": 8, + "type": 2, + "title": "资质借用", + "name": "zizhi", + "icon": "icon-luquchengji", + "department_ids": "", + "status": 1, + "create_time": 1677661531, + "update_time": 0, + "type_name": "行政", + "department": "全公司" + }, + { + "id": 9, + "type": 2, + "title": "用章", + "name": "yongzhang", + "icon": "icon-shenpishezhi", + "department_ids": "", + "status": 1, + "create_time": 1641804126, + "update_time": 0, + "type_name": "行政", + "department": "全公司" + }, + { + "id": 10, + "type": 2, + "title": "用车", + "name": "yongche", + "icon": "icon-dongtaiguanli", + "department_ids": "", + "status": 1, + "create_time": 1641804283, + "update_time": 0, + "type_name": "行政", + "department": "全公司" + }, + { + "id": 11, + "type": 2, + "title": "用车归还", + "name": "yongcheguihai", + "icon": "icon-kaoheguanli", + "department_ids": "", + "status": 1, + "create_time": 1641804411, + "update_time": 0, + "type_name": "行政", + "department": "全公司" + }, + { + "id": 12, + "type": 3, + "title": "借款", + "name": "jiekuan", + "icon": "icon-zhangbuguanli", + "department_ids": "", + "status": 1, + "create_time": 1641804537, + "update_time": 0, + "type_name": "财务", + "department": "全公司" + }, + { + "id": 13, + "type": 3, + "title": "付款", + "name": "fukuan", + "icon": "icon-gongziguanli", + "department_ids": "", + "status": 1, + "create_time": 1641804601, + "update_time": 0, + "type_name": "财务", + "department": "全公司" + }, + { + "id": 14, + "type": 3, + "title": "奖励", + "name": "jiangli", + "icon": "icon-bulujiesuan", + "department_ids": "", + "status": 1, + "create_time": 1641804711, + "update_time": 0, + "type_name": "财务", + "department": "全公司" + }, + { + "id": 15, + "type": 3, + "title": "采购", + "name": "caigou", + "icon": "icon-shoufeiguanli", + "department_ids": "", + "status": 1, + "create_time": 1641804917, + "update_time": 0, + "type_name": "财务", + "department": "全公司" + }, + { + "id": 16, + "type": 3, + "title": "活动经费", + "name": "huodong", + "icon": "icon-shoufeipeizhi", + "department_ids": "", + "status": 1, + "create_time": 1641805110, + "update_time": 0, + "type_name": "财务", + "department": "全公司" + }, + { + "id": 17, + "type": 4, + "title": "入职", + "name": "ruzhi", + "icon": "icon-xueshengdaoru", + "department_ids": "", + "status": 1, + "create_time": 1641893853, + "update_time": 0, + "type_name": "人事", + "department": "全公司" + }, + { + "id": 18, + "type": 4, + "title": "转正", + "name": "zhuanzheng", + "icon": "icon-wodeshenpi", + "department_ids": "", + "status": 1, + "create_time": 1641893926, + "update_time": 0, + "type_name": "人事", + "department": "全公司" + }, + { + "id": 19, + "type": 4, + "title": "离职", + "name": "lizhi", + "icon": "icon-xuexitongji", + "department_ids": "", + "status": 1, + "create_time": 1641894048, + "update_time": 0, + "type_name": "人事", + "department": "全公司" + }, + { + "id": 20, + "type": 4, + "title": "转岗", + "name": "zhuangang", + "icon": "icon-xueshengyidong", + "department_ids": "", + "status": 1, + "create_time": 1654681664, + "update_time": 0, + "type_name": "人事", + "department": "全公司" + }, + { + "id": 21, + "type": 4, + "title": "招聘需求", + "name": "zhaopin", + "icon": "icon-xiaoxizhongxin", + "department_ids": "", + "status": 1, + "create_time": 1641894080, + "update_time": 0, + "type_name": "人事", + "department": "全公司" + }, + { + "id": 22, + "type": 5, + "title": "通用审批", + "name": "tongyong", + "icon": "icon-zhaoshengzhunbei", + "department_ids": "", + "status": 1, + "create_time": 1654685923, + "update_time": 0, + "type_name": "其他", + "department": "全公司" + }, + { + "id": 23, + "type": 6, + "title": "报销", + "name": "baoxiao", + "icon": "icon-jizhang", + "department_ids": "", + "status": 1, + "create_time": 1641804488, + "update_time": 0, + "type_name": "报销", + "department": "全公司" + }, + { + "id": 24, + "type": 7, + "title": "发票", + "name": "fapiao", + "icon": "icon-fuwuliebiao", + "department_ids": "", + "status": 1, + "create_time": 1642904833, + "update_time": 0, + "type_name": "发票", + "department": "全公司" + }, + { + "id": 25, + "type": 8, + "title": "合同", + "name": "hetong", + "icon": "icon-hetongshezhi", + "department_ids": "", + "status": 1, + "create_time": 1654692083, + "update_time": 0, + "type_name": "合同", + "department": "全公司" + }, + { + "id": 26, + "type": 1, + "title": "补卡申请", + "name": "buka", + "icon": "icon-kecheng", + "department_ids": "", + "status": 0, + "create_time": 1685699846, + "update_time": 1685699864, + "type_name": "假勤", + "department": "全公司" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/cate/flow_type2.html b/jun_pc_web/home/cate/flow_type2.html new file mode 100644 index 000000000..9c7613fd0 --- /dev/null +++ b/jun_pc_web/home/cate/flow_type2.html @@ -0,0 +1,102 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/flow_type_add.html b/jun_pc_web/home/cate/flow_type_add.html new file mode 100644 index 000000000..417c9efd6 --- /dev/null +++ b/jun_pc_web/home/cate/flow_type_add.html @@ -0,0 +1,126 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      审批类型

      + + + + + + + + + + + + + + + + + + + + +
      所属分类* + + 名称* + +
      应用部门 +
      + +
      + (如果不选,默认是全公司) +
      标识* + + 图标* + + 如:icon-jichupeizhi[查看图标] +
      + 注意:新增审批类型以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的审批类型模板文件,然后根据需求修改对应的表单即可。 +
      +
      + + + +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/flow_type_add2.html b/jun_pc_web/home/cate/flow_type_add2.html new file mode 100644 index 000000000..cb4d376bd --- /dev/null +++ b/jun_pc_web/home/cate/flow_type_add2.html @@ -0,0 +1,123 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      审批类型

      + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + +
      所属分类* + + 名称* + +
      应用部门 +
      + +
      + (如果不选,默认是全公司) +
      标识* + + 图标* + + 如:icon-jichupeizhi[查看图标] +
      + 注意:新增审批类型以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的审批类型模板文件,然后根据需求修改对应的表单即可。 +
      + {else/} + + + + + + + + + + + + + + + + + +
      所属分类* + + 名称* + +
      应用部门 +
      + +
      + (如果不选,默认是全公司) +
      标识* + + 图标* + + [查看图标] +
      + {/eq} +
      + + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/flow_type_edit.html b/jun_pc_web/home/cate/flow_type_edit.html new file mode 100644 index 000000000..66ded08ce --- /dev/null +++ b/jun_pc_web/home/cate/flow_type_edit.html @@ -0,0 +1,121 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      审批类型

      + + + + + + + + + + + + + + + + + +
      所属分类* + + 名称* + +
      应用部门 +
      + +
      + (如果不选,默认是全公司) +
      标识* + + 图标* + + [查看图标] +
      +
      + + + +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/industry_cate.html b/jun_pc_web/home/cate/industry_cate.html new file mode 100644 index 000000000..91985b285 --- /dev/null +++ b/jun_pc_web/home/cate/industry_cate.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/industry_cate.json b/jun_pc_web/home/cate/industry_cate.json new file mode 100644 index 000000000..556e25e67 --- /dev/null +++ b/jun_pc_web/home/cate/industry_cate.json @@ -0,0 +1,64 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "工业品企业", + "status": 1, + "create_time": 1637987189, + "update_time": 0 + }, + { + "id": 2, + "title": "互联网企业", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 3, + "title": "服务行业", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 4, + "title": "消费品企业", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 5, + "title": "原材料企业", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 6, + "title": "农业企业", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 7, + "title": "科技企业", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 8, + "title": "其他行业", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/cate/industry_cate2.html b/jun_pc_web/home/cate/industry_cate2.html new file mode 100644 index 000000000..6caa24eda --- /dev/null +++ b/jun_pc_web/home/cate/industry_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/seal_cate2.html b/jun_pc_web/home/cate/seal_cate2.html new file mode 100644 index 000000000..b22dfa8b1 --- /dev/null +++ b/jun_pc_web/home/cate/seal_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/services_cate.html b/jun_pc_web/home/cate/services_cate.html new file mode 100644 index 000000000..1d0f3c59e --- /dev/null +++ b/jun_pc_web/home/cate/services_cate.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/services_cate.json b/jun_pc_web/home/cate/services_cate.json new file mode 100644 index 000000000..6fe9fcec4 --- /dev/null +++ b/jun_pc_web/home/cate/services_cate.json @@ -0,0 +1,50 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "定制服务", + "status": 1, + "create_time": 1637987189, + "update_time": 0 + }, + { + "id": 2, + "title": "开店咨询", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 3, + "title": "推广运营", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 4, + "title": "财税咨询", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 5, + "title": "代理记账", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 6, + "title": "开卡服务", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/cate/services_cate2.html b/jun_pc_web/home/cate/services_cate2.html new file mode 100644 index 000000000..de25445f5 --- /dev/null +++ b/jun_pc_web/home/cate/services_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/subject.html b/jun_pc_web/home/cate/subject.html new file mode 100644 index 000000000..8f893c526 --- /dev/null +++ b/jun_pc_web/home/cate/subject.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/subject.json b/jun_pc_web/home/cate/subject.json new file mode 100644 index 000000000..48be4e642 --- /dev/null +++ b/jun_pc_web/home/cate/subject.json @@ -0,0 +1,15 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "勾股信息科技有限公司", + "status": 1, + "create_time": 1638006751, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/cate/subject2.html b/jun_pc_web/home/cate/subject2.html new file mode 100644 index 000000000..3af8c727f --- /dev/null +++ b/jun_pc_web/home/cate/subject2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/cate/work_cate.html b/jun_pc_web/home/cate/work_cate.html new file mode 100644 index 000000000..211bb299f --- /dev/null +++ b/jun_pc_web/home/cate/work_cate.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/cate/work_cate.json b/jun_pc_web/home/cate/work_cate.json new file mode 100644 index 000000000..4d36501d0 --- /dev/null +++ b/jun_pc_web/home/cate/work_cate.json @@ -0,0 +1,64 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "其他", + "status": 1, + "create_time": 1637987189, + "update_time": 0 + }, + { + "id": 2, + "title": "方案策划", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 3, + "title": "撰写文档", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 4, + "title": "需求调研", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 5, + "title": "需求沟通", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 6, + "title": "参加会议", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 7, + "title": "拜访客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 8, + "title": "接待客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/cate/work_cate2.html b/jun_pc_web/home/cate/work_cate2.html new file mode 100644 index 000000000..76f4d7392 --- /dev/null +++ b/jun_pc_web/home/cate/work_cate2.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/conf/2/add2.html b/jun_pc_web/home/conf/2/add2.html new file mode 100644 index 000000000..c96c068ed --- /dev/null +++ b/jun_pc_web/home/conf/2/add2.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + +
      +

      配置项

      + + + + + + + + + + + + + + +
      配置名称* + + + + 状态* + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
      + 配置标识* + + +
      + 注意:新增配置项以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的配置模板文件,然后根据需求修改对应的表单即可。 +
      +
      + + +
      +
      + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/home/conf/2/email2.html b/jun_pc_web/home/conf/2/email2.html new file mode 100644 index 000000000..2e21bfbae --- /dev/null +++ b/jun_pc_web/home/conf/2/email2.html @@ -0,0 +1,120 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      邮箱配置

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SMTP地址* + + + + 如:QQ邮箱的SMTP服务器地址是smtp.qq.com,163邮箱的SMTP服务器地址是smtp.163.com +
      协议端口号* + + 如:QQ邮箱的ssl协议方式端口号是465/587,163邮箱的ssl协议方式端口号是465/994 +
      邮箱账户*如:gougucms@qq.com +
      邮箱密码*不一定是登录密码,如QQ邮箱的是第三方授权登录码,要自己去开启,在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 +
      发送人* + + 用于展示给发送方,如:勾股CMS系统管理员 +
      显示的邮箱* + + 可以不同于上面的账户,用于展示给发送方的邮箱,如:admin@gougucms.com +
      邮件模板 +
      +
      + + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/conf/2/index.json b/jun_pc_web/home/conf/2/index.json new file mode 100644 index 000000000..153b27333 --- /dev/null +++ b/jun_pc_web/home/conf/2/index.json @@ -0,0 +1,44 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "网站配置", + "name": "web", + "content": "a:14:{s:2:\"id\";s:1:\"1\";s:11:\"admin_title\";s:8:\"勾股OA\";s:5:\"title\";s:8:\"勾股OA\";s:4:\"logo\";s:31:\"\/static\/home\/images\/syslogo.png\";s:4:\"file\";s:0:\"\";s:6:\"domain\";s:23:\"https:\/\/oa.gougucms.com\";s:3:\"icp\";s:23:\"粤ICP备1xxxxxx11号-1\";s:8:\"keywords\";s:8:\"勾股OA\";s:5:\"beian\";s:29:\"粤公网安备1xxxxxx11号-1\";s:4:\"desc\";s:481:\"勾股办公是一款基于ThinkPHP6 + Layui + MySql打造的,简单实用的开源免费的企业办公系统框架。系统集成了系统设置、人事管理模块、消息管理模块、日常办公、财务管理等基础模块。系统简约,易于功能扩展,方便二次开发,让开发者更专注于业务深度需求的开发,帮助开发者简单高效降低二次开发成本,通过二次开发之后可以用来做CRM,ERP,业务管理等系统。 \";s:10:\"small_logo\";s:37:\"\/static\/home\/images\/syslogo_small.png\";s:4:\"code\";s:0:\"\";s:9:\"copyright\";s:36:\"© 2023 gougucms.com GPL-3.0 license\";s:7:\"version\";s:6:\"1.0.24\";}", + "status": 1, + "create_time": 1612514630, + "update_time": 1685615067 + }, + { + "id": 2, + "title": "邮箱配置", + "name": "email", + "content": "a:8:{s:2:\"id\";s:1:\"2\";s:4:\"smtp\";s:11:\"smtp.qq.com\";s:9:\"smtp_port\";s:3:\"465\";s:9:\"smtp_user\";s:15:\"gougucms@qq.com\";s:8:\"smtp_pwd\";s:6:\"123456\";s:4:\"from\";s:24:\"勾股CMS系统管理员\";s:5:\"email\";s:18:\"admin@gougucms.com\";s:8:\"template\";s:485:\"

      勾股办公是一款基于ThinkPHP6 + Layui + MySql打造的,简单实用的开源免费的企业办公系统框架。系统集成了系统设置、人事管理模块、消息管理模块、日常办公、财务管理等基础模块。系统简约,易于功能扩展,方便二次开发,让开发者更专注于业务深度需求的开发,帮助开发者简单高效降低二次开发成本,通过二次开发之后可以用来做CRM,ERP,业务管理等系统。<\/p>\";}", + "status": 1, + "create_time": 1612521657, + "update_time": 1637075205 + }, + { + "id": 3, + "title": "Api Token配置", + "name": "token", + "content": "a:5:{s:2:\"id\";s:1:\"3\";s:3:\"iss\";s:15:\"oa.gougucms.com\";s:3:\"aud\";s:7:\"gouguoa\";s:7:\"secrect\";s:7:\"GOUGUOA\";s:7:\"exptime\";s:4:\"3600\";}", + "status": 1, + "create_time": 1627313142, + "update_time": 1685524225 + }, + { + "id": 4, + "title": "其他配置", + "name": "other", + "content": "a:3:{s:2:\"id\";s:1:\"5\";s:6:\"author\";s:15:\"勾股工作室\";s:7:\"version\";s:13:\"v1.2021.07.28\";}", + "status": 1, + "create_time": 1613725791, + "update_time": 1635953640 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/conf/2/index2.html b/jun_pc_web/home/conf/2/index2.html new file mode 100644 index 000000000..20b5e91ba --- /dev/null +++ b/jun_pc_web/home/conf/2/index2.html @@ -0,0 +1,103 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +

      +
      +
      + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/conf/2/other2.html b/jun_pc_web/home/conf/2/other2.html new file mode 100644 index 000000000..75e18fc12 --- /dev/null +++ b/jun_pc_web/home/conf/2/other2.html @@ -0,0 +1,46 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      其他配置

      + + + + + + + +
      开发者 + + + 开发版本号
      + +
      + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/conf/2/token2.html b/jun_pc_web/home/conf/2/token2.html new file mode 100644 index 000000000..c5553cea8 --- /dev/null +++ b/jun_pc_web/home/conf/2/token2.html @@ -0,0 +1,127 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      TOKEN配置

      + + + + + + + + + + + + + +
      Token签发组织 + + + Token签发作者 + +
      Token Secrect + + Token过期时间 + +
      +
      + + +
      + +
      + Api测试登录 + Token测试 +
      +
      +

      先点击登录,在点击测试,会有好的结果哦!

      + 测试结果: +
      +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/conf/2/web2.html b/jun_pc_web/home/conf/2/web2.html new file mode 100644 index 000000000..62a65abea --- /dev/null +++ b/jun_pc_web/home/conf/2/web2.html @@ -0,0 +1,169 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      系统配置

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      系统名称* + + + + 左侧菜单模式 + {empty name="$config.menu_mode"} + + + {else/} + + + {/empty} +
      系统域名* + + + 系统大LOGO +
      + + +
      +
      系统小LOGO +
      + + +
      +
      ICP备案号 + +
      公安备案号 + +
      系统关键词* + +
      系统描述* + + +
      代码版本号* + + + 版权信息 + +
      开启新消息声音提醒 + {empty name="$config.msg_sound"} + + + {else/} + + + {/empty} + 开启系统页面水印 + {empty name="$config.watermark"} + + + {else/} + + + {/empty} +
      + +
      + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/conf/add.html b/jun_pc_web/home/conf/add.html new file mode 100644 index 000000000..c0a43266c --- /dev/null +++ b/jun_pc_web/home/conf/add.html @@ -0,0 +1,123 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      配置项

      + + + + + + + + + + + + + + +
      配置名称* + + + + 状态* + + +
      + 配置标识* + + +
      + 注意:新增配置项以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的配置模板文件,然后根据需求修改对应的表单即可。 +
      +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/conf/edit1.html b/jun_pc_web/home/conf/edit1.html new file mode 100644 index 000000000..4e2528015 --- /dev/null +++ b/jun_pc_web/home/conf/edit1.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      系统配置

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      系统名称* + + + + 左侧菜单模式 + + + +
      系统域名* + + + 系统大LOGO +
      + + +
      +
      系统小LOGO +
      + + +
      +
      ICP备案号 + +
      公安备案号 + +
      系统关键词* + +
      系统描述* + + +
      代码版本号* + + + 版权信息 + +
      开启新消息声音提醒 + + + + 开启系统页面水印 + + + +
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/conf/edit2.html b/jun_pc_web/home/conf/edit2.html new file mode 100644 index 000000000..29e72d631 --- /dev/null +++ b/jun_pc_web/home/conf/edit2.html @@ -0,0 +1,172 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      邮箱配置

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SMTP地址* + + + + 如:QQ邮箱的SMTP服务器地址是smtp.qq.com,163邮箱的SMTP服务器地址是smtp.163.com +
      协议端口号* + + 如:QQ邮箱的ssl协议方式端口号是465/587,163邮箱的ssl协议方式端口号是465/994 +
      邮箱账户*如:gougucms@qq.com +
      邮箱密码*不一定是登录密码,如QQ邮箱的是第三方授权登录码,要自己去开启,在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 +
      发送人* + + 用于展示给发送方,如:勾股CMS系统管理员 +
      显示的邮箱* + + 可以不同于上面的账户,用于展示给发送方的邮箱,如:admin@gougucms.com +
      邮件模板 +
      +
      + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/conf/edit3.html b/jun_pc_web/home/conf/edit3.html new file mode 100644 index 000000000..9ab25d3be --- /dev/null +++ b/jun_pc_web/home/conf/edit3.html @@ -0,0 +1,179 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      TOKEN配置

      + + + + + + + + + + + + + +
      Token签发组织 + + + Token签发作者 + +
      Token Secrect + + Token过期时间 + +
      +
      + + +
      + +
      + Api测试登录 + Token测试 +
      +
      +

      先点击登录,在点击测试,会有好的结果哦!

      + 测试结果: +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/conf/edit4.html b/jun_pc_web/home/conf/edit4.html new file mode 100644 index 000000000..bba0d0bd8 --- /dev/null +++ b/jun_pc_web/home/conf/edit4.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      其他配置

      + + + + + + + +
      开发者 + + + 开发版本号
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/conf/edit5.html b/jun_pc_web/home/conf/edit5.html new file mode 100644 index 000000000..3de71c7d7 --- /dev/null +++ b/jun_pc_web/home/conf/edit5.html @@ -0,0 +1,97 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      通用配置

      + + + + + + + +
      配置项 + + + 配置值
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/conf/index.html b/jun_pc_web/home/conf/index.html new file mode 100644 index 000000000..577c2870d --- /dev/null +++ b/jun_pc_web/home/conf/index.html @@ -0,0 +1,181 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/conf/index2.html b/jun_pc_web/home/conf/index2.html new file mode 100644 index 000000000..ba670930d --- /dev/null +++ b/jun_pc_web/home/conf/index2.html @@ -0,0 +1,251 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/dataauth/contract_admin2.html b/jun_pc_web/home/dataauth/contract_admin2.html new file mode 100644 index 000000000..2a07ad5f6 --- /dev/null +++ b/jun_pc_web/home/dataauth/contract_admin2.html @@ -0,0 +1,68 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + +
      +

      合同模块使用说明:

      +

      {$detail.desc}

      +
      权限名称 + + {$detail.title} + 权限标识{$detail.name}开启关联客户 + + + 合同编号自动生成 + + +
      合同管理员 + + +
      +
      + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/dataauth/customer_admin2.html b/jun_pc_web/home/dataauth/customer_admin2.html new file mode 100644 index 000000000..9a3ba5661 --- /dev/null +++ b/jun_pc_web/home/dataauth/customer_admin2.html @@ -0,0 +1,80 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      客户模块使用说明:

      +

      {$detail.desc}

      +
      权限名称 + + {$detail.title} + 权限标识{$detail.name}
      每天可获取公客数* + 如:10,当日超过该数量,该员工就不能在抢客宝里面抢客或者从公海里领取客户,等到第二天自动恢复。 +
      员工客户数量限制* + 如:100,超过该数量,该员工就不能录入或者从公海领取客户,必须把自已的客户移到公海里,不超过该数量才能新增。 +
      客户保持周期(天)* + 如:30天,某员工把某个客户领取或者录入后开始,超过30天没有签合同的,就自动移入到公海。开启该功能需要在服务器配置开启定时服务计划,每天凌晨1点准时访问如下链接:, +
      客户管理员 + + +
      +
      + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/dataauth/edit1.html b/jun_pc_web/home/dataauth/edit1.html new file mode 100644 index 000000000..633dbc1bd --- /dev/null +++ b/jun_pc_web/home/dataauth/edit1.html @@ -0,0 +1,110 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + + + + + +
      +

      项目模块使用说明:

      +

      开具发票、报销打款、财务到账相关数据权限配置。

      +
      权限名称 + + 财务模块 权限标识finance_admin
      报销管理员 + + +
      发票管理员 + + +
      到账管理员 + + +
      +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/dataauth/edit2.html b/jun_pc_web/home/dataauth/edit2.html new file mode 100644 index 000000000..119973beb --- /dev/null +++ b/jun_pc_web/home/dataauth/edit2.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +

      客户模块使用说明:

      +

      查看、转移客户等相关数据权限配置。

      +
      权限名称 + + 客户模块 权限标识customer_admin
      每天可获取公客数* + 如:10,当日超过该数量,该员工就不能在抢客宝里面抢客或者从公海里领取客户,等到第二天自动恢复。 +
      员工客户数量限制* + 如:100,超过该数量,该员工就不能录入或者从公海领取客户,必须把自已的客户移到公海里,不超过该数量才能新增。 +
      客户保持周期(天)* + 如:30天,某员工把某个客户领取或者录入后开始,超过30天没有签合同的,就自动移入到公海。开启该功能需要在服务器配置开启定时服务计划,每天凌晨1点准时访问如下链接:, +
      客户管理员 + + +
      +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/dataauth/edit3.html b/jun_pc_web/home/dataauth/edit3.html new file mode 100644 index 000000000..f23e23283 --- /dev/null +++ b/jun_pc_web/home/dataauth/edit3.html @@ -0,0 +1,105 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + +
      +

      合同模块使用说明:

      +

      查看、编辑、作废、中止合同等相关数据权限配置。

      +
      权限名称 + + 合同模块 权限标识contract_admin开启关联客户 + + + 合同编号自动生成 + + +
      合同管理员 + + +
      +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/dataauth/edit4.html b/jun_pc_web/home/dataauth/edit4.html new file mode 100644 index 000000000..259a60ab9 --- /dev/null +++ b/jun_pc_web/home/dataauth/edit4.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + +
      +

      项目模块使用说明:

      +

      查看项目相关数据权限配置。

      +
      权限名称 + + 项目模块 权限标识project_admin
      默认阶段配置* + + +
      项目管理员 + + +
      +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/dataauth/finance_admin2.html b/jun_pc_web/home/dataauth/finance_admin2.html new file mode 100644 index 000000000..17a218fb3 --- /dev/null +++ b/jun_pc_web/home/dataauth/finance_admin2.html @@ -0,0 +1,73 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + + + + + +
      +

      项目模块使用说明:

      +

      {$detail.desc}

      +
      权限名称 + + {$detail.title} + 权限标识{$detail.name}
      报销管理员 + + +
      发票管理员 + + +
      到账管理员 + + +
      +
      + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/dataauth/index.html b/jun_pc_web/home/dataauth/index.html new file mode 100644 index 000000000..2d19e4c64 --- /dev/null +++ b/jun_pc_web/home/dataauth/index.html @@ -0,0 +1,111 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/dataauth/index.json b/jun_pc_web/home/dataauth/index.json new file mode 100644 index 000000000..36f03d406 --- /dev/null +++ b/jun_pc_web/home/dataauth/index.json @@ -0,0 +1,88 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "财务管理员", + "name": "finance_admin", + "desc": "拥有该权限的员工开具发票、报销打款、财务到账。", + "module": "finance", + "uids": "2,4,33,88,107,6", + "expected_1": 0, + "expected_2": 0, + "expected_3": 0, + "expected_4": 0, + "expected_5": 0, + "conf_1": "4,6,5,2", + "conf_2": "13,4,6,5", + "conf_3": "", + "conf_4": null, + "conf_5": null, + "create_time": 1656143065, + "update_time": 1681810212 + }, + { + "id": 2, + "title": "客户管理员", + "name": "customer_admin", + "desc": "拥有该权限的员工可以查看、转移所有客户。", + "module": "customer", + "uids": "3,6,8,40,5,22,39,93,94,96,19,20,2,24,31,32,35,11,21", + "expected_1": 10, + "expected_2": 0, + "expected_3": 0, + "expected_4": 0, + "expected_5": 0, + "conf_1": "", + "conf_2": "", + "conf_3": "", + "conf_4": null, + "conf_5": null, + "create_time": 1656143065, + "update_time": 1685349839 + }, + { + "id": 3, + "title": "合同管理员", + "name": "contract_admin", + "desc": "拥有该权限的员工可以查看、编辑、作废、中止所有合同。", + "module": "contract", + "uids": "2,86,4,6", + "expected_1": 1, + "expected_2": 1, + "expected_3": 0, + "expected_4": 0, + "expected_5": 0, + "conf_1": "", + "conf_2": "", + "conf_3": "", + "conf_4": null, + "conf_5": null, + "create_time": 1656143065, + "update_time": 1685174421 + }, + { + "id": 4, + "title": "项目管理员", + "name": "project_admin", + "desc": "拥有该权限的员工可以查看所有项目。", + "module": "project", + "uids": "2", + "expected_1": 0, + "expected_2": 0, + "expected_3": 0, + "expected_4": 0, + "expected_5": 0, + "conf_1": "立项阶段|实施阶段|验收阶段|交付阶段", + "conf_2": "", + "conf_3": "", + "conf_4": null, + "conf_5": null, + "create_time": 1656143065, + "update_time": 1683167046 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/dataauth/index2.html b/jun_pc_web/home/dataauth/index2.html new file mode 100644 index 000000000..7bfa98942 --- /dev/null +++ b/jun_pc_web/home/dataauth/index2.html @@ -0,0 +1,72 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +
      +
      + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/dataauth/project_admin2.html b/jun_pc_web/home/dataauth/project_admin2.html new file mode 100644 index 000000000..c3113e566 --- /dev/null +++ b/jun_pc_web/home/dataauth/project_admin2.html @@ -0,0 +1,65 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
      +

      权限配置

      + + + + + + + + + + + + + + + + + + +
      +

      项目模块使用说明:

      +

      {$detail.desc}

      +
      权限名称 + + {$detail.title} + 权限标识{$detail.name}
      默认阶段配置* + + +
      项目管理员 + + +
      +
      + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/database/backuplist.html b/jun_pc_web/home/database/backuplist.html new file mode 100644 index 000000000..00b3bb158 --- /dev/null +++ b/jun_pc_web/home/database/backuplist.html @@ -0,0 +1,178 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +

      数据还原

      +
      + + + + + + + + + + + + + + + + + + + + + +
      文件名称文件格式分隔符文件总大小分卷总数操作
      备份时间:2024-01-18 15:41:55.sql-3.32KB1 + +
      + 20240118-154155-1.sql + + 下载备份(分卷1) +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/database/backuplist.json b/jun_pc_web/home/database/backuplist.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/home/database/database.html b/jun_pc_web/home/database/database.html new file mode 100644 index 000000000..91e932370 --- /dev/null +++ b/jun_pc_web/home/database/database.html @@ -0,0 +1,240 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/database/database.json b/jun_pc_web/home/database/database.json new file mode 100644 index 000000000..7fdbb4a54 --- /dev/null +++ b/jun_pc_web/home/database/database.json @@ -0,0 +1,1456 @@ +{ + "code": 0, + "msg": "数据库中共有 69<\/strong> 张表,共计 1.11MB<\/strong>大小。", + "count": 0, + "data": [ + { + "name": "oa_admin", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 2, + "avg_row_length": 8192, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 16384, + "data_free": 0, + "auto_increment": 3, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-18 14:47:01", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "员工表", + "data_size": 16384 + }, + { + "name": "oa_admin_group", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 3, + "avg_row_length": 5461, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 16384, + "data_free": 0, + "auto_increment": 4, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "员工权限分组表", + "data_size": 16384 + }, + { + "name": "oa_admin_log", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 12, + "avg_row_length": 1365, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 13, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-18 15:41:55", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "员工操作日志表", + "data_size": 16384 + }, + { + "name": "oa_admin_module", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 10, + "avg_row_length": 1638, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 11, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "功能模块表", + "data_size": 16384 + }, + { + "name": "oa_admin_rule", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 204, + "avg_row_length": 240, + "data_length": "48KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 205, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "菜单及权限表", + "data_size": 49152 + }, + { + "name": "oa_approve", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "日常审批表", + "data_size": 16384 + }, + { + "name": "oa_article", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 5, + "avg_row_length": 3276, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 6, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-17 17:53:42", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "知识文章表", + "data_size": 16384 + }, + { + "name": "oa_article_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 2, + "avg_row_length": 8192, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 3, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-17 17:53:42", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "知识文章分类表", + "data_size": 16384 + }, + { + "name": "oa_article_comment", + "engine": "InnoDB", + "version": 10, + "row_format": "Compact", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1000, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "row_format=COMPACT", + "comment": "知识评论表", + "data_size": 16384 + }, + { + "name": "oa_article_keywords", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 4, + "avg_row_length": 4096, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 32768, + "data_free": 0, + "auto_increment": 5, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-17 17:53:42", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "知识文章关联表", + "data_size": 16384 + }, + { + "name": "oa_car_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 3, + "avg_row_length": 5461, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 4, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "用车类型", + "data_size": 16384 + }, + { + "name": "oa_config", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 4, + "avg_row_length": 4096, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 6, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "系统配置表", + "data_size": 16384 + }, + { + "name": "oa_contract", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1000, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "合同表", + "data_size": 16384 + }, + { + "name": "oa_contract_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 6, + "avg_row_length": 2730, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 7, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-17 17:53:42", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "合同类别", + "data_size": 16384 + }, + { + "name": "oa_contract_file", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "合同附件关联表", + "data_size": 16384 + }, + { + "name": "oa_contract_log", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "合同操作记录表", + "data_size": 16384 + }, + { + "name": "oa_cost_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 7, + "avg_row_length": 2340, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 8, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "费用类型", + "data_size": 16384 + }, + { + "name": "oa_customer", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1000, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户表", + "data_size": 16384 + }, + { + "name": "oa_customer_chance", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户销售机会表", + "data_size": 16384 + }, + { + "name": "oa_customer_contact", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户联系人表", + "data_size": 16384 + }, + { + "name": "oa_customer_file", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户附件关联表", + "data_size": 16384 + }, + { + "name": "oa_customer_grade", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 5, + "avg_row_length": 3276, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 6, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户等级", + "data_size": 16384 + }, + { + "name": "oa_customer_log", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户操作记录表", + "data_size": 16384 + }, + { + "name": "oa_customer_source", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 8, + "avg_row_length": 2048, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 9, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户来源", + "data_size": 16384 + }, + { + "name": "oa_customer_trace", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "客户跟进记录表", + "data_size": 16384 + }, + { + "name": "oa_data_auth", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 4, + "avg_row_length": 4096, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 5, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "数据权限表", + "data_size": 16384 + }, + { + "name": "oa_department", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 15, + "avg_row_length": 1092, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 16, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "部门组织", + "data_size": 16384 + }, + { + "name": "oa_department_change", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "人事调动部门记录表", + "data_size": 16384 + }, + { + "name": "oa_expense", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "报销表", + "data_size": 16384 + }, + { + "name": "oa_expense_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 6, + "avg_row_length": 2730, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 7, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "报销类型", + "data_size": 16384 + }, + { + "name": "oa_expense_interfix", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "报销关联数据表", + "data_size": 16384 + }, + { + "name": "oa_file", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 4, + "avg_row_length": 4096, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 5, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "文件表", + "data_size": 16384 + }, + { + "name": "oa_file_group", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "文件分组表", + "data_size": 16384 + }, + { + "name": "oa_flow", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 25, + "avg_row_length": 655, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 26, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "审批流程表", + "data_size": 16384 + }, + { + "name": "oa_flow_record", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "审批记录表", + "data_size": 16384 + }, + { + "name": "oa_flow_step", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "审批步骤表", + "data_size": 16384 + }, + { + "name": "oa_flow_type", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 25, + "avg_row_length": 655, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 26, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "审批类型", + "data_size": 16384 + }, + { + "name": "oa_industry", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 8, + "avg_row_length": 2048, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 9, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "行业", + "data_size": 16384 + }, + { + "name": "oa_invoice", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "发票表", + "data_size": 16384 + }, + { + "name": "oa_invoice_income", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "发票到账记录表", + "data_size": 16384 + }, + { + "name": "oa_invoice_subject", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 2, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "发票主体名称", + "data_size": 16384 + }, + { + "name": "oa_keywords", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 4, + "avg_row_length": 4096, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 5, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "关键字表", + "data_size": 16384 + }, + { + "name": "oa_meeting_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 3, + "avg_row_length": 5461, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 4, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "会议室", + "data_size": 16384 + }, + { + "name": "oa_message", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "消息表", + "data_size": 16384 + }, + { + "name": "oa_note", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 3, + "avg_row_length": 5461, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 4, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "公告", + "data_size": 16384 + }, + { + "name": "oa_note_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 3, + "avg_row_length": 5461, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 4, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "公告分类", + "data_size": 16384 + }, + { + "name": "oa_personal_quit", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "人事离职记录表", + "data_size": 16384 + }, + { + "name": "oa_plan", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 2, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-18 11:15:09", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "日程安排", + "data_size": 16384 + }, + { + "name": "oa_position", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 3, + "avg_row_length": 5461, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 4, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "岗位职称", + "data_size": 16384 + }, + { + "name": "oa_position_group", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 3, + "avg_row_length": 5461, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 16384, + "data_free": 0, + "auto_increment": null, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "权限分组和岗位的关联表", + "data_size": 16384 + }, + { + "name": "oa_project", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 1, + "avg_row_length": 16384, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1001, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-18 14:47:35", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "项目表", + "data_size": 16384 + }, + { + "name": "oa_project_comment", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1000, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "项目任务评论表", + "data_size": 16384 + }, + { + "name": "oa_project_document", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1000, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "项目文档表", + "data_size": 16384 + }, + { + "name": "oa_project_file", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "项目任务附件关联表", + "data_size": 16384 + }, + { + "name": "oa_project_link", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "链接关联表", + "data_size": 16384 + }, + { + "name": "oa_project_log", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 1, + "avg_row_length": 16384, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 2, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-18 14:46:27", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "项目任务操作记录表", + "data_size": 16384 + }, + { + "name": "oa_project_task", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1000, + "create_time": "2024-01-17 17:53:42", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "项目任务表", + "data_size": 16384 + }, + { + "name": "oa_project_user", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 2, + "avg_row_length": 8192, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 3, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-18 14:46:27", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "项目成员表", + "data_size": 16384 + }, + { + "name": "oa_schedule", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 1, + "avg_row_length": 16384, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 2, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-18 11:25:29", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "工作记录", + "data_size": 16384 + }, + { + "name": "oa_schedule_interfix", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "工作记录关联的附件表", + "data_size": 16384 + }, + { + "name": "oa_seal_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 4, + "avg_row_length": 4096, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 5, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "印章类型", + "data_size": 16384 + }, + { + "name": "oa_services", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 6, + "avg_row_length": 2730, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 7, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "企业服务", + "data_size": 16384 + }, + { + "name": "oa_step", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 4, + "avg_row_length": 4096, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 5, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-18 14:46:27", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "阶段步骤表", + "data_size": 16384 + }, + { + "name": "oa_step_record", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 1, + "avg_row_length": 16384, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 2, + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-18 14:47:35", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "阶段步骤记录表", + "data_size": 16384 + }, + { + "name": "oa_work", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "汇报工作表", + "data_size": 16384 + }, + { + "name": "oa_work_cate", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 8, + "avg_row_length": 2048, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 9, + "create_time": "2024-01-17 17:53:41", + "update_time": "2024-01-17 17:53:41", + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "工作类型", + "data_size": 16384 + }, + { + "name": "oa_work_comment", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "工作汇报点评表", + "data_size": 16384 + }, + { + "name": "oa_work_file_interfix", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "汇报工作关联的附件表", + "data_size": 16384 + }, + { + "name": "oa_work_record", + "engine": "InnoDB", + "version": 10, + "row_format": "Dynamic", + "rows": 0, + "avg_row_length": 0, + "data_length": "16KB", + "max_data_length": 0, + "index_length": 0, + "data_free": 0, + "auto_increment": 1, + "create_time": "2024-01-17 17:53:41", + "update_time": null, + "check_time": null, + "collation": "utf8mb4_general_ci", + "checksum": null, + "create_options": "", + "comment": "汇报工作发送记录表", + "data_size": 16384 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/database/index.html b/jun_pc_web/home/database/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/home/database/index.json b/jun_pc_web/home/database/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/home/files/edit.json b/jun_pc_web/home/files/edit.json new file mode 100644 index 000000000..7d7546257 --- /dev/null +++ b/jun_pc_web/home/files/edit.json @@ -0,0 +1 @@ +{"code":0,"msg":"操作成功","action":"","url":"","data":[]} \ No newline at end of file diff --git a/jun_pc_web/home/files/get_group.json b/jun_pc_web/home/files/get_group.json new file mode 100644 index 000000000..093d2ec3e --- /dev/null +++ b/jun_pc_web/home/files/get_group.json @@ -0,0 +1,16 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "重要文件", + "admin_id": 0, + "create_time": 0, + "update_time": 0, + "delete_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/files/index.html b/jun_pc_web/home/files/index.html new file mode 100644 index 000000000..c50d071e7 --- /dev/null +++ b/jun_pc_web/home/files/index.html @@ -0,0 +1,482 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
      +
      +
      +
      +
        +
      • 全部
      • +
      • 图片
      • +
      • 视频
      • +
      • 文档
      • +
      • 压缩包
      • +
      +
      +
      +
      + +
      +
        +
      • 全部
      • +
      • 未分组
      • +
      + +
      + +
      + +
      +
      +
      + 上传文件 + 批量删除 + 移动至 + +
      + + +
      +
      + +
      +
        +
        + + +
        +
        +
        +
        + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/files/index.json b/jun_pc_web/home/files/index.json new file mode 100644 index 000000000..1bac381f2 --- /dev/null +++ b/jun_pc_web/home/files/index.json @@ -0,0 +1,357 @@ +{ + "code": 0, + "msg": "", + "count": 14, + "data": [ + { + "id": 15, + "module": "admin", + "sha1": "3f728f01d94d225f1ba060102bd4020002ecb13c", + "md5": "446f5764e20e3d056016c189fa953373", + "name": "123.pdf", + "filename": "202311\/446f5764e20e3d056016c189fa953373.pdf", + "filepath": "\/storage\/202311\/446f5764e20e3d056016c189fa953373.pdf", + "filesize": 49962, + "fileext": "pdf", + "mimetype": "application\/pdf", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.156.125", + "status": 1, + "create_time": "2023-11-29 17:02:19", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1701248539, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 14, + "module": "admin", + "sha1": "7cc5d26ee4590997eb89cdc97fb8d3500f6ff26a", + "md5": "fd0d2f2ce2e5720af0f8db16c538255d", + "name": "5858.pptx", + "filename": "202311\/fd0d2f2ce2e5720af0f8db16c538255d.pptx", + "filepath": "\/storage\/202311\/fd0d2f2ce2e5720af0f8db16c538255d.pptx", + "filesize": 31778, + "fileext": "pptx", + "mimetype": "application\/vnd.openxmlformats-officedocument.presentationml.presentation", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.156.125", + "status": 1, + "create_time": "2023-11-29 16:30:29", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1701246629, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 13, + "module": "admin", + "sha1": "576ea980d43e3003669557f368e09cbcfe5af6ca", + "md5": "d78d0bc060f29431ab0787919b1dfeba", + "name": "456789.xls", + "filename": "202311\/d78d0bc060f29431ab0787919b1dfeba.xls", + "filepath": "\/storage\/202311\/d78d0bc060f29431ab0787919b1dfeba.xls", + "filesize": 18432, + "fileext": "xls", + "mimetype": "application\/vnd.ms-excel", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.156.125", + "status": 1, + "create_time": "2023-11-29 16:12:24", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1701245544, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 12, + "module": "admin", + "sha1": "bb073bcb58632729e89ea6ebf1f6e1775f7719a4", + "md5": "667231009dcafa985766ac21cd90961c", + "name": "123.docx", + "filename": "202311\/667231009dcafa985766ac21cd90961c.docx", + "filepath": "\/storage\/202311\/667231009dcafa985766ac21cd90961c.docx", + "filesize": 10100, + "fileext": "docx", + "mimetype": "application\/vnd.openxmlformats-officedocument.wordprocessingml.document", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.156.125", + "status": 1, + "create_time": "2023-11-29 15:27:38", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1701242858, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 11, + "module": "admin", + "sha1": "32cf75f1c51315010668f551762909ffc7f56fa5", + "md5": "7ca9865088a92eea3541e9670c6b32ce", + "name": "跟进报表.xlsx", + "filename": "202311\/7ca9865088a92eea3541e9670c6b32ce.xlsx", + "filepath": "\/storage\/202311\/7ca9865088a92eea3541e9670c6b32ce.xlsx", + "filesize": 9447, + "fileext": "xlsx", + "mimetype": "application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.156.125", + "status": 1, + "create_time": "2023-11-29 15:16:19", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1701242179, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 10, + "module": "admin", + "sha1": "45e99e571b174cd2a3066c0802c46637f068c5b5", + "md5": "8050e72bce9e0aa7fedfafe753afcb85", + "name": "001.doc", + "filename": "202311\/8050e72bce9e0aa7fedfafe753afcb85.doc", + "filepath": "\/storage\/202311\/8050e72bce9e0aa7fedfafe753afcb85.doc", + "filesize": 10240, + "fileext": "doc", + "mimetype": "application\/msword", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.156.125", + "status": 1, + "create_time": "2023-11-29 08:56:35", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1701219395, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 9, + "module": "admin", + "sha1": "3e85da0ffaecf54861deb9b0809f683cd553a3b2", + "md5": "56b799a94214a4155455361ec07bea47", + "name": "20231023-2.jpg", + "filename": "202310\/56b799a94214a4155455361ec07bea47.jpg", + "filepath": "\/storage\/202310\/56b799a94214a4155455361ec07bea47.jpg", + "filesize": 27988, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.152.3", + "status": 1, + "create_time": "2023-10-30 18:28:00", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1698661680, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 8, + "module": "admin", + "sha1": "3e85da0ffaecf54861deb9b0809f683cd553a3b2", + "md5": "56b799a94214a4155455361ec07bea47", + "name": "20231023-2.jpg", + "filename": "202310\/56b799a94214a4155455361ec07bea47.jpg", + "filepath": "\/storage\/202310\/56b799a94214a4155455361ec07bea47.jpg", + "filesize": 27988, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 0, + "user_id": 1, + "uploadip": "27.36.91.223", + "status": 1, + "create_time": "2023-10-26 16:48:36", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1698310116, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 7, + "module": "admin", + "sha1": "fd2af6d9445e104ed9cb999aaecd00cb32f0ce24", + "md5": "60903e7d42623369e8208c04af1ee16d", + "name": "php.jpg", + "filename": "202308\/60903e7d42623369e8208c04af1ee16d.jpg", + "filepath": "\/storage\/202308\/60903e7d42623369e8208c04af1ee16d.jpg", + "filesize": 36443, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 1, + "user_id": 1, + "uploadip": "27.45.154.33", + "status": 1, + "create_time": "2023-08-21 15:48:26", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1692604106, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": "重要文件" + }, + { + "id": 5, + "module": "admin", + "sha1": "977a411146b7a69c033b74513de554d31d847edc", + "md5": "822e73663c9237d7ba1ece7c594a9eb7", + "name": "312.jpg", + "filename": "202306\/822e73663c9237d7ba1ece7c594a9eb7.jpg", + "filepath": "\/storage\/202306\/822e73663c9237d7ba1ece7c594a9eb7.jpg", + "filesize": 79497, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 0, + "user_id": 1, + "uploadip": "27.45.155.61", + "status": 1, + "create_time": "2023-06-01 18:26:08", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1685615168, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 3, + "module": "admin", + "sha1": "5125347886f07f48f7003825660117039eb8784f", + "md5": "563e5e8f48e607ed54461796b0cb4844", + "name": "11.jpg", + "filename": "images\/1193f7a1585b9f6e8a97ae17718018b3.jpg", + "filepath": "https:\/\/blog.gougucms.com\/storage\/202204\/1193f7a1585b9f6e8a97ae17718018b3.jpg", + "filesize": 62609, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 1, + "user_id": 1, + "uploadip": "127.0.0.1", + "status": 1, + "create_time": "2022-02-17 08:23:53", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1645057433, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": "重要文件" + }, + { + "id": 4, + "module": "admin", + "sha1": "5125347886f07f48f7003825660117039eb8784f", + "md5": "563e5e8f48e607ed54461796b0cb4844", + "name": "q.jpg", + "filename": "images\/0f22a5ba4797b2fa22049ea73e6f779c.jpg", + "filepath": "https:\/\/blog.gougucms.com\/storage\/202202\/0f22a5ba4797b2fa22049ea73e6f779c.jpg", + "filesize": 62609, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 0, + "user_id": 1, + "uploadip": "127.0.0.1", + "status": 1, + "create_time": "2022-02-17 08:23:53", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1645057433, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": null + }, + { + "id": 1, + "module": "admin", + "sha1": "5125347886f07f48f7003825660117039eb8784f", + "md5": "563e5e8f48e607ed54461796b0cb4844", + "name": "ww.jpg.jpg", + "filename": "f95982689eb222b84e999122a50b3780.jpg", + "filepath": "https:\/\/blog.gougucms.com\/storage\/202202\/f95982689eb222b84e999122a50b3780.jpg", + "filesize": 62609, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 1, + "user_id": 1, + "uploadip": "127.0.0.1", + "status": 1, + "create_time": "2022-02-17 08:23:53", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1645057433, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": "重要文件" + }, + { + "id": 2, + "module": "admin", + "sha1": "5125347886f07f48f7003825660117039eb8784f", + "md5": "563e5e8f48e607ed54461796b0cb4844", + "name": "0.jpg", + "filename": "e729477de18e3be7e7eb4ec7fe2f821e.jpg", + "filepath": "https:\/\/blog.gougucms.com\/storage\/202202\/e729477de18e3be7e7eb4ec7fe2f821e.jpg", + "filesize": 62609, + "fileext": "jpg", + "mimetype": "image\/jpeg", + "group_id": 1, + "user_id": 1, + "uploadip": "127.0.0.1", + "status": 1, + "create_time": "2022-02-17 08:23:53", + "admin_id": 1, + "delete_time": 0, + "audit_time": 1645057433, + "action": "upload", + "use": "thumb", + "download": 0, + "admin_name": "超级员工", + "group_title": "重要文件" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/files/index2.html b/jun_pc_web/home/files/index2.html new file mode 100644 index 000000000..68c80fe31 --- /dev/null +++ b/jun_pc_web/home/files/index2.html @@ -0,0 +1,445 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
        +
        +
        +
        +
          +
        • 全部
        • +
        • 图片
        • +
        • 视频
        • +
        • 文档
        • +
        • 压缩包
        • +
        +
        +
        +
        + +
        +
          +
        • 全部
        • +
        • 未分组
        • +
        + +
        + +
        + +
        +
        +
        + 上传文件 + 批量删除 + 移动至 + +
        + + +
        +
        + +
        +
          +
          + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git "a/jun_pc_web/home/files/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/jun_pc_web/home/files/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" new file mode 100644 index 000000000..53cacf987 Binary files /dev/null and "b/jun_pc_web/home/files/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" differ diff --git a/jun_pc_web/home/flow/add.html b/jun_pc_web/home/flow/add.html new file mode 100644 index 000000000..79477527f --- /dev/null +++ b/jun_pc_web/home/flow/add.html @@ -0,0 +1,336 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
          +

          审批流程

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          流程名称* + + 应用模块* + + 审批类型* + +
          应用部门 +
          + +
          + (如果不选,默认是全公司) +
          流程说明 + +
          审批流类型* + + + +
          审批流程* +
          +
          +
          + +
          + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + 添加审批层级 +
          +

          温馨提示

          +

          1、当选择 “当前部门负责人” 审批时。系统仅会通知当前部门的负责人。

          +

          2、当选择 “上一级部门负责人” 审批时。系统仅会通知当前部门的上一级部门的负责人。

          +

          3、当选择 “指定人员(多人或签)” 时,表示指定用户中任意一人审批即可,可单选或多选。

          +

          4、当选择 “指定人员(多人会签)” 时,表示指定人员中所有人都需要审批,可单选或多选。

          +

          5、如果指定用户没有分配查看审批模块的功能权限,系统会通知其审批,但是他无法查看此审批数据信息。

          +
          +
          抄送人 + + +
          +
          + + + +
          +
          + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/flow/add2.html b/jun_pc_web/home/flow/add2.html new file mode 100644 index 000000000..1c769edca --- /dev/null +++ b/jun_pc_web/home/flow/add2.html @@ -0,0 +1,477 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +

          审批流程

          + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          流程名称* + + 应用模块* + + 审批类型* + +
          应用部门 +
          + +
          + (如果不选,默认是全公司) +
          流程说明 + +
          审批流类型* + + + +
          审批流程* +
          +
          +
          + +
          + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + 添加审批层级 +
          +

          温馨提示

          +

          1、当选择 “当前部门负责人” 审批时。系统仅会通知当前部门的负责人。

          +

          2、当选择 “上一级部门负责人” 审批时。系统仅会通知当前部门的上一级部门的负责人。

          +

          3、当选择 “指定人员(多人或签)” 时,表示指定用户中任意一人审批即可,可单选或多选。

          +

          4、当选择 “指定人员(多人会签)” 时,表示指定人员中所有人都需要审批,可单选或多选。

          +

          5、如果指定用户没有分配查看审批模块的功能权限,系统会通知其审批,但是他无法查看此审批数据信息。

          +
          +
          抄送人 + + +
          + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          流程名称* + + 应用模块* + + 审批类型* + +
          应用部门 +
          + +
          + (如果不选,默认是全公司) +
          流程说明 + +
          审批流类型* + + + +
          审批流程* +
          + {eq name="$detail.check_type" value="1"} + {volist name="detail.flow_list" id="vo"} +
          +
          + +
          + +
          +
          +
          + +
          + + +
          +
          + {gt name="$key" value="0"} + 删除 + {/gt} +
          + {/volist} + {else/} +
          +
          + +
          + +
          +
          +
          + +
          + + +
          +
          +
          + {/eq} +
          + + 添加审批层级 +
          +

          温馨提示

          +

          1、当选择 “当前部门负责人” 审批时。系统仅会通知当前部门的负责人。

          +

          2、当选择 “上一级部门负责人” 审批时。系统仅会通知当前部门的上一级部门的负责人。

          +

          3、当选择 “指定人员(多人或签)” 时,表示指定用户中任意一人审批即可,可单选或多选。

          +

          4、当选择 “指定人员(多人会签)” 时,表示指定人员中所有人都需要审批,可单选或多选。

          +

          5、如果指定用户没有分配查看审批模块的功能权限,系统会通知其审批,但是他无法查看此审批数据信息。

          +
          +
          审批流程* +
          +

          温馨提示

          +

          无需配置审批人,审批时,根据实际情况选择审批人即可,自由度最高。

          +
          +
          审批流程* +
          + {eq name="$detail.check_type" value="3"} + {volist name="detail.flow_list" id="vo"} +
          +
          + +
          + +
          +
          +
          + +
          + + +
          +
          + {gt name="$key" value="0"} + 删除 + {/gt} +
          + {/volist} + {else/} +
          +
          + +
          + +
          +
          +
          + +
          + + +
          +
          +
          + {/eq} +
          + + 添加审批层级 +
          +

          温馨提示

          +

          1、指定人员单选。后期审批的时候,审批人只能该指定人员。

          +

          2、该审批流程可回退,当拒绝审核时,会自动回退到上一位审批人节点。

          +
          +
          抄送人 + + +
          + {/eq} +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/flow/edit.html b/jun_pc_web/home/flow/edit.html new file mode 100644 index 000000000..882660f58 --- /dev/null +++ b/jun_pc_web/home/flow/edit.html @@ -0,0 +1,340 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
          +

          审批流程

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          流程名称* + + 应用模块* + + 审批类型* + +
          应用部门 +
          + +
          + (如果不选,默认是全公司) +
          流程说明 + +
          审批流类型* + + + +
          审批流程* +
          +

          温馨提示

          +

          无需配置审批人,审批时,根据实际情况选择审批人即可,自由度最高。

          +
          +
          抄送人 + + +
          +
          + + + +
          +
          + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/flow/get_department_select.json b/jun_pc_web/home/flow/get_department_select.json new file mode 100644 index 000000000..97aa11e11 --- /dev/null +++ b/jun_pc_web/home/flow/get_department_select.json @@ -0,0 +1,102 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "name": "董事会", + "value": 1, + "selected": "", + "children": [ + { + "name": "人事部", + "value": 2, + "selected": "", + "children": [] + }, + { + "name": "财务部", + "value": 3, + "selected": "", + "children": [] + }, + { + "name": "市场部", + "value": 4, + "selected": "", + "children": [] + }, + { + "name": "销售部", + "value": 5, + "selected": "", + "children": [ + { + "name": "销售一部", + "value": 8, + "selected": "", + "children": [] + }, + { + "name": "销售二部", + "value": 9, + "selected": "", + "children": [] + }, + { + "name": "销售三部", + "value": 10, + "selected": "", + "children": [] + } + ] + }, + { + "name": "技术部", + "value": 6, + "selected": "", + "children": [ + { + "name": "产品部", + "value": 11, + "selected": "", + "children": [] + }, + { + "name": "设计部", + "value": 12, + "selected": "", + "children": [] + }, + { + "name": "研发部", + "value": 13, + "selected": "", + "children": [] + } + ] + }, + { + "name": "客服部", + "value": 7, + "selected": "", + "children": [ + { + "name": "客服一部", + "value": 14, + "selected": "", + "children": [] + }, + { + "name": "客服二部", + "value": 15, + "selected": "", + "children": [] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/flow/index.html b/jun_pc_web/home/flow/index.html new file mode 100644 index 000000000..b85c9bcbf --- /dev/null +++ b/jun_pc_web/home/flow/index.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
          +
          +
          + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/flow/index.json b/jun_pc_web/home/flow/index.json new file mode 100644 index 000000000..daa784422 --- /dev/null +++ b/jun_pc_web/home/flow/index.json @@ -0,0 +1,528 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "name": "请假审批", + "check_type": 1, + "type": 1, + "flow_cate": "请假", + "department_ids": "", + "copy_uids": "33", + "remark": "请假审批流程", + "flow_list": "a:2:{i:0;a:2:{s:9:\"flow_type\";s:1:\"3\";s:9:\"flow_uids\";s:12:\"88,105,60,68\";}i:1;a:2:{s:9:\"flow_type\";s:1:\"1\";s:9:\"flow_uids\";s:0:\"\";}}", + "admin_id": 1, + "create_time": 1644401970, + "update_time": 1685752654, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "假勤" + }, + { + "id": 2, + "name": "出差审批", + "check_type": 2, + "type": 1, + "flow_cate": "出差", + "department_ids": "", + "copy_uids": "", + "remark": "请假审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402054, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "假勤" + }, + { + "id": 3, + "name": "外出审批", + "check_type": 2, + "type": 1, + "flow_cate": "外出", + "department_ids": "", + "copy_uids": "", + "remark": "外出审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402116, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "假勤" + }, + { + "id": 4, + "name": "加班申请审批", + "check_type": 2, + "type": 1, + "flow_cate": "加班", + "department_ids": "", + "copy_uids": "", + "remark": "加班申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402147, + "update_time": 1644456735, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "假勤" + }, + { + "id": 5, + "name": "会议室预定审批", + "check_type": 2, + "type": 2, + "flow_cate": "会议室预定", + "department_ids": "", + "copy_uids": "", + "remark": "会议室预定审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402193, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "行政" + }, + { + "id": 6, + "name": "公文流转审批", + "check_type": 2, + "type": 2, + "flow_cate": "公文流转", + "department_ids": "", + "copy_uids": "", + "remark": "公文流转审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402386, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "行政" + }, + { + "id": 7, + "name": "物品维修审批", + "check_type": 2, + "type": 2, + "flow_cate": "物品维修", + "department_ids": "", + "copy_uids": "", + "remark": "物品维修审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402473, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "行政" + }, + { + "id": 8, + "name": "资质借用审批", + "check_type": 2, + "type": 2, + "flow_cate": "资质借用", + "department_ids": "", + "copy_uids": "", + "remark": "资质借用审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1677661607, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "行政" + }, + { + "id": 9, + "name": "用章审批", + "check_type": 2, + "type": 2, + "flow_cate": "用章", + "department_ids": "", + "copy_uids": "", + "remark": "用章审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402499, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "行政" + }, + { + "id": 10, + "name": "用车审批", + "check_type": 2, + "type": 2, + "flow_cate": "用车", + "department_ids": "", + "copy_uids": "", + "remark": "用车审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402525, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "行政" + }, + { + "id": 11, + "name": "用车归还审批", + "check_type": 2, + "type": 2, + "flow_cate": "用车归还", + "department_ids": "", + "copy_uids": "", + "remark": "用车归还审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402549, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "行政" + }, + { + "id": 12, + "name": "借款申请审批", + "check_type": 2, + "type": 3, + "flow_cate": "借款", + "department_ids": "", + "copy_uids": "", + "remark": "借款申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402611, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "财务" + }, + { + "id": 13, + "name": "付款申请审批", + "check_type": 2, + "type": 3, + "flow_cate": "付款", + "department_ids": "", + "copy_uids": "", + "remark": "付款申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402679, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "财务" + }, + { + "id": 14, + "name": "奖励申请审批", + "check_type": 2, + "type": 3, + "flow_cate": "奖励", + "department_ids": "", + "copy_uids": "", + "remark": "奖励申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402705, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "财务" + }, + { + "id": 15, + "name": "采购申请审批", + "check_type": 2, + "type": 3, + "flow_cate": "采购", + "department_ids": "", + "copy_uids": "", + "remark": "采购申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402739, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "财务" + }, + { + "id": 16, + "name": "活动经费审批", + "check_type": 2, + "type": 3, + "flow_cate": "活动经费", + "department_ids": "", + "copy_uids": "", + "remark": "活动经费审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402762, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "财务" + }, + { + "id": 17, + "name": "入职申请审批", + "check_type": 2, + "type": 4, + "flow_cate": "入职", + "department_ids": "", + "copy_uids": "", + "remark": "入职申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402791, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "人事" + }, + { + "id": 18, + "name": "转正申请审批", + "check_type": 2, + "type": 4, + "flow_cate": "转正", + "department_ids": "", + "copy_uids": "", + "remark": "转正申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402812, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "人事" + }, + { + "id": 19, + "name": "离职申请审批", + "check_type": 2, + "type": 4, + "flow_cate": "离职", + "department_ids": "", + "copy_uids": "", + "remark": "离职申请审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402834, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "人事" + }, + { + "id": 20, + "name": "转岗申请审批", + "check_type": 2, + "type": 4, + "flow_cate": "转岗", + "department_ids": "", + "copy_uids": "", + "remark": "转岗申请审核流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1654681954, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "人事" + }, + { + "id": 21, + "name": "招聘需求审批", + "check_type": 2, + "type": 4, + "flow_cate": "招聘需求", + "department_ids": "", + "copy_uids": "", + "remark": "招聘需求审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644402855, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "人事" + }, + { + "id": 22, + "name": "通用审批", + "check_type": 2, + "type": 5, + "flow_cate": "通用审批", + "department_ids": "", + "copy_uids": "", + "remark": "通用审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1654686338, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "其他" + }, + { + "id": 23, + "name": "报销审批", + "check_type": 2, + "type": 6, + "flow_cate": "报销", + "department_ids": "", + "copy_uids": "", + "remark": "报销审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644490024, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "报销" + }, + { + "id": 24, + "name": "发票审批", + "check_type": 2, + "type": 7, + "flow_cate": "发票", + "department_ids": "", + "copy_uids": "", + "remark": "发票审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1644490053, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "发票" + }, + { + "id": 25, + "name": "合同审批", + "check_type": 2, + "type": 8, + "flow_cate": "合同", + "department_ids": "", + "copy_uids": "", + "remark": "合同审批流程", + "flow_list": "", + "admin_id": 1, + "create_time": 1654692519, + "update_time": 0, + "status": 1, + "delete_time": 0, + "delete_user_id": 0, + "username": "超级员工", + "department": "全公司", + "type_name": "合同" + }, + { + "id": 26, + "name": "补卡流程", + "check_type": 1, + "type": 1, + "flow_cate": "补卡申请", + "department_ids": "", + "copy_uids": "", + "remark": "", + "flow_list": "a:3:{i:0;a:2:{s:9:\"flow_type\";s:1:\"1\";s:9:\"flow_uids\";s:0:\"\";}i:1;a:2:{s:9:\"flow_type\";s:1:\"2\";s:9:\"flow_uids\";s:0:\"\";}i:2;a:2:{s:9:\"flow_type\";s:1:\"3\";s:9:\"flow_uids\";s:2:\"88\";}}", + "admin_id": 3, + "create_time": 1685699925, + "update_time": 1700106308, + "status": 0, + "delete_time": 0, + "delete_user_id": 0, + "username": "一页书", + "department": "全公司", + "type_name": "假勤" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/flow/index2.html b/jun_pc_web/home/flow/index2.html new file mode 100644 index 000000000..a8c44d479 --- /dev/null +++ b/jun_pc_web/home/flow/index2.html @@ -0,0 +1,110 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/index.html b/jun_pc_web/home/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/home/index.json b/jun_pc_web/home/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/home/index/get_article_list.json b/jun_pc_web/home/index/get_article_list.json new file mode 100644 index 000000000..b82a51e26 --- /dev/null +++ b/jun_pc_web/home/index/get_article_list.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":29,"title":"444","create_time":"2023-12-28 15:19","read":20,"cate_title":"44"},{"id":28,"title":"qwrweqr","create_time":"2023-12-20 09:13","read":49,"cate_title":"啦啦啦"},{"id":27,"title":"123","create_time":"2023-12-13 10:39","read":21,"cate_title":"行业应用"},{"id":26,"title":"aaaaaaaaa","create_time":"2023-12-08 19:45","read":37,"cate_title":"测试分类"},{"id":24,"title":"测试知识文档","create_time":"2023-11-22 16:37","read":145,"cate_title":"测试分类"},{"id":23,"title":"感受到防守打法撒的发生","create_time":"2023-11-06 21:26","read":112,"cate_title":"工具"},{"id":18,"title":"三字经","create_time":"2023-08-14 17:58","read":141,"cate_title":"规章制度"},{"id":16,"title":"医疗行业前景","create_time":"2023-08-04 15:04","read":191,"cate_title":"医疗"}]} \ No newline at end of file diff --git a/jun_pc_web/home/index/get_department_tree.json b/jun_pc_web/home/index/get_department_tree.json new file mode 100644 index 000000000..faf52935b --- /dev/null +++ b/jun_pc_web/home/index/get_department_tree.json @@ -0,0 +1,308 @@ +{ + "trees": [ + { + "id": 1, + "title": "董事会", + "pid": 0, + "leader_id": 0, + "phone": "13688888888", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": true, + "parentId": 0, + "name": "董事会", + "children": [ + { + "id": 2, + "title": "人事部", + "pid": 1, + "leader_id": 0, + "phone": "13688888889", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": true, + "parentId": 1, + "name": "人事部", + "children": [] + }, + { + "id": 3, + "title": "财务部", + "pid": 1, + "leader_id": 0, + "phone": "13688888898", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "财务部", + "children": [] + }, + { + "id": 4, + "title": "市场部", + "pid": 1, + "leader_id": 0, + "phone": "13688888978", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "市场部", + "children": [] + }, + { + "id": 5, + "title": "销售部", + "pid": 1, + "leader_id": 0, + "phone": "13688889868", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "销售部", + "children": [ + { + "id": 8, + "title": "销售一部", + "pid": 5, + "leader_id": 0, + "phone": "13688998838", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 5, + "name": "销售一部", + "children": [] + }, + { + "id": 9, + "title": "销售二部", + "pid": 5, + "leader_id": 0, + "phone": "13688999828", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 5, + "name": "销售二部", + "children": [] + }, + { + "id": 10, + "title": "销售三部", + "pid": 5, + "leader_id": 0, + "phone": "13688999918", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 5, + "name": "销售三部", + "children": [] + } + ] + }, + { + "id": 6, + "title": "技术部", + "pid": 1, + "leader_id": 0, + "phone": "13688898858", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "技术部", + "children": [ + { + "id": 11, + "title": "产品部", + "pid": 6, + "leader_id": 0, + "phone": "13688888886", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 6, + "name": "产品部", + "children": [] + }, + { + "id": 12, + "title": "设计部", + "pid": 6, + "leader_id": 0, + "phone": "13688888876", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 6, + "name": "设计部", + "children": [] + }, + { + "id": 13, + "title": "研发部", + "pid": 6, + "leader_id": 0, + "phone": "13688888666", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 6, + "name": "研发部", + "children": [] + } + ] + }, + { + "id": 7, + "title": "客服部", + "pid": 1, + "leader_id": 0, + "phone": "13688988848", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "客服部", + "children": [ + { + "id": 14, + "title": "客服一部", + "pid": 7, + "leader_id": 0, + "phone": "13688888865", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 7, + "name": "客服一部", + "children": [] + }, + { + "id": 15, + "title": "客服二部", + "pid": 7, + "leader_id": 0, + "phone": "13688888855", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 0, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 7, + "name": "客服二部", + "children": [] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/index/get_note_list.json b/jun_pc_web/home/index/get_note_list.json new file mode 100644 index 000000000..488056b04 --- /dev/null +++ b/jun_pc_web/home/index/get_note_list.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":85,"title":"asdasdas","create_time":"2024-01-01 14:25","cate_title":"普通公告"},{"id":87,"title":"上线通知","create_time":"2024-01-04 13:57","cate_title":"普通公告"},{"id":86,"title":"353252","create_time":"2024-01-03 15:35","cate_title":"普通公告"},{"id":75,"title":"工资发放通知","create_time":"2023-12-11 14:59","cate_title":"紧急公告"},{"id":84,"title":"元旦放假通知","create_time":"2023-12-21 14:56","cate_title":"普通公告"},{"id":78,"title":"调整上班时间通知","create_time":"2023-12-12 13:39","cate_title":"紧急公告"},{"id":76,"title":"人事调整通知","create_time":"2023-12-12 08:04","cate_title":"普通公告"},{"id":73,"title":"提交绩效报告通知","create_time":"2023-12-09 10:24","cate_title":"紧急公告"}]} \ No newline at end of file diff --git a/jun_pc_web/home/index/get_project_list.json b/jun_pc_web/home/index/get_project_list.json new file mode 100644 index 000000000..566c33e77 --- /dev/null +++ b/jun_pc_web/home/index/get_project_list.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":1097,"name":"维护机器费用","status":2,"create_time":"2024-01-04 14:18","start_time":1704297600,"end_time":1706976000,"director_name":"玉辞心","plan_time":"2024-01-04 至 2024-02-04","status_name":"进行中"},{"id":1096,"name":"XXX档案数字化","status":2,"create_time":"2024-01-03 23:01","start_time":1704470400,"end_time":1707148800,"director_name":"素还真","plan_time":"2024-01-06 至 2024-02-06","status_name":"进行中"},{"id":1095,"name":"档案采集","status":2,"create_time":"2024-01-03 22:30","start_time":1705248000,"end_time":1708099200,"director_name":"素还真","plan_time":"2024-01-15 至 2024-02-17","status_name":"进行中"},{"id":1094,"name":"房地产XX小区建设项目","status":2,"create_time":"2024-01-03 14:51","start_time":1704038400,"end_time":1732896000,"director_name":"玉辞心","plan_time":"2024-01-01 至 2024-11-30","status_name":"进行中"},{"id":1093,"name":"石家庄1566项目","status":2,"create_time":"2023-12-26 17:52","start_time":1703520000,"end_time":1780156800,"director_name":"少阳君","plan_time":"2023-12-26 至 2026-05-31","status_name":"进行中"},{"id":1092,"name":"20231222项目测试","status":2,"create_time":"2023-12-22 14:10","start_time":1669824000,"end_time":1721232000,"director_name":"非凡公子","plan_time":"2022-12-01 至 2024-07-18","status_name":"进行中"},{"id":1091,"name":"访问URL[ http:\/\/ ]","status":3,"create_time":"2023-12-21 10:53","start_time":1702396800,"end_time":1705766400,"director_name":"收万劫","plan_time":"2023-12-13 至 2024-01-21","status_name":"已完成"},{"id":1090,"name":"西方明珠建设","status":2,"create_time":"2023-12-19 17:21","start_time":1704038400,"end_time":1735574400,"director_name":"刘德华","plan_time":"2024-01-01 至 2024-12-31","status_name":"进行中"}]} \ No newline at end of file diff --git a/jun_pc_web/home/index/get_task_list.json b/jun_pc_web/home/index/get_task_list.json new file mode 100644 index 000000000..515be0c25 --- /dev/null +++ b/jun_pc_web/home/index/get_task_list.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":1122,"title":"1.4测试2","pid":0,"project_id":1096,"admin_id":4,"plan_hours":"3.0","end_time":"2024-01-04","over_time":0,"director_uid":33,"assist_admin_ids":"57","cate":7,"type":1,"priority":2,"before_task":0,"flow_status":1,"done_ratio":0,"create_time":1704346041,"update_time":1704419049,"delete_time":0,"director_name":"慕少艾","flow_name":"未开始"},{"id":1121,"title":"1.4测试","pid":0,"project_id":1096,"admin_id":2,"plan_hours":"8.0","end_time":"2024-01-01","over_time":0,"director_uid":4,"assist_admin_ids":"88","cate":4,"type":1,"priority":4,"before_task":1119,"flow_status":1,"done_ratio":0,"create_time":1704345649,"update_time":1704345973,"delete_time":0,"director_name":"风采铃","flow_name":"未开始"},{"id":1119,"title":"得我","pid":0,"project_id":1095,"admin_id":2,"plan_hours":"20.0","end_time":"2024-01-03","over_time":0,"director_uid":0,"assist_admin_ids":"","cate":8,"type":1,"priority":2,"before_task":0,"flow_status":1,"done_ratio":0,"create_time":1704292244,"update_time":0,"delete_time":0,"director_name":null,"flow_name":"未开始"},{"id":1118,"title":"测试","pid":0,"project_id":1094,"admin_id":2,"plan_hours":"20.0","end_time":"2024-01-04","over_time":0,"director_uid":2,"assist_admin_ids":"2","cate":8,"type":1,"priority":2,"before_task":0,"flow_status":1,"done_ratio":0,"create_time":1704291795,"update_time":0,"delete_time":0,"director_name":"素还真","flow_name":"未开始"},{"id":1117,"title":"小数点刚发躲过风","pid":0,"project_id":1092,"admin_id":2,"plan_hours":"12.0","end_time":"2024-01-03","over_time":0,"director_uid":23,"assist_admin_ids":"5","cate":8,"type":1,"priority":2,"before_task":1113,"flow_status":1,"done_ratio":0,"create_time":1704261939,"update_time":0,"delete_time":0,"director_name":"佛剑分说","flow_name":"未开始"},{"id":1116,"title":"测试","pid":0,"project_id":1073,"admin_id":7,"plan_hours":"11.0","end_time":"2023-12-29","over_time":0,"director_uid":95,"assist_admin_ids":"63,64","cate":5,"type":1,"priority":1,"before_task":1067,"flow_status":1,"done_ratio":0,"create_time":1703643482,"update_time":1703643521,"delete_time":0,"director_name":"张三","flow_name":"未开始"},{"id":1113,"title":"需求1沟通","pid":0,"project_id":1092,"admin_id":2,"plan_hours":"111.0","end_time":"2023-12-25","over_time":0,"director_uid":55,"assist_admin_ids":"60,2","cate":5,"type":1,"priority":3,"before_task":0,"flow_status":1,"done_ratio":0,"create_time":1703225557,"update_time":1703562614,"delete_time":0,"director_name":"非凡公子","flow_name":"未开始"},{"id":1106,"title":"111111","pid":1114,"project_id":1085,"admin_id":2,"plan_hours":"12.0","end_time":"2023-12-13","over_time":0,"director_uid":0,"assist_admin_ids":"","cate":8,"type":1,"priority":1,"before_task":1107,"flow_status":1,"done_ratio":0,"create_time":1702017920,"update_time":1702086767,"delete_time":0,"director_name":null,"flow_name":"未开始"}]} \ No newline at end of file diff --git a/jun_pc_web/home/index/get_view_data.json b/jun_pc_web/home/index/get_view_data.json new file mode 100644 index 000000000..9d59dc28c --- /dev/null +++ b/jun_pc_web/home/index/get_view_data.json @@ -0,0 +1 @@ +{"code":0,"msg":"","action":"","url":"","data":{"data_first":[0,0,0,0,0,0,0,0,4,26,17,15,0,10,16,15,27,5,0,0,0,0,0,0],"data_second":[0,0,0,0,1,0,0,0,6,17,14,23,4,27,29,14,27,15,10,23,20,6,4,3],"data_three":{"2023-01-05":236,"2023-01-06":235,"2023-01-07":121,"2023-01-08":56,"2023-01-09":172,"2023-01-10":190,"2023-01-11":165,"2023-01-12":156,"2023-01-13":347,"2023-01-14":116,"2023-01-15":53,"2023-01-16":99,"2023-01-17":113,"2023-01-18":82,"2023-01-19":53,"2023-01-20":22,"2023-01-21":7,"2023-01-22":15,"2023-01-23":21,"2023-01-24":28,"2023-01-25":22,"2023-01-26":20,"2023-01-27":39,"2023-01-28":117,"2023-01-29":196,"2023-01-30":216,"2023-01-31":236,"2023-02-01":267,"2023-02-02":199,"2023-02-03":255,"2023-02-04":81,"2023-02-05":66,"2023-02-06":298,"2023-02-07":267,"2023-02-08":382,"2023-02-09":601,"2023-02-10":476,"2023-02-11":164,"2023-02-12":90,"2023-02-13":353,"2023-02-14":221,"2023-02-15":307,"2023-02-16":360,"2023-02-17":231,"2023-02-18":115,"2023-02-19":91,"2023-02-20":238,"2023-02-21":264,"2023-02-22":326,"2023-02-23":382,"2023-02-24":197,"2023-02-25":134,"2023-02-26":61,"2023-02-27":319,"2023-02-28":240,"2023-03-01":415,"2023-03-02":281,"2023-03-03":222,"2023-03-04":104,"2023-03-05":97,"2023-03-06":428,"2023-03-07":228,"2023-03-08":429,"2023-03-09":226,"2023-03-10":263,"2023-03-11":130,"2023-03-12":142,"2023-03-13":278,"2023-03-14":215,"2023-03-15":269,"2023-03-16":601,"2023-03-17":189,"2023-03-18":378,"2023-03-19":49,"2023-03-20":224,"2023-03-21":254,"2023-03-22":194,"2023-03-23":224,"2023-03-24":161,"2023-03-25":130,"2023-03-26":75,"2023-03-27":211,"2023-03-28":343,"2023-03-29":394,"2023-03-30":360,"2023-03-31":227,"2023-04-01":114,"2023-04-02":100,"2023-04-03":253,"2023-04-04":228,"2023-04-05":69,"2023-04-06":349,"2023-04-07":354,"2023-04-08":155,"2023-04-09":208,"2023-04-10":398,"2023-04-11":396,"2023-04-12":316,"2023-04-13":480,"2023-04-14":338,"2023-04-15":122,"2023-04-16":103,"2023-04-17":286,"2023-04-18":388,"2023-04-19":226,"2023-04-20":365,"2023-04-21":184,"2023-04-22":127,"2023-04-23":196,"2023-04-24":190,"2023-04-25":184,"2023-04-26":201,"2023-04-27":229,"2023-04-28":145,"2023-04-29":51,"2023-04-30":111,"2023-05-01":55,"2023-05-02":218,"2023-05-03":220,"2023-05-04":266,"2023-05-05":373,"2023-05-06":287,"2023-05-07":96,"2023-05-08":255,"2023-05-09":245,"2023-05-10":193,"2023-05-11":164,"2023-05-12":128,"2023-05-13":152,"2023-05-14":75,"2023-05-15":317,"2023-05-16":545,"2023-05-17":416,"2023-05-18":277,"2023-05-19":212,"2023-05-20":1041,"2023-05-21":114,"2023-05-22":189,"2023-05-23":345,"2023-05-24":276,"2023-05-25":189,"2023-05-26":176,"2023-05-27":91,"2023-05-28":43,"2023-05-29":182,"2023-05-30":307,"2023-05-31":529,"2023-06-01":547,"2023-06-02":203,"2023-06-03":96,"2023-06-04":55,"2023-06-05":225,"2023-06-06":452,"2023-06-07":249,"2023-06-08":381,"2023-06-09":350,"2023-06-10":112,"2023-06-11":90,"2023-06-12":233,"2023-06-13":240,"2023-06-14":181,"2023-06-15":180,"2023-06-16":259,"2023-06-17":80,"2023-06-18":84,"2023-06-19":182,"2023-06-20":196,"2023-06-21":129,"2023-06-22":30,"2023-06-23":38,"2023-06-24":61,"2023-06-25":192,"2023-06-26":251,"2023-06-27":222,"2023-06-28":288,"2023-06-29":359,"2023-06-30":182,"2023-07-01":59,"2023-07-02":47,"2023-07-03":176,"2023-07-04":271,"2023-07-05":204,"2023-07-06":179,"2023-07-07":150,"2023-07-08":79,"2023-07-09":42,"2023-07-10":237,"2023-07-11":261,"2023-07-12":245,"2023-07-13":275,"2023-07-14":286,"2023-07-15":125,"2023-07-16":41,"2023-07-17":210,"2023-07-18":158,"2023-07-19":228,"2023-07-20":272,"2023-07-21":176,"2023-07-22":96,"2023-07-23":54,"2023-07-24":256,"2023-07-25":182,"2023-07-26":246,"2023-07-27":187,"2023-07-28":165,"2023-07-29":91,"2023-07-30":35,"2023-07-31":534,"2023-08-01":201,"2023-08-02":187,"2023-08-03":155,"2023-08-04":204,"2023-08-05":62,"2023-08-06":33,"2023-08-07":197,"2023-08-08":232,"2023-08-09":394,"2023-08-10":192,"2023-08-11":228,"2023-08-12":110,"2023-08-13":60,"2023-08-14":239,"2023-08-15":187,"2023-08-16":225,"2023-08-17":228,"2023-08-18":188,"2023-08-19":80,"2023-08-20":58,"2023-08-21":220,"2023-08-22":189,"2023-08-23":161,"2023-08-24":197,"2023-08-25":180,"2023-08-26":82,"2023-08-27":80,"2023-08-28":191,"2023-08-29":261,"2023-08-30":237,"2023-08-31":188,"2023-09-01":155,"2023-09-02":68,"2023-09-03":79,"2023-09-04":191,"2023-09-05":150,"2023-09-06":153,"2023-09-07":152,"2023-09-08":214,"2023-09-09":134,"2023-09-10":103,"2023-09-11":238,"2023-09-12":262,"2023-09-13":180,"2023-09-14":316,"2023-09-15":193,"2023-09-16":78,"2023-09-17":75,"2023-09-18":175,"2023-09-19":232,"2023-09-20":192,"2023-09-21":181,"2023-09-22":164,"2023-09-23":102,"2023-09-24":62,"2023-09-25":138,"2023-09-26":172,"2023-09-27":185,"2023-09-28":101,"2023-09-29":28,"2023-09-30":20,"2023-10-01":14,"2023-10-02":25,"2023-10-03":27,"2023-10-04":37,"2023-10-05":136,"2023-10-06":32,"2023-10-07":145,"2023-10-08":172,"2023-10-09":152,"2023-10-10":255,"2023-10-11":403,"2023-10-12":163,"2023-10-13":179,"2023-10-14":71,"2023-10-15":64,"2023-10-16":168,"2023-10-17":171,"2023-10-18":270,"2023-10-19":197,"2023-10-20":96,"2023-10-21":100,"2023-10-22":56,"2023-10-23":147,"2023-10-24":127,"2023-10-25":137,"2023-10-26":201,"2023-10-27":172,"2023-10-28":64,"2023-10-29":52,"2023-10-30":136,"2023-10-31":173,"2023-11-01":187,"2023-11-02":264,"2023-11-03":264,"2023-11-04":108,"2023-11-05":65,"2023-11-06":229,"2023-11-07":236,"2023-11-08":184,"2023-11-09":219,"2023-11-10":175,"2023-11-11":116,"2023-11-12":50,"2023-11-13":207,"2023-11-14":252,"2023-11-15":284,"2023-11-16":261,"2023-11-17":181,"2023-11-18":67,"2023-11-19":58,"2023-11-20":200,"2023-11-21":1457,"2023-11-22":205,"2023-11-23":195,"2023-11-24":167,"2023-11-25":78,"2023-11-26":71,"2023-11-27":250,"2023-11-28":157,"2023-11-29":329,"2023-11-30":235,"2023-12-01":215,"2023-12-02":63,"2023-12-03":49,"2023-12-04":232,"2023-12-05":186,"2023-12-06":293,"2023-12-07":306,"2023-12-08":150,"2023-12-09":68,"2023-12-10":85,"2023-12-11":129,"2023-12-12":162,"2023-12-13":170,"2023-12-14":197,"2023-12-15":145,"2023-12-16":78,"2023-12-17":45,"2023-12-18":183,"2023-12-19":173,"2023-12-20":218,"2023-12-21":199,"2023-12-22":172,"2023-12-23":84,"2023-12-24":47,"2023-12-25":200,"2023-12-26":284,"2023-12-27":145,"2023-12-28":171,"2023-12-29":123,"2023-12-30":57,"2023-12-31":34,"2024-01-01":47,"2024-01-02":145,"2024-01-03":582,"2024-01-04":243,"2024-01-05":135}}} \ No newline at end of file diff --git a/jun_pc_web/home/index/get_view_log.json b/jun_pc_web/home/index/get_view_log.json new file mode 100644 index 000000000..a62c5b3ec --- /dev/null +++ b/jun_pc_web/home/index/get_view_log.json @@ -0,0 +1 @@ +{"code":0,"msg":"","action":"","url":"","data":{"data_logs":[{"count":3474,"name":"素还真"},{"count":447,"name":"叶小钗"},{"count":425,"name":"一页书"},{"count":424,"name":"风采铃"},{"count":98,"name":"玉辞心"},{"count":33,"name":"秦假仙"},{"count":3,"name":"成员塔"},{"count":1,"name":"刘德华"},{"count":1,"name":"张三"},{"count":1,"name":"欧阳翎"}]}} \ No newline at end of file diff --git a/jun_pc_web/home/index/log_list.html b/jun_pc_web/home/index/log_list.html new file mode 100644 index 000000000..8806d0bb8 --- /dev/null +++ b/jun_pc_web/home/index/log_list.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
          +
          +

          员工动态

          + +
          +
          + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/index/log_list.json b/jun_pc_web/home/index/log_list.json new file mode 100644 index 000000000..e40b011a7 --- /dev/null +++ b/jun_pc_web/home/index/log_list.json @@ -0,0 +1,227 @@ +{ + "code": 0, + "msg": "", + "count": 112877, + "data": [ + { + "id": 114177, + "uid": 7, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704444878, + "name": "叶小钗", + "content": "叶小钗登录了系统", + "times": "1分钟前" + }, + { + "id": 114176, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704444810, + "name": "素还真", + "content": "素还真登录了系统", + "times": "2分钟前" + }, + { + "id": 114175, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704444792, + "name": "素还真", + "content": "素还真登录了系统", + "times": "3分钟前" + }, + { + "id": 114174, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704444569, + "name": "素还真", + "content": "素还真登录了系统", + "times": "6分钟前" + }, + { + "id": 114173, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704444205, + "name": "素还真", + "content": "素还真登录了系统", + "times": "12分钟前" + }, + { + "id": 114172, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704444122, + "name": "素还真", + "content": "素还真登录了系统", + "times": "14分钟前" + }, + { + "id": 114171, + "uid": 7, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443992, + "name": "叶小钗", + "content": "叶小钗登录了系统", + "times": "16分钟前" + }, + { + "id": 114170, + "uid": 3, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443620, + "name": "一页书", + "content": "一页书登录了系统", + "times": "22分钟前" + }, + { + "id": 114169, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443551, + "name": "素还真", + "content": "素还真登录了系统", + "times": "23分钟前" + }, + { + "id": 114168, + "uid": 3, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443409, + "name": "一页书", + "content": "一页书登录了系统", + "times": "26分钟前" + }, + { + "id": 114167, + "uid": 4, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443360, + "name": "风采铃", + "content": "风采铃登录了系统", + "times": "26分钟前" + }, + { + "id": 114166, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443306, + "name": "素还真", + "content": "素还真登录了系统", + "times": "27分钟前" + }, + { + "id": 114165, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443277, + "name": "素还真", + "content": "素还真登录了系统", + "times": "28分钟前" + }, + { + "id": 114164, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443231, + "name": "素还真", + "content": "素还真登录了系统", + "times": "29分钟前" + }, + { + "id": 114163, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443186, + "name": "素还真", + "content": "素还真登录了系统", + "times": "29分钟前" + }, + { + "id": 114162, + "uid": 6, + "type": "view", + "subject": "员工信息", + "action": "查看", + "create_time": 1704443173, + "name": "秦假仙", + "content": "秦假仙查看了员工信息", + "times": "30分钟前" + }, + { + "id": 114161, + "uid": 2, + "type": "login", + "subject": "系统", + "action": "登录", + "create_time": 1704443116, + "name": "素还真", + "content": "素还真登录了系统", + "times": "31分钟前" + }, + { + "id": 114160, + "uid": 2, + "type": "add", + "subject": "合同类别", + "action": "新增", + "create_time": 1704442778, + "name": "素还真", + "content": "素还真新增了合同类别", + "times": "36分钟前" + }, + { + "id": 114159, + "uid": 6, + "type": "view", + "subject": "员工信息", + "action": "查看", + "create_time": 1704442212, + "name": "秦假仙", + "content": "秦假仙查看了员工信息", + "times": "46分钟前" + }, + { + "id": 114158, + "uid": 6, + "type": "view", + "subject": "员工信息", + "action": "查看", + "create_time": 1704442172, + "name": "秦假仙", + "content": "秦假仙查看了员工信息", + "times": "46分钟前" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/index/mail_list.html b/jun_pc_web/home/index/mail_list.html new file mode 100644 index 000000000..d321dfa24 --- /dev/null +++ b/jun_pc_web/home/index/mail_list.html @@ -0,0 +1,203 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
          +
          +

          企业通讯录

          +
          +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +
          + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/index/mail_list.json b/jun_pc_web/home/index/mail_list.json new file mode 100644 index 000000000..69d3f0f25 --- /dev/null +++ b/jun_pc_web/home/index/mail_list.json @@ -0,0 +1,42 @@ +{ + "code": 0, + "msg": "", + "count": 1, + "data": [ + { + "id": 1, + "username": "admin", + "pwd": "59734b9f7407e26714ea0fd764cbd96c", + "salt": "o3cimkgw8r0xzt74jnhl", + "reg_pwd": "", + "name": "超级员工", + "email": "gouguoa@gougucms.com", + "mobile": 13800138000, + "sex": 1, + "nickname": "超级员工", + "thumb": "\/static\/home\/images\/icon.png", + "theme": "blue", + "did": 1, + "position_id": 1, + "type": 1, + "age": 0, + "native_place": "", + "idcard": "", + "education": "", + "bank_account": "", + "bank_info": "", + "desc": null, + "is_hide": 0, + "entry_time": "2024-01-17", + "create_time": "2024-01-17 17:53:42", + "update_time": "2024-01-17 17:53:42", + "last_login_time": 1705485232, + "login_num": 1, + "last_login_ip": "::1", + "is_lock": 0, + "status": 1, + "department": "董事会", + "position": "超级岗位" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/index/main.html b/jun_pc_web/home/index/main.html new file mode 100644 index 000000000..61d135698 --- /dev/null +++ b/jun_pc_web/home/index/main.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + +
          +
          +
          +
          +
          +
          + + + + + + + + + + + + + +
          +
          员工
          +
          102
          +
          +
          公告
          +
          8
          +
          +
          审批
          +
          845
          +
          +
          报销
          +
          89
          +
          +
          发票
          +
          28
          +
          +
          客户
          +
          13
          +
          +
          合同
          +
          42
          +
          +
          项目
          +
          29
          +
          +
          任务
          +
          54
          +
          +
          文章
          +
          3
          +
          +
          +
          +
          + + + + + +
          +
          +
          +
          公告列表
          +
          +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          项目列表
          +
          +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          任务列表
          +
          +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          知识列表
          +
          +
          +
          +
          +
          +
          + + + + +
          +
          +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          + + + + + + + + + + +
          +
          + + +
          +
          系统信息
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。
          服务器系统LinuxPHP版本7.4.30
          上传附件限制50M执行时间限制300秒
          勾股OA4.95.12勾股OA文档
          ThinkPHP版本6.1.0TP8文档
          Layui版本2.9.0Layui文档
          合作联系微信号:hdm588,业务合作、功能定制请备注
          QQ交流群搜Q群:24641076(满),46924914(满),295256660
          或点击 gougucms交流群
          同系列开源软件勾股CMS勾股BLOG勾股DEV勾股ADMIN
          🍗🍗 给作者加鸡腿 🍗🍗
          + +
          +
          +
          + +
          +

          最活跃员工最近30天前十的活跃度

          +
          +
          +
          +
          + +
          +

          员工动态

          更多
          +
          +
            +
            +
            + +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/keywords/add.html b/jun_pc_web/home/keywords/add.html new file mode 100644 index 000000000..2f606786d --- /dev/null +++ b/jun_pc_web/home/keywords/add.html @@ -0,0 +1,97 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            知识关键字

            + + + + + + + + + + + +
            关键字名称* + + 排序 +
            状态* + + +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/keywords/add2.html b/jun_pc_web/home/keywords/add2.html new file mode 100644 index 000000000..8f1b9e044 --- /dev/null +++ b/jun_pc_web/home/keywords/add2.html @@ -0,0 +1,66 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +

            知识关键字

            + + + + + + + + + + + +
            关键字名称* + + 排序 +
            状态* + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
            +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/keywords/edit.html b/jun_pc_web/home/keywords/edit.html new file mode 100644 index 000000000..65a6cf098 --- /dev/null +++ b/jun_pc_web/home/keywords/edit.html @@ -0,0 +1,97 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            知识关键字

            + + + + + + + + + + + +
            关键字名称* + + 排序 +
            状态* + + +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/keywords/index.html b/jun_pc_web/home/keywords/index.html new file mode 100644 index 000000000..05382c856 --- /dev/null +++ b/jun_pc_web/home/keywords/index.html @@ -0,0 +1,160 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            + +
            +
            + + +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/keywords/index.json b/jun_pc_web/home/keywords/index.json new file mode 100644 index 000000000..0313efbbd --- /dev/null +++ b/jun_pc_web/home/keywords/index.json @@ -0,0 +1,111 @@ +{ + "code": 0, + "msg": "", + "count": 13, + "data": [ + { + "id": 13, + "title": "新闻", + "sort": 0, + "status": 1, + "create_time": 1700642264, + "update_time": 0 + }, + { + "id": 12, + "title": "撒搭嘎但是", + "sort": 0, + "status": 1, + "create_time": 1699277184, + "update_time": 0 + }, + { + "id": 11, + "title": "软件需求", + "sort": 0, + "status": 1, + "create_time": 1696474471, + "update_time": 0 + }, + { + "id": 10, + "title": "生活技巧", + "sort": 0, + "status": 1, + "create_time": 1695095720, + "update_time": 0 + }, + { + "id": 9, + "title": "得得得", + "sort": 0, + "status": 1, + "create_time": 1693389872, + "update_time": 0 + }, + { + "id": 8, + "title": "医学", + "sort": 0, + "status": 1, + "create_time": 1691132647, + "update_time": 0 + }, + { + "id": 7, + "title": "天气", + "sort": 0, + "status": 1, + "create_time": 1691132467, + "update_time": 0 + }, + { + "id": 6, + "title": "java", + "sort": 0, + "status": 1, + "create_time": 1688113384, + "update_time": 0 + }, + { + "id": 5, + "title": "vu", + "sort": 0, + "status": 1, + "create_time": 1688113227, + "update_time": 0 + }, + { + "id": 1, + "title": "勾股OA", + "sort": 1, + "status": 1, + "create_time": 1638006730, + "update_time": 0 + }, + { + "id": 2, + "title": "勾股CMS", + "sort": 1, + "status": 1, + "create_time": 1638006730, + "update_time": 0 + }, + { + "id": 3, + "title": "勾股BLOG", + "sort": 1, + "status": 1, + "create_time": 1638006730, + "update_time": 0 + }, + { + "id": 4, + "title": "勾股DEV", + "sort": 1, + "status": 1, + "create_time": 1638006730, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/keywords/index2.html b/jun_pc_web/home/keywords/index2.html new file mode 100644 index 000000000..7a51f55dd --- /dev/null +++ b/jun_pc_web/home/keywords/index2.html @@ -0,0 +1,122 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            +
            + +
            +
            + + +
            +
            +
            +
            + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/log/index.html b/jun_pc_web/home/log/index.html new file mode 100644 index 000000000..549271991 --- /dev/null +++ b/jun_pc_web/home/log/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/log/index.json b/jun_pc_web/home/log/index.json new file mode 100644 index 000000000..73c5b52a6 --- /dev/null +++ b/jun_pc_web/home/log/index.json @@ -0,0 +1,183 @@ +{ + "code": 0, + "msg": "", + "count": 11, + "data": [ + { + "id": 11, + "uid": 1, + "type": "check", + "action": "审核通过", + "subject": "项目阶段", + "module": "project", + "controller": "api", + "function": "step_check", + "ip": "::1", + "param_id": 1000, + "param": "id:1000 & check:1 & step_sort:1 & status:2", + "create_time": "2024-01-18 14:47:35", + "name": "超级员工", + "content": "超级员工审核通过了项目阶段" + }, + { + "id": 10, + "uid": 1, + "type": "edit", + "action": "编辑", + "subject": "项目", + "module": "project", + "controller": "index", + "function": "edit", + "ip": "::1", + "param_id": 1000, + "param": "id:1000 & update_time:1705560442", + "create_time": "2024-01-18 14:47:22", + "name": "超级员工", + "content": "超级员工编辑了项目" + }, + { + "id": 9, + "uid": 1, + "type": "edit", + "action": "编辑", + "subject": "员工", + "module": "user", + "controller": "user", + "function": "add", + "ip": "::1", + "param_id": 2, + "param": "name:张三 & mobile:13111111111 & email:a@qq.com & thumb:\/storage\/avatars\/avatar_256_mpzyabko2d1705560163.png & file: & did:1 & position_id:1 & entry_time:1705507200 & type:1 & sex:1 & is_hide:0 & desc:新增TTT & id:2 & nickname:张三 & username:zhangsan", + "create_time": "2024-01-18 14:47:01", + "name": "超级员工", + "content": "超级员工编辑了员工" + }, + { + "id": 8, + "uid": 1, + "type": "add", + "action": "新增", + "subject": "项目", + "module": "project", + "controller": "index", + "function": "add", + "ip": "::1", + "param_id": 1000, + "param": "name:新增TTT & start_time:1705507200 & end_time:1709136000 & director_name:新增 & director_uid:2 & team_admin_names:新增 & team_admin_ids:2 & contract_name: & contract_id:0 & customer_id:0 & content:新增TTT & flowName:立项阶段,实施阶段,验收阶段,交付阶段 & chargeNames:超级员工,新增,新增,新增 & chargeIds:1,2,2,2 & membeNames:新增,新增,新增,新增 & membeIds:2,2,2,2 & cycleDate:2024-01-18 到 2024-01-19,2024-01-20 到 2024-01-21,2024-02-20 到 2024-02-21,2024-02-22 到 2024-02-23 & id:0 & status:2 & step_sort:0 & create_time:1705560387 & admin_id:1", + "create_time": "2024-01-18 14:46:27", + "name": "超级员工", + "content": "超级员工新增了项目" + }, + { + "id": 7, + "uid": 1, + "type": "add", + "action": "新增", + "subject": "员工", + "module": "user", + "controller": "user", + "function": "add", + "ip": "::1", + "param_id": 2, + "param": "name:新增 & sex:1 & reg_pwd:hrcqi6 & mobile:13111111111 & email:a@qq.com & thumb: & file: & did:1 & position_id:1 & type:1 & entry_time:1705507200 & status:1 & is_hide:0 & desc:新增TTT & id:0 & nickname:新增 & username:xinzeng & salt:r4o7u5i3y6v8xb1nemal & pwd:5eedec9b40543c6a04a5b2e948e51156", + "create_time": "2024-01-18 14:42:43", + "name": "超级员工", + "content": "超级员工新增了员工" + }, + { + "id": 6, + "uid": 1, + "type": "login", + "action": "登录", + "subject": "系统", + "module": "", + "controller": "", + "function": "", + "ip": "::1", + "param_id": 1, + "param": "", + "create_time": "2024-01-18 14:34:20", + "name": "超级员工", + "content": "超级员工登录了系统" + }, + { + "id": 5, + "uid": 1, + "type": "add", + "action": "新增", + "subject": "工作记录", + "module": "oa", + "controller": "schedule", + "function": "add", + "ip": "::1", + "param_id": 1, + "param": "id:0 & tid:0 & cid:1 & title:111 & labor_type:1 & start_time_a:2024-01-16 & start_time_b:09:00 & end_time_a:2024-01-16 & end_time_b:09:30 & remark:11 & start_time:1705366800 & end_time:1705368600 & labor_time:0.5 & admin_id:1 & did:1 & create_time:1705548329", + "create_time": "2024-01-18 11:25:29", + "name": "超级员工", + "content": "超级员工新增了工作记录" + }, + { + "id": 4, + "uid": 1, + "type": "add", + "action": "新增", + "subject": "日程安排", + "module": "oa", + "controller": "plan", + "function": "add", + "ip": "::1", + "param_id": 1, + "param": "id:0 & title:11 & start_time_a:2024-01-18 & end_time_a:2024-01-25 & start_time_b:09:00 & end_time_b:00:00 & remark:111 & type:2 & remind_type:0 & start_time:1705539600 & end_time:1706112000 & admin_id:1 & did:1 & create_time:1705547709", + "create_time": "2024-01-18 11:15:09", + "name": "超级员工", + "content": "超级员工新增了日程安排" + }, + { + "id": 3, + "uid": 1, + "type": "login", + "action": "登录", + "subject": "系统", + "module": "", + "controller": "", + "function": "", + "ip": "::1", + "param_id": 1, + "param": "", + "create_time": "2024-01-18 11:14:52", + "name": "超级员工", + "content": "超级员工登录了系统" + }, + { + "id": 2, + "uid": 1, + "type": "login", + "action": "登录", + "subject": "系统", + "module": "", + "controller": "", + "function": "", + "ip": "::1", + "param_id": 1, + "param": "", + "create_time": "2024-01-17 18:10:39", + "name": "超级员工", + "content": "超级员工登录了系统" + }, + { + "id": 1, + "uid": 1, + "type": "login", + "action": "登录", + "subject": "系统", + "module": "", + "controller": "", + "function": "", + "ip": "::1", + "param_id": 1, + "param": "", + "create_time": "2024-01-17 17:53:52", + "name": "超级员工", + "content": "超级员工登录了系统" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/menu/add.html b/jun_pc_web/home/menu/add.html new file mode 100644 index 000000000..69478f3c4 --- /dev/null +++ b/jun_pc_web/home/menu/add.html @@ -0,0 +1,367 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            功能菜单/节点

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            父级菜单/节点* + + + 所属功能模块* + +
            菜单/节点名称* + + + 操作日志名称* + + +
            菜单/节点URL + + 菜单排序 + +
            左侧菜单显示* + + + 菜单图标 + + 如:icon-jichupeizhi[查看图标] +
            注意:作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/menu/add2.html b/jun_pc_web/home/menu/add2.html new file mode 100644 index 000000000..9b1c1528c --- /dev/null +++ b/jun_pc_web/home/menu/add2.html @@ -0,0 +1,188 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +

            功能菜单/节点

            + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            父级菜单/节点* + + + 所属功能模块* + +
            菜单/节点名称* + + + 操作日志名称* + + +
            菜单/节点URL + + 菜单排序 + +
            左侧菜单显示* + + + 菜单图标 + + 如:icon-jichupeizhi[查看图标] +
            注意:作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            父级菜单/节点* + + + 所属功能模块* + +
            菜单/节点名称* + + + 操作日志名称* + + +
            菜单/节点URL + + 菜单排序 + +
            左侧菜单显示* + + + 菜单图标 + + [查看图标] +
            注意:作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。
            + {/if} +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/menu/edit.html b/jun_pc_web/home/menu/edit.html new file mode 100644 index 000000000..745dc947e --- /dev/null +++ b/jun_pc_web/home/menu/edit.html @@ -0,0 +1,367 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            功能菜单/节点

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            父级菜单/节点* + + + 所属功能模块* + +
            菜单/节点名称* + + + 操作日志名称* + + +
            菜单/节点URL + + 菜单排序 + +
            左侧菜单显示* + + + 菜单图标 + + [查看图标] +
            注意:作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/menu/index.html b/jun_pc_web/home/menu/index.html new file mode 100644 index 000000000..757cf38d3 --- /dev/null +++ b/jun_pc_web/home/menu/index.html @@ -0,0 +1,139 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            + +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/menu/index.json b/jun_pc_web/home/menu/index.json new file mode 100644 index 000000000..d75dd8ea3 --- /dev/null +++ b/jun_pc_web/home/menu/index.json @@ -0,0 +1,3302 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "pid": 0, + "src": "", + "title": "系统管理", + "name": "系统管理", + "module": "home", + "icon": "icon-jichupeizhi", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 9, + "pid": 1, + "src": "home\/conf\/index", + "title": "系统配置", + "name": "系统配置", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 10, + "pid": 9, + "src": "home\/conf\/add", + "title": "新建\/编辑", + "name": "配置项", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 11, + "pid": 9, + "src": "home\/conf\/delete", + "title": "删除", + "name": "配置项", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 12, + "pid": 9, + "src": "home\/conf\/edit", + "title": "编辑", + "name": "配置详情", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 13, + "pid": 1, + "src": "home\/module\/index", + "title": "功能模块", + "name": "功能模块", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 14, + "pid": 13, + "src": "home\/module\/install", + "title": "安装", + "name": "功能模块", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 15, + "pid": 13, + "src": "home\/module\/upgrade", + "title": "升级", + "name": "功能模块", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 16, + "pid": 13, + "src": "home\/module\/uninstall", + "title": "卸载", + "name": "功能模块", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 17, + "pid": 1, + "src": "home\/rule\/index", + "title": "功能节点", + "name": "功能节点", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 18, + "pid": 17, + "src": "home\/rule\/add", + "title": "新建\/编辑", + "name": "功能节点", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 19, + "pid": 17, + "src": "home\/rule\/delete", + "title": "删除", + "name": "功能节点", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 20, + "pid": 1, + "src": "home\/role\/index", + "title": "角色权限", + "name": "角色权限", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 21, + "pid": 20, + "src": "home\/role\/add", + "title": "新建\/编辑", + "name": "角色权限", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 22, + "pid": 20, + "src": "home\/role\/delete", + "title": "删除", + "name": "角色权限", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 23, + "pid": 1, + "src": "home\/dataauth\/index", + "title": "数据权限", + "name": "数据权限", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 24, + "pid": 23, + "src": "home\/dataauth\/edit", + "title": "编辑", + "name": "数据权限", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 25, + "pid": 1, + "src": "home\/log\/index", + "title": "操作日志", + "name": "操作日志", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 26, + "pid": 1, + "src": "home\/database\/database", + "title": "备份数据", + "name": "数据备份", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 27, + "pid": 26, + "src": "home\/database\/backup", + "title": "备份数据表", + "name": "数据", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 28, + "pid": 26, + "src": "home\/database\/optimize", + "title": "优化数据表", + "name": "数据表", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 29, + "pid": 26, + "src": "home\/database\/repair", + "title": "修复数据表", + "name": "数据表", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 30, + "pid": 1, + "src": "home\/database\/backuplist", + "title": "还原数据", + "name": "数据还原", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 31, + "pid": 30, + "src": "home\/database\/import", + "title": "还原数据表", + "name": "数据", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 32, + "pid": 30, + "src": "home\/database\/downfile", + "title": "下载备份数据", + "name": "备份数据", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 33, + "pid": 30, + "src": "home\/database\/del", + "title": "删除备份数据", + "name": "备份数据", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + } + ] + }, + { + "id": 2, + "pid": 0, + "src": "", + "title": "基础数据", + "name": "基础数据", + "module": "home", + "icon": "icon-hetongshezhi", + "menu": 1, + "sort": 2, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 34, + "pid": 2, + "src": "home\/cate\/flow_type", + "title": "审批类型", + "name": "审批类型", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 35, + "pid": 34, + "src": "home\/cate\/flow_type_add", + "title": "新建\/编辑", + "name": "审批类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 36, + "pid": 34, + "src": "home\/cate\/flow_type_check", + "title": "设置", + "name": "审批类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 37, + "pid": 2, + "src": "home\/flow\/index", + "title": "审批流程", + "name": "审批流程", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 38, + "pid": 37, + "src": "home\/flow\/add", + "title": "新建\/编辑", + "name": "审批流程", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 39, + "pid": 37, + "src": "home\/flow\/delete", + "title": "删除", + "name": "审批流程", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 40, + "pid": 37, + "src": "home\/flow\/check", + "title": "设置", + "name": "审批流程", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 41, + "pid": 2, + "src": "home\/cate\/expense_cate", + "title": "报销类型", + "name": "报销类型", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 42, + "pid": 41, + "src": "home\/cate\/expense_cate_add", + "title": "新建\/编辑", + "name": "报销类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 43, + "pid": 41, + "src": "home\/cate\/expense_cate_check", + "title": "设置", + "name": "报销类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 44, + "pid": 2, + "src": "home\/cate\/cost_cate", + "title": "费用类型", + "name": "费用类型", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 45, + "pid": 44, + "src": "home\/cate\/cost_cate_add", + "title": "新建\/编辑", + "name": "费用类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 46, + "pid": 44, + "src": "home\/cate\/cost_cate_check", + "title": "设置", + "name": "费用类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 47, + "pid": 2, + "src": "home\/cate\/subject", + "title": "企业主体", + "name": "企业主体", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 48, + "pid": 47, + "src": "home\/cate\/subject_add", + "title": "新建\/编辑", + "name": "企业主体", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 49, + "pid": 47, + "src": "home\/cate\/subject_check", + "title": "设置", + "name": "企业主体", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 50, + "pid": 2, + "src": "home\/cate\/industry_cate", + "title": "行业类型", + "name": "行业类型", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 51, + "pid": 50, + "src": "home\/cate\/industry_cate_add", + "title": "新建\/编辑", + "name": "行业类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 52, + "pid": 50, + "src": "home\/cate\/industry_cate_check", + "title": "设置", + "name": "行业类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 53, + "pid": 2, + "src": "home\/cate\/work_cate", + "title": "工作类别", + "name": "工作类别", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 54, + "pid": 53, + "src": "home\/cate\/work_cate_add", + "title": "新建\/编辑", + "name": "工作类别", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 55, + "pid": 53, + "src": "home\/cate\/work_cate_check", + "title": "设置", + "name": "工作类别", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 56, + "pid": 2, + "src": "home\/cate\/services_cate", + "title": "服务类型", + "name": "服务类型", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 57, + "pid": 56, + "src": "home\/cate\/services_cate_add", + "title": "新建\/编辑", + "name": "服务类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 58, + "pid": 56, + "src": "home\/cate\/services_cate_check", + "title": "设置", + "name": "服务类型", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 59, + "pid": 2, + "src": "home\/keywords\/index", + "title": "关 键 字", + "name": "关键字", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 60, + "pid": 59, + "src": "home\/keywords\/add", + "title": "新建\/编辑", + "name": "关键字", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 61, + "pid": 59, + "src": "home\/keywords\/delete", + "title": "删除", + "name": "关键字", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + }, + { + "id": 196, + "pid": 2, + "src": "home\/files\/index", + "title": "附件管理", + "name": "附件管理", + "module": "home", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [ + { + "id": 197, + "pid": 196, + "src": "home\/files\/edit", + "title": "编辑附件", + "name": "附件", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 198, + "pid": 196, + "src": "home\/files\/move", + "title": "移动附件", + "name": "附件", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 199, + "pid": 196, + "src": "home\/files\/delete", + "title": "删除附件", + "name": "附件", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 200, + "pid": 196, + "src": "home\/files\/get_group", + "title": "附件分组", + "name": "附件分组", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 201, + "pid": 196, + "src": "home\/files\/add_group", + "title": "新建\/编辑", + "name": "附件分组", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + }, + { + "id": 202, + "pid": 196, + "src": "home\/files\/del_group", + "title": "删除附件分组", + "name": "附件分组", + "module": "home", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "系统模块", + "children": [] + } + ] + } + ] + }, + { + "id": 3, + "pid": 0, + "src": "", + "title": "人力资源", + "name": "人力资源", + "module": "user", + "icon": "icon-renshishezhi", + "menu": 1, + "sort": 3, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [ + { + "id": 62, + "pid": 3, + "src": "user\/department\/index", + "title": "部门架构", + "name": "部门", + "module": "user", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [ + { + "id": 63, + "pid": 62, + "src": "user\/department\/add", + "title": "新建\/编辑", + "name": "部门", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + }, + { + "id": 64, + "pid": 62, + "src": "user\/department\/delete", + "title": "删除", + "name": "部门", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + } + ] + }, + { + "id": 65, + "pid": 3, + "src": "user\/position\/index", + "title": "岗位职称", + "name": "岗位职称", + "module": "user", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [ + { + "id": 66, + "pid": 65, + "src": "user\/position\/add", + "title": "新建\/编辑", + "name": "岗位职称", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + }, + { + "id": 67, + "pid": 65, + "src": "user\/position\/delete", + "title": "删除", + "name": "岗位职称", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + }, + { + "id": 68, + "pid": 65, + "src": "user\/position\/view", + "title": "查看", + "name": "岗位职称", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + } + ] + }, + { + "id": 69, + "pid": 3, + "src": "user\/user\/index", + "title": "企业员工", + "name": "员工", + "module": "user", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [ + { + "id": 70, + "pid": 69, + "src": "user\/user\/add", + "title": "新建\/编辑", + "name": "员工", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + }, + { + "id": 71, + "pid": 69, + "src": "user\/user\/view", + "title": "查看", + "name": "员工信息", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + }, + { + "id": 72, + "pid": 69, + "src": "user\/user\/set", + "title": "设置", + "name": "员工状态", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + }, + { + "id": 73, + "pid": 69, + "src": "user\/user\/reset_psw", + "title": "重设密码", + "name": "员工密码", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + } + ] + }, + { + "id": 74, + "pid": 3, + "src": "user\/personal\/change", + "title": "人事调动", + "name": "人事调动", + "module": "user", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [ + { + "id": 75, + "pid": 74, + "src": "user\/personal\/change_add", + "title": "新建\/编辑", + "name": "人事调动", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + } + ] + }, + { + "id": 76, + "pid": 3, + "src": "user\/personal\/leave", + "title": "离职档案", + "name": "离职档案", + "module": "user", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [ + { + "id": 77, + "pid": 76, + "src": "user\/personal\/leave_add", + "title": "新建\/编辑", + "name": "离职档案", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + }, + { + "id": 78, + "pid": 76, + "src": "user\/personal\/leave_delete", + "title": "删除", + "name": "离职档案", + "module": "user", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "人事模块", + "children": [] + } + ] + } + ] + }, + { + "id": 4, + "pid": 0, + "src": "", + "title": "行政管理", + "name": "行政管理", + "module": "adm", + "icon": "icon-banjiguanli", + "menu": 1, + "sort": 4, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [ + { + "id": 79, + "pid": 4, + "src": "adm\/seal\/seal_cate", + "title": "印章管理", + "name": "印章", + "module": "adm", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [ + { + "id": 80, + "pid": 79, + "src": "adm\/seal\/seal_cate_add", + "title": "新建\/编辑", + "name": "印章", + "module": "adm", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [] + }, + { + "id": 81, + "pid": 79, + "src": "adm\/seal\/seal_cate_check", + "title": "设置", + "name": "印章", + "module": "adm", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [] + } + ] + }, + { + "id": 82, + "pid": 4, + "src": "adm\/car\/car_cate", + "title": "车辆管理", + "name": "车辆", + "module": "adm", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [ + { + "id": 83, + "pid": 82, + "src": "adm\/car\/car_cate_add", + "title": "新建\/编辑", + "name": "车辆", + "module": "adm", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [] + }, + { + "id": 84, + "pid": 82, + "src": "adm\/car\/car_cate_check", + "title": "设置", + "name": "车辆", + "module": "adm", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [] + } + ] + }, + { + "id": 85, + "pid": 4, + "src": "adm\/meeting\/meeting_cate", + "title": "会议室管理", + "name": "会议室", + "module": "adm", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [ + { + "id": 86, + "pid": 85, + "src": "adm\/meeting\/meeting_cate_add", + "title": "新建\/编辑", + "name": "会议室", + "module": "adm", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [] + }, + { + "id": 87, + "pid": 85, + "src": "adm\/meeting\/meeting_cate_check", + "title": "设置", + "name": "会议室", + "module": "adm", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "行政模块", + "children": [] + } + ] + } + ] + }, + { + "id": 5, + "pid": 0, + "src": "", + "title": "企业公告", + "name": "企业公告", + "module": "note", + "icon": "icon-zhaoshengbaobiao", + "menu": 1, + "sort": 5, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [ + { + "id": 88, + "pid": 5, + "src": "note\/index\/note_cate", + "title": "公告类型", + "name": "公告类型", + "module": "note", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [ + { + "id": 89, + "pid": 88, + "src": "note\/index\/note_cate_add", + "title": "新建\/编辑", + "name": "公告类型", + "module": "note", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [] + }, + { + "id": 90, + "pid": 88, + "src": "note\/index\/note_cate_delete", + "title": "删除", + "name": "公告类型", + "module": "note", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [] + } + ] + }, + { + "id": 91, + "pid": 5, + "src": "note\/index\/index", + "title": "公告列表", + "name": "公告", + "module": "note", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [ + { + "id": 92, + "pid": 91, + "src": "note\/index\/add", + "title": "新建\/编辑", + "name": "公告", + "module": "note", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [] + }, + { + "id": 93, + "pid": 91, + "src": "note\/index\/delete", + "title": "删除", + "name": "公告", + "module": "note", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [] + }, + { + "id": 94, + "pid": 91, + "src": "note\/index\/view", + "title": "查看", + "name": "公告", + "module": "note", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "公告模块", + "children": [] + } + ] + } + ] + }, + { + "id": 6, + "pid": 0, + "src": "", + "title": "办公审批", + "name": "办公审批", + "module": "oa", + "icon": "icon-shenpishezhi", + "menu": 1, + "sort": 6, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [ + { + "id": 95, + "pid": 6, + "src": "oa\/approve\/index", + "title": "我发起的", + "name": "办公审批", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [ + { + "id": 96, + "pid": 95, + "src": "oa\/approve\/add", + "title": "新建\/编辑", + "name": "办公审批", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 97, + "pid": 95, + "src": "oa\/approve\/view", + "title": "查看", + "name": "办公审批", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + } + ] + }, + { + "id": 98, + "pid": 6, + "src": "oa\/approve\/list", + "title": "我处理的", + "name": "办公审批", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 99, + "pid": 6, + "src": "oa\/approve\/copy", + "title": "抄送给我的", + "name": "办公审批", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + } + ] + }, + { + "id": 7, + "pid": 0, + "src": "", + "title": "日常办公", + "name": "日常办公", + "module": "oa", + "icon": "icon-kaoshijihua", + "menu": 1, + "sort": 7, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [ + { + "id": 100, + "pid": 7, + "src": "oa\/plan\/index", + "title": "日程安排", + "name": "日程安排", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [ + { + "id": 101, + "pid": 100, + "src": "oa\/plan\/add", + "title": "新建\/编辑", + "name": "日程安排", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 102, + "pid": 100, + "src": "oa\/plan\/delete", + "title": "删除", + "name": "日程安排", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 103, + "pid": 100, + "src": "oa\/plan\/detail", + "title": "查看", + "name": "日程安排", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + } + ] + }, + { + "id": 104, + "pid": 7, + "src": "oa\/plan\/calendar", + "title": "日程日历", + "name": "日程安排", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 105, + "pid": 7, + "src": "oa\/schedule\/index", + "title": "工作记录", + "name": "工作记录", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [ + { + "id": 106, + "pid": 105, + "src": "oa\/schedule\/add", + "title": "新建\/编辑", + "name": "工作记录", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 107, + "pid": 105, + "src": "oa\/schedule\/delete", + "title": "删除", + "name": "工作记录", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 108, + "pid": 105, + "src": "oa\/schedule\/detail", + "title": "查看", + "name": "工作记录", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 109, + "pid": 105, + "src": "oa\/schedule\/update_labor_time", + "title": "更改工时", + "name": "工时", + "module": "oa", + "icon": "", + "menu": 0, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + } + ] + }, + { + "id": 110, + "pid": 7, + "src": "oa\/schedule\/calendar", + "title": "工作日历", + "name": "工作日历", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 111, + "pid": 7, + "src": "oa\/work\/index", + "title": "工作汇报", + "name": "工作汇报", + "module": "oa", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [ + { + "id": 112, + "pid": 111, + "src": "oa\/work\/add", + "title": "新建\/编辑", + "name": "工作汇报", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 113, + "pid": 111, + "src": "oa\/work\/send", + "title": "发送", + "name": "工作汇报", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 114, + "pid": 111, + "src": "oa\/work\/read", + "title": "查看", + "name": "工作汇报", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + }, + { + "id": 115, + "pid": 111, + "src": "oa\/work\/delete", + "title": "删除", + "name": "工作汇报", + "module": "oa", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "OA模块", + "children": [] + } + ] + } + ] + }, + { + "id": 8, + "pid": 0, + "src": "", + "title": "财务管理", + "name": "财务管理", + "module": "finance", + "icon": "icon-yuangongtidian", + "menu": 1, + "sort": 8, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [ + { + "id": 116, + "pid": 8, + "src": "", + "title": "报销管理", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [ + { + "id": 117, + "pid": 116, + "src": "finance\/expense\/index", + "title": "我申请的", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [ + { + "id": 118, + "pid": 117, + "src": "finance\/expense\/add", + "title": "新建\/编辑", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 119, + "pid": 117, + "src": "finance\/expense\/delete", + "title": "删除", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 120, + "pid": 117, + "src": "finance\/expense\/view", + "title": "查看", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + } + ] + }, + { + "id": 121, + "pid": 116, + "src": "finance\/expense\/list", + "title": "我处理的", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 122, + "pid": 116, + "src": "finance\/expense\/copy", + "title": "抄送给我的", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 123, + "pid": 116, + "src": "finance\/expense\/checkedlist", + "title": "打款(管理专用)", + "name": "报销", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + } + ] + }, + { + "id": 124, + "pid": 8, + "src": "", + "title": "发票管理", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [ + { + "id": 125, + "pid": 124, + "src": "finance\/invoice\/index", + "title": "我申请的", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [ + { + "id": 126, + "pid": 125, + "src": "finance\/invoice\/add", + "title": "新建\/编辑", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 127, + "pid": 125, + "src": "finance\/invoice\/delete", + "title": "删除", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 128, + "pid": 125, + "src": "finance\/invoice\/view", + "title": "查看", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + } + ] + }, + { + "id": 129, + "pid": 124, + "src": "finance\/invoice\/list", + "title": "我处理的", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 130, + "pid": 124, + "src": "finance\/invoice\/copy", + "title": "抄送给我的", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 131, + "pid": 124, + "src": "finance\/invoice\/checkedlist", + "title": "开票(管理专用)", + "name": "发票", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + } + ] + }, + { + "id": 132, + "pid": 8, + "src": "finance\/income\/index", + "title": "到账管理", + "name": "到账记录", + "module": "finance", + "icon": "", + "menu": 1, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [ + { + "id": 133, + "pid": 132, + "src": "finance\/income\/add", + "title": "新建\/编辑", + "name": "到账记录", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 134, + "pid": 132, + "src": "finance\/income\/view", + "title": "查看", + "name": "到账记录", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + }, + { + "id": 135, + "pid": 132, + "src": "finance\/income\/delete", + "title": "删除", + "name": "到账记录", + "module": "finance", + "icon": "", + "menu": 2, + "sort": 1, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "财务模块", + "children": [] + } + ] + } + ] + }, + { + "id": 136, + "pid": 0, + "src": "", + "title": "客户管理", + "name": "客户管理", + "module": "customer", + "icon": "icon-kehuguanli", + "menu": 1, + "sort": 9, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 137, + "pid": 136, + "src": "customer\/grade\/index", + "title": "客户等级", + "name": "客户等级", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 138, + "pid": 137, + "src": "customer\/grade\/grade_add", + "title": "新建\/编辑", + "name": "客户等级", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 139, + "pid": 137, + "src": "customer\/grade\/grade_check", + "title": "设置", + "name": "客户等级", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "客户模块", + "children": [] + } + ] + }, + { + "id": 140, + "pid": 136, + "src": "customer\/source\/index", + "title": "客户渠道", + "name": "客户渠道", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 141, + "pid": 140, + "src": "customer\/source\/source_add", + "title": "新建\/编辑", + "name": "客户渠道", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 142, + "pid": 140, + "src": "customer\/source\/source_check", + "title": "设置", + "name": "客户渠道", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "客户模块", + "children": [] + } + ] + }, + { + "id": 143, + "pid": 136, + "src": "customer\/index\/rush", + "title": "抢 客 宝", + "name": "抢客宝", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 144, + "pid": 136, + "src": "customer\/index\/index", + "title": "客户列表", + "name": "客户列表", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 145, + "pid": 144, + "src": "customer\/index\/add", + "title": "新建\/编辑", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 146, + "pid": 144, + "src": "customer\/index\/view", + "title": "查看", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 147, + "pid": 144, + "src": "customer\/index\/get", + "title": "获取", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 148, + "pid": 144, + "src": "customer\/index\/to_sea", + "title": "转入公海", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + } + ] + }, + { + "id": 149, + "pid": 136, + "src": "customer\/index\/sea", + "title": "公海客户", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 150, + "pid": 149, + "src": "customer\/index\/distribute", + "title": "分配客户", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 151, + "pid": 149, + "src": "customer\/index\/to_trash", + "title": "转入废弃池", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + } + ] + }, + { + "id": 152, + "pid": 136, + "src": "customer\/index\/trash", + "title": "废弃客户", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 153, + "pid": 152, + "src": "customer\/index\/delete", + "title": "删除", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 154, + "pid": 152, + "src": "customer\/index\/revert", + "title": "还原", + "name": "客户", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1556143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + } + ] + }, + { + "id": 155, + "pid": 136, + "src": "customer\/contact\/index", + "title": "客户联系人", + "name": "联系人", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 156, + "pid": 155, + "src": "customer\/contact\/contact_add", + "title": "新建\/编辑", + "name": "联系人", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 157, + "pid": 155, + "src": "customer\/contact\/contact_del", + "title": "删除", + "name": "联系人", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + } + ] + }, + { + "id": 158, + "pid": 136, + "src": "customer\/chance\/index", + "title": "销售机会", + "name": "销售机会", + "module": "customer", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [ + { + "id": 159, + "pid": 158, + "src": "customer\/chance\/chance_add", + "title": "新建\/编辑", + "name": "销售机会", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 160, + "pid": 158, + "src": "customer\/chance\/chance_view", + "title": "查看", + "name": "销售机会", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + }, + { + "id": 161, + "pid": 158, + "src": "customer\/chance\/chance_del", + "title": "删除", + "name": "销售机会", + "module": "customer", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "客户模块", + "children": [] + } + ] + } + ] + }, + { + "id": 162, + "pid": 0, + "src": "", + "title": "合同协议", + "name": "合同协议", + "module": "contract", + "icon": "icon-hetongyidong", + "menu": 1, + "sort": 10, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "合同模块", + "children": [ + { + "id": 163, + "pid": 162, + "src": "contract\/cate\/cate", + "title": "合同类别", + "name": "合同类别", + "module": "contract", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "合同模块", + "children": [ + { + "id": 164, + "pid": 163, + "src": "contract\/cate\/cate_add", + "title": "新建\/编辑", + "name": "合同类别", + "module": "contract", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "合同模块", + "children": [] + }, + { + "id": 165, + "pid": 163, + "src": "contract\/cate\/cate_check", + "title": "设置", + "name": "合同类别", + "module": "contract", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 0, + "update_time": 0, + "module_title": "合同模块", + "children": [] + } + ] + }, + { + "id": 166, + "pid": 162, + "src": "contract\/index\/index", + "title": "合同列表", + "name": "合同列表", + "module": "contract", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "合同模块", + "children": [ + { + "id": 167, + "pid": 166, + "src": "contract\/index\/add", + "title": "新建\/编辑", + "name": "合同", + "module": "contract", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "合同模块", + "children": [] + }, + { + "id": 168, + "pid": 166, + "src": "contract\/index\/view", + "title": "查看", + "name": "合同", + "module": "contract", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "合同模块", + "children": [] + }, + { + "id": 169, + "pid": 166, + "src": "contract\/index\/delete", + "title": "删除", + "name": "合同", + "module": "contract", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "合同模块", + "children": [] + } + ] + }, + { + "id": 170, + "pid": 162, + "src": "contract\/index\/archive", + "title": "合同归档", + "name": "合同归档", + "module": "contract", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "合同模块", + "children": [] + } + ] + }, + { + "id": 171, + "pid": 0, + "src": "", + "title": "项目管理", + "name": "项目管理", + "module": "project", + "icon": "icon-xiangmuguanli", + "menu": 1, + "sort": 11, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [ + { + "id": 172, + "pid": 171, + "src": "project\/index\/index", + "title": "项目列表", + "name": "项目", + "module": "project", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [ + { + "id": 173, + "pid": 172, + "src": "project\/index\/add", + "title": "新建", + "name": "项目", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 174, + "pid": 172, + "src": "project\/index\/edit", + "title": "编辑", + "name": "项目", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 175, + "pid": 172, + "src": "project\/index\/view", + "title": "查看", + "name": "项目", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 176, + "pid": 172, + "src": "project\/index\/delete", + "title": "删除", + "name": "项目", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + } + ] + }, + { + "id": 177, + "pid": 171, + "src": "project\/task\/index", + "title": "任务列表", + "name": "任务", + "module": "project", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [ + { + "id": 178, + "pid": 177, + "src": "project\/task\/add", + "title": "新建", + "name": "任务", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 179, + "pid": 177, + "src": "project\/task\/edit", + "title": "编辑", + "name": "任务", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 180, + "pid": 177, + "src": "project\/task\/view", + "title": "查看", + "name": "任务", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 181, + "pid": 177, + "src": "project\/task\/delete", + "title": "删除", + "name": "任务", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + } + ] + }, + { + "id": 182, + "pid": 171, + "src": "project\/task\/task_time", + "title": "任务工时", + "name": "工时", + "module": "project", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 183, + "pid": 171, + "src": "project\/document\/index", + "title": "文档列表", + "name": "文档", + "module": "project", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [ + { + "id": 184, + "pid": 183, + "src": "project\/document\/add", + "title": "新建\/编辑", + "name": "文档", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 185, + "pid": 183, + "src": "project\/document\/view", + "title": "查看", + "name": "文档", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + }, + { + "id": 186, + "pid": 183, + "src": "project\/document\/delete", + "title": "删除", + "name": "文档", + "module": "project", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656142368, + "update_time": 0, + "module_title": "项目模块", + "children": [] + } + ] + } + ] + }, + { + "id": 187, + "pid": 0, + "src": "", + "title": "知识文章", + "name": "知识文章", + "module": "article", + "icon": "icon-kecheng", + "menu": 1, + "sort": 12, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [ + { + "id": 188, + "pid": 187, + "src": "article\/cate\/cate", + "title": "知识类型", + "name": "知识类型", + "module": "article", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [ + { + "id": 189, + "pid": 188, + "src": "article\/cate\/cate_add", + "title": "新建\/编辑", + "name": "知识类型", + "module": "article", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [] + }, + { + "id": 190, + "pid": 188, + "src": "article\/cate\/cate_delete", + "title": "删除", + "name": "知识类型", + "module": "article", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [] + } + ] + }, + { + "id": 191, + "pid": 187, + "src": "article\/index\/index", + "title": "共享知识", + "name": "知识文章", + "module": "article", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [] + }, + { + "id": 192, + "pid": 187, + "src": "article\/index\/list", + "title": "个人知识", + "name": "知识文章", + "module": "article", + "icon": "", + "menu": 1, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [ + { + "id": 193, + "pid": 192, + "src": "article\/index\/add", + "title": "新建\/编辑", + "name": "知识文章", + "module": "article", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [] + }, + { + "id": 194, + "pid": 192, + "src": "article\/index\/view", + "title": "查看", + "name": "知识文章", + "module": "article", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [] + }, + { + "id": 195, + "pid": 192, + "src": "article\/index\/delete", + "title": "删除", + "name": "知识文章", + "module": "article", + "icon": "", + "menu": 2, + "sort": 0, + "status": 1, + "create_time": 1656143065, + "update_time": 0, + "module_title": "知识模块", + "children": [] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/menu/index2.html b/jun_pc_web/home/menu/index2.html new file mode 100644 index 000000000..6594827cf --- /dev/null +++ b/jun_pc_web/home/menu/index2.html @@ -0,0 +1,101 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            + +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/module/index.html b/jun_pc_web/home/module/index.html new file mode 100644 index 000000000..c438c02a2 --- /dev/null +++ b/jun_pc_web/home/module/index.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/module/index.json b/jun_pc_web/home/module/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/home/module/index2.html b/jun_pc_web/home/module/index2.html new file mode 100644 index 000000000..d4e538477 --- /dev/null +++ b/jun_pc_web/home/module/index2.html @@ -0,0 +1,112 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + + + + + + + + + + + {empty name="module"} + + + + {/empty} + {volist name="module" id="vo" key="k"} + + + + + + + {eq name="$vo.is_install" value="0"} + + + {/eq} + {eq name="$vo.is_install" value="1"} + + + {/eq} + + {/volist} +
            模块名称模块所在目录功能描述类型作者状态操作
            暂无数据
            {$vo.title}app/{$vo.name}{$vo.desc} + {eq name="$vo.type" value="1"}系统模块{/eq} + {eq name="$vo.type" value="2"}普通模块{/eq} + + {eq name="$vo.sourse" value="1"}勾股OA{/eq} + {eq name="$vo.sourse" value="2"}第三方{/eq} + + 未安装 + +
            + {eq name = "$vo.is_file" value="0"} + 下载 + {/eq} + {eq name = "$vo.is_file" value="1"} + 安装 + {/eq} + 演示 +
            +
            + 已安装 + +
            + 卸载 +
            +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/role/add.html b/jun_pc_web/home/role/add.html new file mode 100644 index 000000000..8c21c1ce7 --- /dev/null +++ b/jun_pc_web/home/role/add.html @@ -0,0 +1,971 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +
            +

            权限组

            + + + + + + + + + + + + + + + + + + + + + + +
            权限组名称* + + + + 状态* + + + +
            权限配置说明*注意:如果右侧子级权限有节点被勾选了,左侧的顶级权限就必须勾选,否则无法查看右侧的子级菜单。
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            选择可操作的顶级权限 选择可操作的子级权限
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +
            首页展示模块 +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            备注内容 + +
            +
            + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/role/add2.html b/jun_pc_web/home/role/add2.html new file mode 100644 index 000000000..39a26d66c --- /dev/null +++ b/jun_pc_web/home/role/add2.html @@ -0,0 +1,161 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +
            +

            权限组

            + + + + + + + + + + + + + + + + + + + + + + +
            权限组名称* + + + + 状态* + + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
            权限配置说明*注意:如果右侧子级权限有节点被勾选了,左侧的顶级权限就必须勾选,否则无法查看右侧的子级菜单。
            + + + + + + {volist name="role_rule" id="vo"} + + + {notempty name="vo.children"} + + {/notempty} + + {/volist} +
            选择可操作的顶级权限 选择可操作的子级权限
            + + +
            + {volist name="vo.children" key="k" id="voo"} +
            + +
            + {notempty name="voo.children"} +
            + {volist name="voo.children" id="vooo"} +
            + +
            + {notempty name="vooo.children"} +
            + {volist name="vooo.children" id="voooo"} +
            + +
            + {/volist} +
            + {/notempty} + {/volist} +
            + {/notempty} + {/volist} +
            +
            +
            首页展示模块 + {volist name="layout" id="vo"} +
            + +
            + {/volist} +
            备注内容 + +
            +
            + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/home/role/edit.html b/jun_pc_web/home/role/edit.html new file mode 100644 index 000000000..8ee1db80c --- /dev/null +++ b/jun_pc_web/home/role/edit.html @@ -0,0 +1,971 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +
            +

            权限组

            + + + + + + + + + + + + + + + + + + + + + + +
            权限组名称* + + + + 状态* + + + +
            权限配置说明*注意:如果右侧子级权限有节点被勾选了,左侧的顶级权限就必须勾选,否则无法查看右侧的子级菜单。
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            选择可操作的顶级权限 选择可操作的子级权限
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +
            首页展示模块 +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            备注内容 + +
            +
            + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/role/index.html b/jun_pc_web/home/role/index.html new file mode 100644 index 000000000..d1cc3542b --- /dev/null +++ b/jun_pc_web/home/role/index.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/home/role/index.json b/jun_pc_web/home/role/index.json new file mode 100644 index 000000000..76ff3b402 --- /dev/null +++ b/jun_pc_web/home/role/index.json @@ -0,0 +1,38 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "超级员工权限", + "status": 1, + "rules": "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202", + "layouts": "1,2,3,4,5,6,7,8,9,10,11,12", + "desc": "超级员工权限,拥有系统的最高权限,不可修改。", + "create_time": 0, + "update_time": 0 + }, + { + "id": 2, + "title": "总经理权限", + "status": 1, + "rules": "1,9,13,17,20,23,2,34,37,41,44,47,50,53,56,59,3,62,65,68,69,71,74,76,4,79,82,85,5,88,91,92,93,94,6,95,96,97,98,99,7,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,8,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,140,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202", + "layouts": "1,2,3,4,5,6,7,8,9,10,11,12", + "desc": "总经理的管理权限,可根据公司的具体需求调整。", + "create_time": 0, + "update_time": 0 + }, + { + "id": 3, + "title": "普通员工权限", + "status": 1, + "rules": "5,88,91,92,93,6,95,96,97,98,99,7,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,8,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,140,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202", + "layouts": "1,2,3,4,5,6,7,8,9,10,11,12", + "desc": "普通员工管理权限,可根据公司的具体需求调整。", + "create_time": 0, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/home/role/index2.html b/jun_pc_web/home/role/index2.html new file mode 100644 index 000000000..667b11678 --- /dev/null +++ b/jun_pc_web/home/role/index2.html @@ -0,0 +1,77 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            +
            + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/index.html b/jun_pc_web/index.html new file mode 100644 index 000000000..583366580 --- /dev/null +++ b/jun_pc_web/index.html @@ -0,0 +1,217 @@ + + + + + + + + 齐兴会计师事务所信息系统- 首页 + + + + + +
            + +
            + +
              +
            • + +
            • +
            • + +
            • + + +
            + +
            + + +
            +
            + +
            +
            + + +
            + + +
            + + +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/index_default.html b/jun_pc_web/index_default.html new file mode 100644 index 000000000..3f22805a6 --- /dev/null +++ b/jun_pc_web/index_default.html @@ -0,0 +1,261 @@ + + + + + + + + EasyWeb后台管理模板 + + + + + +
            + +
            + + + +
            + + + + + +
            + + +
            + + +
            +
            + +
            +
            + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/index_e.html b/jun_pc_web/index_e.html new file mode 100644 index 000000000..284465bdb --- /dev/null +++ b/jun_pc_web/index_e.html @@ -0,0 +1,233 @@ + + + + + + + + 齐兴会计师事务所信息系统- 首页 + + + + + + + + + +
            + +
            + +
              +
            • + +
            • +
            • + +
            • + + +
            + +
            + + +
            +
            + +
            +
            + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/index_e2.html b/jun_pc_web/index_e2.html new file mode 100644 index 000000000..21dd38266 --- /dev/null +++ b/jun_pc_web/index_e2.html @@ -0,0 +1,389 @@ + + + + + + + + 齐兴会计师事务所信息系统- 首页 + + + + + + + + + +
            + +
            + +
              +
            • + +
            • +
            • + +
            • + + +
            + +
            + + + + + + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/install/index/step12.html b/jun_pc_web/install/index/step12.html new file mode 100644 index 000000000..904ba9782 --- /dev/null +++ b/jun_pc_web/install/index/step12.html @@ -0,0 +1,52 @@ + + + + + + 勾股OA安装 + + + + + + + + +
            勾股OA安装
            +
            +
            +
            + +
              +
            • v{:CMS_VERSION}
            • +
            +
            +
            +

            勾股OA是一套基于ThinkPHP{$TP_VERSION} + Layui{:LAYUI_VERSION} + MySql打造的轻量级、高性能OA办公系统。简单实用,系统集成了十二大办公基本的功能模块:系统管理、基础数据、员工管理、消息通知、企业公告、知识文章、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理等基础模块。系统易于功能扩展,方便二次开发,让开发者更专注于业务深度需求的开发,帮助开发者简单高效降低二次开发成本,通过二次开发之后可以用来做CRM,ERP,业务管理等系统。

            + 有限担保和免责声明:
            + 1、本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的。
            + 2、用户出于自愿而使用本软件,您必须了解使用本软件的风险。
            + 3、我们不承诺提供任何形式的技术支持、使用担保,也不承担任何因使用本软件而产生问题的相关责任。
            + 4、使用本软件构建的网站系统的任何信息内容以及导致的任何版权纠纷和法律争议及后果,本系统不承担任何责任。
            + 5、您一旦安装使用本软件,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的权力的同时,受到相关的约束和限制。 +

            + +
            +
            +
            + + + + \ No newline at end of file diff --git a/jun_pc_web/install/index/step22.html b/jun_pc_web/install/index/step22.html new file mode 100644 index 000000000..1a1ffbff4 --- /dev/null +++ b/jun_pc_web/install/index/step22.html @@ -0,0 +1,211 @@ + + + + + + 勾股OA安装 + + + + + + + + +
            勾股OA安装
            +
            +
            +
            + +
              +
            • v{:CMS_VERSION}
            • +
            +
            +
            +

            安装环境检测

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            环境最低配置当前配置是否符合
            操作系统不限 + +
            php版本≥ 7.0 + + + =7)): ?> + + + + +
            +

            模块检测

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            环境最低配置当前配置是否符合
            session支持{eq name="$data.session" value="1"}支持{else /}不支持{/eq} +
            PDO开启{eq name="$data.pdo" value="1"}已开启{else /}未开启{/eq} +
            PDO_Mysql开启{eq name="$data.pdo_mysql" value="1"}已开启{else /}未开启{/eq}
            上传限制≥ 2M{eq name="$data.upload_size" value="0"}不支持{else /}{$data.upload_size}{/eq} +
            +

            目录权限

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            环境最低配置当前配置是否符合
            config可写 + + 可写 + + 不可写 + + + + + + + +
            /storage可写 + + 可写 + + 不可写 + + + + + + + +
            + +
            +
            +
            + + + + + + \ No newline at end of file diff --git a/jun_pc_web/install/index/step32.html b/jun_pc_web/install/index/step32.html new file mode 100644 index 000000000..af1ffe215 --- /dev/null +++ b/jun_pc_web/install/index/step32.html @@ -0,0 +1,190 @@ + + + + + + 勾股OA安装 + + + + + + + + +
            勾股OA安装
            +
            +
            +
            + +
              +
            • v{:CMS_VERSION}
            • +
            +
            +
            +
            +

            数据库配置

            +
            + +
            + +
            +
            固定为mysql,不可更改
            +
            +
            + +
            + +
            +
            数据库服务器地址,一般为127.0.0.1
            +
            +
            + +
            + +
            +
            数据库端口,一般为3306
            +
            +
            + +
            + +
            +
            系统数据库名,必须包含字母,不能有"-"等特殊符号
            +
            +
            + +
            + +
            +
            连接数据库的用户名
            +
            +
            + +
            + +
            +
            连接数据库的密码
            +
            +
            + +
            + +
            +
            建议使用默认,同一个数据库安装多个系统时需更改,否则会覆盖
            +
            + +
            +

            管理员配置

            +
            + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            + +
            + +
            +
            + 上一步 + +
            +
            +
            + +
            +
            +
            + + + + + \ No newline at end of file diff --git a/jun_pc_web/json/article.json b/jun_pc_web/json/article.json new file mode 100644 index 000000000..49ce40c98 --- /dev/null +++ b/jun_pc_web/json/article.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":4,"title":"勾股DEV使用指南","create_time":"2022-04-04 :17:45","read":59,"cate_title":"办公技巧"},{"id":3,"title":"如何新增知识文章","create_time":"2021-12-03 :23:14","read":145,"cate_title":"办公技巧"},{"id":2,"title":"重点:勾股OA是产品详细介绍及安装使用说明","create_time":"2021-11-28 :18:07","read":82,"cate_title":"行业技能"},{"id":1,"title":"勾股办公是一款简单实用的开源免费的企业办公系统框架","create_time":"2021-11-27 :11:54","read":45,"cate_title":"行业技能"}]} \ No newline at end of file diff --git a/jun_pc_web/json/authorities.json b/jun_pc_web/json/authorities.json new file mode 100644 index 000000000..c0237d3e1 --- /dev/null +++ b/jun_pc_web/json/authorities.json @@ -0,0 +1,176 @@ +{ + "code": 0, + "msg": "", + "count": 13, + "data": [ + { + "authorityId": 1, + "authorityName": "系统管理", + "authority": null, + "menuUrl": null, + "parentId": -1, + "isMenu": 0, + "orderNumber": 1, + "menuIcon": "layui-icon layui-icon-set", + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 2, + "authorityName": "用户管理", + "authority": null, + "menuUrl": "system/user", + "parentId": 1, + "isMenu": 0, + "orderNumber": 2, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 3, + "authorityName": "查看用户", + "authority": "user:view", + "menuUrl": null, + "parentId": 2, + "isMenu": 1, + "orderNumber": 3, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 4, + "authorityName": "更新用户", + "authority": "user:update", + "menuUrl": null, + "parentId": 2, + "isMenu": 1, + "orderNumber": 4, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 5, + "authorityName": "角色管理", + "authority": null, + "menuUrl": "system/role", + "parentId": 1, + "isMenu": 0, + "orderNumber": 5, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 6, + "authorityName": "查看角色", + "authority": "role:view", + "menuUrl": null, + "parentId": 5, + "isMenu": 1, + "orderNumber": 6, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 7, + "authorityName": "更新角色", + "authority": "role:update", + "menuUrl": null, + "parentId": 5, + "isMenu": 1, + "orderNumber": 7, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 8, + "authorityName": "权限管理", + "authority": null, + "menuUrl": "system/authorities", + "parentId": 1, + "isMenu": 0, + "orderNumber": 8, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 9, + "authorityName": "查看权限", + "authority": "authorities:view", + "menuUrl": null, + "parentId": 8, + "isMenu": 1, + "orderNumber": 9, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 10, + "authorityName": "更新权限", + "authority": "authorities:update", + "menuUrl": null, + "parentId": 8, + "isMenu": 1, + "orderNumber": 10, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 11, + "authorityName": "登录日志", + "authority": "loginRecord:view", + "menuUrl": "system/loginRecord", + "parentId": 1, + "isMenu": 0, + "orderNumber": 11, + "menuIcon": null, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 12, + "authorityName": "系统监控", + "authority": "", + "menuUrl": "", + "parentId": -1, + "isMenu": 0, + "orderNumber": 12, + "menuIcon": "layui-icon layui-icon-engine", + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + }, + { + "authorityId": 13, + "authorityName": "Druid监控", + "authority": "", + "menuUrl": "druid", + "parentId": 12, + "isMenu": 0, + "orderNumber": 13, + "menuIcon": "", + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "open": true + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/blog_article.json b/jun_pc_web/json/blog_article.json new file mode 100644 index 000000000..b8c49c9e9 --- /dev/null +++ b/jun_pc_web/json/blog_article.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":130,"title":"如何在gitee上提交Pull Request,给他人的项目贡献自己的代码","read":27,"status":1,"create_time":"2022-05-20 15:15","cate_title":"闲言碎语"},{"id":129,"title":"DevOps已向业务进阶,如何实现项目研发效率的提升?","read":24,"status":1,"create_time":"2022-05-19 14:26","cate_title":"闲言碎语"},{"id":128,"title":"谷歌发布Flutter 3,增加对macOS和Linux 应用的支持","read":20,"status":1,"create_time":"2022-05-19 13:57","cate_title":"常用软件"},{"id":127,"title":"码云(gitee)配置git禁止直接提交到master分支的方法","read":45,"status":1,"create_time":"2022-05-11 15:12","cate_title":"闲言碎语"},{"id":126,"title":"微软推出VS Code PowerShell的重大更新 PowerShell 引擎的彻底改造","read":32,"status":1,"create_time":"2022-05-09 09:05","cate_title":"常用软件"},{"id":125,"title":"PHP合并数组的4种常见方法","read":39,"status":1,"create_time":"2022-05-06 14:51","cate_title":"技术杂谈"},{"id":124,"title":"字符编码Unicode新增五个新的行星符号","read":40,"status":1,"create_time":"2022-05-06 10:18","cate_title":"闲言碎语"},{"id":123,"title":"PHP写入文件的方法,读取文件内容的五种方式","read":31,"status":1,"create_time":"2022-05-05 15:20","cate_title":"技术杂谈"},{"id":122,"title":"centos系统,宝塔面板SSL证书文件在哪里?","read":26,"status":1,"create_time":"2022-05-02 18:05","cate_title":"技术杂谈"},{"id":121,"title":"HTML+CSS+JS 基于浏览器实现打印58小票","read":76,"status":1,"create_time":"2022-04-30 18:00","cate_title":"技术杂谈"}]} \ No newline at end of file diff --git a/jun_pc_web/json/blog_data.json b/jun_pc_web/json/blog_data.json new file mode 100644 index 000000000..d8d519f86 --- /dev/null +++ b/jun_pc_web/json/blog_data.json @@ -0,0 +1 @@ +{"code":0,"msg":"","url":"","data":{"data_first":[17,51,55,20,21,14,24,23,33,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"data_second":[62,325,243,20,87,18,51,20,37,44,50,35,23,72,33,30,46,29,212,17,19,36,31,96],"data_three":{"2021-07-01":117,"2021-07-02":113,"2021-07-03":55,"2021-07-04":114,"2021-07-05":84,"2021-07-06":42,"2021-07-07":47,"2021-07-08":93,"2021-07-09":63,"2021-07-10":36,"2021-07-11":71,"2021-07-12":45,"2021-07-13":72,"2021-07-14":129,"2021-07-15":48,"2021-07-16":63,"2021-07-17":83,"2021-07-18":56,"2021-07-19":80,"2021-07-20":86,"2021-07-21":104,"2021-07-22":105,"2021-07-23":45,"2021-07-24":42,"2021-07-25":53,"2021-07-26":89,"2021-07-27":116,"2021-07-28":91,"2021-07-29":93,"2021-07-30":68,"2021-07-31":70,"2021-08-01":73,"2021-08-02":67,"2021-08-03":100,"2021-08-04":112,"2021-08-05":84,"2021-08-06":68,"2021-08-07":110,"2021-08-08":74,"2021-08-09":86,"2021-08-10":185,"2021-08-11":76,"2021-08-12":120,"2021-08-13":97,"2021-08-14":108,"2021-08-15":68,"2021-08-16":268,"2021-08-17":186,"2021-08-18":201,"2021-08-19":209,"2021-08-20":153,"2021-08-21":189,"2021-08-22":106,"2021-08-23":121,"2021-08-24":143,"2021-08-25":135,"2021-08-26":154,"2021-08-27":157,"2021-08-28":106,"2021-08-29":129,"2021-08-30":147,"2021-08-31":269,"2021-09-01":232,"2021-09-02":125,"2021-09-03":252,"2021-09-04":133,"2021-09-05":102,"2021-09-06":221,"2021-09-07":172,"2021-09-08":212,"2021-09-09":286,"2021-09-10":136,"2021-09-11":372,"2021-09-12":189,"2021-09-13":136,"2021-09-14":178,"2021-09-15":201,"2021-09-16":165,"2021-09-17":258,"2021-09-18":176,"2021-09-19":193,"2021-09-20":157,"2021-09-21":178,"2021-09-22":122,"2021-09-23":155,"2021-09-24":212,"2021-09-25":185,"2021-09-26":114,"2021-09-27":208,"2021-09-28":365,"2021-09-29":176,"2021-09-30":206,"2021-10-01":138,"2021-10-02":219,"2021-10-03":208,"2021-10-04":217,"2021-10-05":217,"2021-10-06":156,"2021-10-07":364,"2021-10-08":194,"2021-10-09":170,"2021-10-10":168,"2021-10-11":167,"2021-10-12":229,"2021-10-13":168,"2021-10-14":217,"2021-10-15":142,"2021-10-16":267,"2021-10-17":340,"2021-10-18":211,"2021-10-19":211,"2021-10-20":211,"2021-10-21":215,"2021-10-22":161,"2021-10-23":337,"2021-10-24":244,"2021-10-25":1082,"2021-10-26":253,"2021-10-27":296,"2021-10-28":178,"2021-10-29":236,"2021-10-30":178,"2021-10-31":195,"2021-11-01":398,"2021-11-02":218,"2021-11-03":156,"2021-11-04":179,"2021-11-05":218,"2021-11-06":183,"2021-11-07":161,"2021-11-08":163,"2021-11-09":243,"2021-11-10":209,"2021-11-11":257,"2021-11-12":182,"2021-11-13":178,"2021-11-14":194,"2021-11-15":288,"2021-11-16":245,"2021-11-17":186,"2021-11-18":338,"2021-11-19":276,"2021-11-20":132,"2021-11-21":220,"2021-11-22":321,"2021-11-23":289,"2021-11-24":314,"2021-11-25":290,"2021-11-26":236,"2021-11-27":331,"2021-11-28":216,"2021-11-29":266,"2021-11-30":274,"2021-12-01":359,"2021-12-02":398,"2021-12-03":328,"2021-12-04":404,"2021-12-05":400,"2021-12-06":404,"2021-12-07":402,"2021-12-08":349,"2021-12-09":527,"2021-12-10":569,"2021-12-11":522,"2021-12-12":368,"2021-12-13":331,"2021-12-14":490,"2021-12-15":520,"2021-12-16":393,"2021-12-17":400,"2021-12-18":302,"2021-12-19":368,"2021-12-20":445,"2021-12-21":411,"2021-12-22":389,"2021-12-23":483,"2021-12-24":445,"2021-12-25":533,"2021-12-26":463,"2021-12-27":450,"2021-12-28":459,"2021-12-29":431,"2021-12-30":317,"2021-12-31":523,"2022-01-01":313,"2022-01-02":384,"2022-01-03":303,"2022-01-04":464,"2022-01-05":614,"2022-01-06":571,"2022-01-07":459,"2022-01-08":317,"2022-01-09":314,"2022-01-10":316,"2022-01-11":446,"2022-01-12":558,"2022-01-13":542,"2022-01-14":384,"2022-01-15":411,"2022-01-16":447,"2022-01-17":498,"2022-01-18":405,"2022-01-19":846,"2022-01-20":607,"2022-01-21":401,"2022-01-22":338,"2022-01-23":395,"2022-01-24":495,"2022-01-25":328,"2022-01-26":370,"2022-01-27":289,"2022-01-28":309,"2022-01-29":415,"2022-01-30":316,"2022-01-31":367,"2022-02-01":262,"2022-02-02":407,"2022-02-03":384,"2022-02-04":287,"2022-02-05":315,"2022-02-06":278,"2022-02-07":307,"2022-02-08":450,"2022-02-09":426,"2022-02-10":579,"2022-02-11":596,"2022-02-12":373,"2022-02-13":419,"2022-02-14":580,"2022-02-15":388,"2022-02-16":442,"2022-02-17":694,"2022-02-18":869,"2022-02-19":557,"2022-02-20":620,"2022-02-21":604,"2022-02-22":466,"2022-02-23":515,"2022-02-24":692,"2022-02-25":428,"2022-02-26":425,"2022-02-27":325,"2022-02-28":560,"2022-03-01":834,"2022-03-02":639,"2022-03-03":554,"2022-03-04":752,"2022-03-05":542,"2022-03-06":1299,"2022-03-07":1081,"2022-03-08":1093,"2022-03-09":1005,"2022-03-10":1204,"2022-03-11":986,"2022-03-12":509,"2022-03-13":490,"2022-03-14":664,"2022-03-15":654,"2022-03-16":620,"2022-03-17":569,"2022-03-18":458,"2022-03-19":460,"2022-03-20":386,"2022-03-21":570,"2022-03-22":379,"2022-03-23":462,"2022-03-24":642,"2022-03-25":705,"2022-03-26":1021,"2022-03-27":775,"2022-03-28":629,"2022-03-29":660,"2022-03-30":642,"2022-03-31":978,"2022-04-01":1065,"2022-04-02":796,"2022-04-03":847,"2022-04-04":626,"2022-04-05":715,"2022-04-06":896,"2022-04-07":1332,"2022-04-08":793,"2022-04-09":438,"2022-04-10":602,"2022-04-11":717,"2022-04-12":704,"2022-04-13":605,"2022-04-14":1096,"2022-04-15":586,"2022-04-16":671,"2022-04-17":607,"2022-04-18":815,"2022-04-19":565,"2022-04-20":738,"2022-04-21":681,"2022-04-22":718,"2022-04-23":641,"2022-04-24":750,"2022-04-25":994,"2022-04-26":932,"2022-04-27":793,"2022-04-28":816,"2022-04-29":1023,"2022-04-30":629,"2022-05-01":985,"2022-05-02":869,"2022-05-03":706,"2022-05-04":850,"2022-05-05":1066,"2022-05-06":1005,"2022-05-07":814,"2022-05-08":1052,"2022-05-09":843,"2022-05-10":1185,"2022-05-11":999,"2022-05-12":804,"2022-05-13":921,"2022-05-14":997,"2022-05-15":887,"2022-05-16":1252,"2022-05-17":856,"2022-05-18":1019,"2022-05-19":1588,"2022-05-20":1019,"2022-05-21":1275,"2022-05-22":620,"2022-05-23":1162,"2022-05-24":1471,"2022-05-25":1636,"2022-05-26":399}}} \ No newline at end of file diff --git a/jun_pc_web/json/blog_user.json b/jun_pc_web/json/blog_user.json new file mode 100644 index 000000000..23e0be201 --- /dev/null +++ b/jun_pc_web/json/blog_user.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":33,"nickname":"","nickname_a":"","username":"qwer52121","password":"cce65ccdd53dcf08bf1106959d90c1e1","salt":"NPorVHdMpAfycRGiuTSK","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_lvK4aqFf3e1653293137.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-05-23 16:05:42","last_login_ip":"36.5.243.138","login_num":1,"register_time":1653293137,"register_ip":"36.5.243.138","update_time":0,"wx_platform":0},{"id":32,"nickname":"","nickname_a":"","username":"silverwq","password":"4e7ca9780268e64e0df9fb8bdf15cc28","salt":"BGDne6zQrKdX3qPm7svE","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_OwInV25dCs1652410361.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-05-13 10:52:53","last_login_ip":"183.250.89.28","login_num":1,"register_time":1652410361,"register_ip":"183.250.89.28","update_time":0,"wx_platform":0},{"id":31,"nickname":"","nickname_a":"","username":"www111","password":"2ffa52ba4018230745b3091fd0363da9","salt":"y5fpwzFXg8Rr4q3bPmLd","name":"wwg","mobile":"","mobile_status":0,"email":"2923521264@qq.com","headimgurl":"\/storage\/avatars\/avatar_256_KiP1qWUCzL1652322530.png","sex":0,"desc":"","birthday":-28800,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-05-12 10:31:56","last_login_ip":"114.254.83.209","login_num":2,"register_time":1652322530,"register_ip":"114.254.83.209","update_time":0,"wx_platform":0},{"id":30,"nickname":"","nickname_a":"","username":"daahuan","password":"97ae5bf2f1d9eb836b325bc521190f4f","salt":"GuEhKgHO8tcw6qVZN3MP","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_7iAWe43Bql1651823060.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-05-06 15:44:48","last_login_ip":"113.8.34.129","login_num":1,"register_time":1651823060,"register_ip":"113.8.34.129","update_time":0,"wx_platform":0},{"id":29,"nickname":"","nickname_a":"","username":"qwer52111","password":"9e7803a9d76923bc7962691defcec252","salt":"OgwKM3bVBin5QXhHdeE2","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_mkaGQg2MFe1651651580.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-05-04 16:06:29","last_login_ip":"183.160.57.149","login_num":1,"register_time":1651651580,"register_ip":"183.160.57.149","update_time":0,"wx_platform":0},{"id":28,"nickname":"","nickname_a":"","username":"julian_guo","password":"705dedeaabfd58f7d039d0f1698a476e","salt":"URI3SkwLgZp8mcP14i7l","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_yRFhD0dri81651591969.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-05-03 23:33:02","last_login_ip":"39.144.45.34","login_num":1,"register_time":1651591969,"register_ip":"39.144.45.34","update_time":0,"wx_platform":0},{"id":27,"nickname":"","nickname_a":"","username":"w15771701655","password":"4ecd277bfb25594ca90932b97bc4e149","salt":"59hARiPrT7U0apBdsW3S","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_eOotDU54mR1651226550.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"1970-01-01 08:00:00","last_login_ip":"","login_num":0,"register_time":1651226550,"register_ip":"111.18.248.120","update_time":0,"wx_platform":0},{"id":26,"nickname":"","nickname_a":"","username":"test123","password":"cc4d029665897c4186ce5a65ba45a7d0","salt":"wh4FbLYxj1ZXUWroTpn0","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_AjG7hcvy6a1651049618.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-04-27 16:53:48","last_login_ip":"183.216.250.24","login_num":1,"register_time":1651049618,"register_ip":"183.216.250.24","update_time":0,"wx_platform":0},{"id":25,"nickname":"","nickname_a":"","username":"tests","password":"3256612fd14ce989f1fac702c03e9d1e","salt":"cpokSe61g8wXGiMVxLHW","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_yqZWMNtUxa1651024726.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-04-27 09:59:02","last_login_ip":"1.204.207.119","login_num":1,"register_time":1651024726,"register_ip":"1.204.207.119","update_time":0,"wx_platform":0},{"id":24,"nickname":"","nickname_a":"","username":"ianren","password":"191f3da184ffe66dd423a6daf7e92a4c","salt":"QZDpqM6Rcd9JTS8bNuko","name":"","mobile":"","mobile_status":0,"email":"","headimgurl":"\/storage\/avatars\/avatar_256_KypLqGnFQZ1650530127.png","sex":0,"desc":"","birthday":0,"country":"","province":"","city":"","company":"","address":"","depament":"","position":"","puid":0,"qrcode_invite":0,"level":1,"status":1,"last_login_time":"2022-04-21 16:35:42","last_login_ip":"27.38.9.97","login_num":1,"register_time":1650530127,"register_ip":"27.38.9.97","update_time":0,"wx_platform":0}]} \ No newline at end of file diff --git a/jun_pc_web/json/data-grid1.json b/jun_pc_web/json/data-grid1.json new file mode 100644 index 000000000..589e01aba --- /dev/null +++ b/jun_pc_web/json/data-grid1.json @@ -0,0 +1,47 @@ +{ + "code": 0, + "msg": "query ok", + "count": 800, + "data": [ + { + "title": "Alipay", + "head": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", + "name": "付小小", + "star": 184, + "like": 125, + "comment": 18 + }, + { + "title": "Angular", + "head": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png", + "name": "曲丽丽", + "star": 175, + "like": 133, + "comment": 12 + }, + { + "title": "Ant Design", + "head": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", + "name": "林东东", + "star": 101, + "like": 111, + "comment": 11 + }, + { + "title": "Ant Design Pro", + "head": "https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png", + "name": "周星星", + "star": 154, + "like": 161, + "comment": 16 + }, + { + "title": "Bootstrap", + "head": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "name": "吴加好", + "star": 159, + "like": 169, + "comment": 11 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/data-grid2.json b/jun_pc_web/json/data-grid2.json new file mode 100644 index 000000000..9d1ca8f23 --- /dev/null +++ b/jun_pc_web/json/data-grid2.json @@ -0,0 +1,265 @@ +{ + "code": 0, + "msg": "query ok", + "count": 800, + "data": [ + { + "title": "Alipay", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "几秒内" + }, + { + "title": "Angular XXX公司的年报审计项目", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "2小时前" + }, + { + "title": "Layui", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "4小时前" + }, + { + "title": "EasyWeb", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", + "time": "6小时前" + }, + { + "title": "Bootstrap", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "那时候我只会想自己想要什么,从不想自己拥有什么", + "time": "8小时前" + }, + { + "title": "React", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "10小时前" + }, + { + "title": "Vue", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "12小时前" + }, + { + "title": "Webpack", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "14小时前" + }, + { + "title": "Layui", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "4小时前" + }, + { + "title": "EasyWeb", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", + "time": "6小时前" + }, + { + "title": "Bootstrap", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "那时候我只会想自己想要什么,从不想自己拥有什么", + "time": "8小时前" + }, + { + "title": "React", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "10小时前" + }, + { + "title": "Vue", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "12小时前" + }, + { + "title": "Webpack", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "14小时前" + }, + { + "title": "Alipay", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "几秒内" + }, + { + "title": "Angular", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "2小时前" + }, + { + "title": "Vue", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "12小时前" + }, + { + "title": "Webpack", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "14小时前" + }, + { + "title": "Layui", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "4小时前" + }, + { + "title": "EasyWeb", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", + "time": "6小时前" + }, + { + "title": "Bootstrap", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "那时候我只会想自己想要什么,从不想自己拥有什么", + "time": "8小时前" + }, + { + "title": "React", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "10小时前" + }, + { + "title": "Vue", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "12小时前" + }, + { + "title": "Webpack", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "14小时前" + }, + { + "title": "Alipay", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "几秒内" + }, + { + "title": "Angular", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "2小时前" + }, + { + "title": "Vue", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "12小时前" + }, + { + "title": "Bootstrap", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "那时候我只会想自己想要什么,从不想自己拥有什么", + "time": "8小时前" + }, + { + "title": "Webpack", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "14小时前" + }, + { + "title": "Layui", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "4小时前" + }, + { + "title": "EasyWeb", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", + "time": "6小时前" + }, + { + "title": "Bootstrap", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "那时候我只会想自己想要什么,从不想自己拥有什么", + "time": "8小时前" + }, + { + "title": "React", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "10小时前" + }, + { + "title": "Vue", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "12小时前" + }, + { + "title": "Webpack", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "14小时前" + }, + { + "title": "Alipay", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "几秒内" + }, + { + "title": "Angular", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png", + "desc": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "time": "2小时前" + }, + { + "title": "Layui", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "4小时前" + }, + { + "title": "EasyWeb", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", + "time": "6小时前" + }, + { + "title": "Bootstrap", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "那时候我只会想自己想要什么,从不想自己拥有什么", + "time": "8小时前" + }, + { + "title": "React", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "那是一种内在的东西, 他们到达不了,也无法触及的", + "time": "10小时前" + }, + { + "title": "Layui", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png", + "desc": "生命就像一盒巧克力,结果往往出人意料", + "time": "4小时前" + }, + { + "title": "EasyWeb", + "cover": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png", + "desc": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", + "time": "6小时前" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/data-grid3.json b/jun_pc_web/json/data-grid3.json new file mode 100644 index 000000000..c0dd4831b --- /dev/null +++ b/jun_pc_web/json/data-grid3.json @@ -0,0 +1,265 @@ +{ + "code": 0, + "msg": "query ok", + "count": 43, + "data": [ + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", + "name": "Alipay", + "activeNum": 16, + "newNum": "1,359" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png", + "name": "Angular XXX公司的年报审计项目", + "activeNum": "张三", + "newNum": "111,126" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", + "name": "Ant Design", + "activeNum": 10, + "newNum": "1,050" + }, + { + "head": "http://demo.easyweb.vip/iframe/assets/images/logo.png", + "name": "EasyWeb", + "activeNum": 16, + "newNum": "1,244" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "name": "Bootstrap", + "activeNum": 13, + "newNum": "1,375" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png", + "name": "React", + "activeNum": 12, + "newNum": "1,220" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png", + "name": "Vue", + "activeNum": 14, + "newNum": "1,939" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png", + "name": "Webpack", + "activeNum": 16, + "newNum": "1,306" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", + "name": "Ant Design", + "activeNum": 10, + "newNum": "1,050" + }, + { + "head": "http://demo.easyweb.vip/iframe/assets/images/logo.png", + "name": "EasyWeb", + "activeNum": 16, + "newNum": "1,244" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "name": "Bootstrap", + "activeNum": 13, + "newNum": "1,375" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png", + "name": "React", + "activeNum": 12, + "newNum": "1,220" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png", + "name": "Vue", + "activeNum": 14, + "newNum": "1,939" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png", + "name": "Webpack", + "activeNum": 16, + "newNum": "1,306" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", + "name": "Alipay", + "activeNum": 16, + "newNum": "1,359" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png", + "name": "Angular", + "activeNum": 14, + "newNum": "1,126" + }, + { + "head": "http://demo.easyweb.vip/iframe/assets/images/logo.png", + "name": "EasyWeb", + "activeNum": 16, + "newNum": "1,244" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "name": "Bootstrap", + "activeNum": 13, + "newNum": "1,375" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", + "name": "Ant Design", + "activeNum": 10, + "newNum": "1,050" + }, + { + "head": "http://demo.easyweb.vip/iframe/assets/images/logo.png", + "name": "EasyWeb", + "activeNum": 16, + "newNum": "1,244" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "name": "Bootstrap", + "activeNum": 13, + "newNum": "1,375" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png", + "name": "React", + "activeNum": 12, + "newNum": "1,220" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png", + "name": "Vue", + "activeNum": 14, + "newNum": "1,939" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png", + "name": "Webpack", + "activeNum": 16, + "newNum": "1,306" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", + "name": "Alipay", + "activeNum": 16, + "newNum": "1,359" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png", + "name": "Angular", + "activeNum": 14, + "newNum": "1,126" + }, + { + "head": "http://demo.easyweb.vip/iframe/assets/images/logo.png", + "name": "EasyWeb", + "activeNum": 16, + "newNum": "1,244" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", + "name": "Ant Design", + "activeNum": 10, + "newNum": "1,050" + }, + { + "head": "http://demo.easyweb.vip/iframe/assets/images/logo.png", + "name": "EasyWeb", + "activeNum": 16, + "newNum": "1,244" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "name": "Bootstrap", + "activeNum": 13, + "newNum": "1,375" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png", + "name": "React", + "activeNum": 12, + "newNum": "1,220" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png", + "name": "Vue", + "activeNum": 14, + "newNum": "1,939" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png", + "name": "Webpack", + "activeNum": 16, + "newNum": "1,306" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", + "name": "Alipay", + "activeNum": 16, + "newNum": "1,359" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png", + "name": "Angular", + "activeNum": 14, + "newNum": "1,126" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png", + "name": "Webpack", + "activeNum": 16, + "newNum": "1,306" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", + "name": "Ant Design", + "activeNum": 10, + "newNum": "1,050" + }, + { + "head": "http://demo.easyweb.vip/iframe/assets/images/logo.png", + "name": "EasyWeb", + "activeNum": 16, + "newNum": "1,244" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "name": "Bootstrap", + "activeNum": 13, + "newNum": "1,375" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png", + "name": "React", + "activeNum": 12, + "newNum": "1,220" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png", + "name": "Vue", + "activeNum": 14, + "newNum": "1,939" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png", + "name": "Webpack", + "activeNum": 16, + "newNum": "1,306" + }, + { + "head": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", + "name": "Alipay", + "activeNum": 16, + "newNum": "1,359" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/dev.json b/jun_pc_web/json/dev.json new file mode 100644 index 000000000..dadaceb4d --- /dev/null +++ b/jun_pc_web/json/dev.json @@ -0,0 +1,103 @@ +{ + "data_first": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 2, + 1, + 0, + 0, + 1, + 0, + 0, + 2 + ], + "data_second": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 4, + 0, + 2, + 0, + 0, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7 + ], + "data_three": { + "2022-05-01": 79, + "2022-05-02": 59, + "2022-05-03": 99, + "2022-05-04": 39, + "2022-05-05": 59, + "2022-05-06": 72, + "2022-05-07": 71, + "2022-05-08": 69, + "2022-05-09": 85, + "2022-05-10": 62, + "2022-05-11": 68, + "2022-05-12": 95, + "2022-05-13": 89, + "2022-05-14": 79, + "2022-05-15": 26, + "2022-05-16": 38, + "2022-05-17": 21, + "2022-05-18": 48, + "2022-05-19": 20, + "2022-05-20": 30, + "2022-05-21": 36 + }, + "data_logs": [ + { + "count": 94, + "name": "勾股技术" + }, + { + "count": 63, + "name": "勾股挨踢" + }, + { + "count": 41, + "name": "欧阳产品" + }, + { + "count": 24, + "name": "超级员工" + }, + { + "count": 5, + "name": "李工" + }, + { + "count": 5, + "name": "黄玉龙" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/dict-data.json b/jun_pc_web/json/dict-data.json new file mode 100644 index 000000000..2152cf04e --- /dev/null +++ b/jun_pc_web/json/dict-data.json @@ -0,0 +1,61 @@ +{ + "code": 0, + "msg": "", + "count": 6, + "data": [ + { + "dictDataId": 1, + "dictDataName": "软件工程", + "dictDataCode": "software", + "sortNumber": 1, + "comments": "软件工程", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictDataId": 2, + "dictDataName": "计算机网络技术", + "dictDataCode": "network", + "sortNumber": 2, + "comments": "计算机网络技术", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictDataId": 3, + "dictDataName": "计算机信息管理", + "dictDataCode": "information", + "sortNumber": 3, + "comments": "计算机信息管理", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictDataId": 4, + "dictDataName": "物联网应用技术", + "dictDataCode": "things_internet", + "sortNumber": 4, + "comments": "物联网应用技术", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictDataId": 5, + "dictDataName": "数字媒体应用技术", + "dictDataCode": "multimedia", + "sortNumber": 5, + "comments": "数字媒体应用技术", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictDataId": 6, + "dictDataName": "移动互联网应用技术", + "dictDataCode": "mobile_internet", + "sortNumber": 6, + "comments": "移动互联网应用技术", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/dict.json b/jun_pc_web/json/dict.json new file mode 100644 index 000000000..95d751376 --- /dev/null +++ b/jun_pc_web/json/dict.json @@ -0,0 +1,61 @@ +{ + "code": 0, + "msg": "", + "count": 6, + "data": [ + { + "dictId": 1, + "dictName": "专业", + "dictCode": "majors", + "sortNumber": 1, + "comments": "专业", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictId": 2, + "dictName": "性别", + "dictCode": "sex", + "sortNumber": 2, + "comments": "性别", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictId": 3, + "dictName": "民族", + "dictCode": "nation", + "sortNumber": 3, + "comments": "民族", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictId": 4, + "dictName": "政治面貌", + "dictCode": "political_landscape", + "sortNumber": 4, + "comments": "政治面貌", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictId": 5, + "dictName": "保管期限", + "dictCode": "retention", + "sortNumber": 5, + "comments": "保管期限", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "dictId": 6, + "dictName": "密级", + "dictCode": "secret", + "sortNumber": 6, + "comments": "密级", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/e-calendar.json b/jun_pc_web/json/e-calendar.json new file mode 100644 index 000000000..ed37476d6 --- /dev/null +++ b/jun_pc_web/json/e-calendar.json @@ -0,0 +1,86 @@ +{ + "code": 200, + "msg": "", + "data": [ + { + "startDate": "2019-11-13", + "endDate": "2019-11-13", + "startTime": "08:00", + "endTime": "09:00", + "courseName": "Java初级程序设计", + "courseId": "110" + }, + { + "startDate": "2019-11-13", + "endDate": "2019-11-13", + "startTime": "08:00", + "endTime": "09:00", + "courseName": "计算机科学与技术", + "courseId": "111" + }, + { + "startDate": "2019-11-14", + "endDate": "2019-11-14", + "startTime": "08:00", + "endTime": "09:00", + "courseName": "锋利的jQuery", + "courseId": "112" + }, + { + "startDate": "2019-11-15", + "endDate": "2019-11-15", + "startTime": "08:00", + "endTime": "09:00", + "courseName": "锋利的jQuery", + "courseId": "113" + }, + { + "startDate": "2019-11-16", + "endDate": "2019-11-16", + "startTime": "10:00", + "endTime": "12:00", + "courseName": "HTML5与CSS3网页设计", + "courseId": "114" + }, + { + "startDate": "2019-11-17", + "endDate": "2019-11-17", + "startTime": "13:00", + "endTime": "15:00", + "courseName": "JavaScript程序设计", + "courseId": "115" + }, + { + "startDate": "2019-11-18", + "endDate": "2019-11-18", + "startTime": "16:00", + "endTime": "18:00", + "courseName": "数据库原理及应用", + "courseId": "116" + }, + { + "startDate": "2019-11-19", + "endDate": "2019-11-19", + "startTime": "13:00", + "endTime": "15:00", + "courseName": "数据库原理及应用", + "courseId": "116" + }, + { + "startDate": "2019-11-20", + "endDate": "2019-11-20", + "startTime": "08:00", + "endTime": "09:00", + "courseName": "数据库原理及应用", + "courseId": "116" + }, + { + "startDate": "2019-11-21", + "endDate": "2019-11-21", + "startTime": "10:00", + "endTime": "12:00", + "courseName": "数据库原理及应用", + "courseId": "116" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/e-course-tb1.json b/jun_pc_web/json/e-course-tb1.json new file mode 100644 index 000000000..d3aaf5854 --- /dev/null +++ b/jun_pc_web/json/e-course-tb1.json @@ -0,0 +1,37 @@ +{ + "code": 0, + "msg": "", + "count": 2, + "data": [ + { + "experimentTypeId": 32, + "experimentTypeName": "数字电子实验课", + "createTime": "2019/09/03 10:05:50", + "updateTime": "2019/09/03 10:05:50" + }, + { + "experimentTypeId": 31, + "experimentTypeName": "模拟电子实验课", + "createTime": "2019/09/03 10:05:04", + "updateTime": "2019/09/03 10:05:04" + }, + { + "experimentTypeId": 32, + "experimentTypeName": "xxx实验课", + "createTime": "2019/09/03 10:05:04", + "updateTime": "2019/09/03 10:05:04" + }, + { + "experimentTypeId": 33, + "experimentTypeName": "xxx实验课", + "createTime": "2019/09/03 10:05:04", + "updateTime": "2019/09/03 10:05:04" + }, + { + "experimentTypeId": 34, + "experimentTypeName": "xxx实验课", + "createTime": "2019/09/03 10:05:04", + "updateTime": "2019/09/03 10:05:04" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/e-course-tb2.json b/jun_pc_web/json/e-course-tb2.json new file mode 100644 index 000000000..07e4a8bcf --- /dev/null +++ b/jun_pc_web/json/e-course-tb2.json @@ -0,0 +1,79 @@ +{ + "code": 0, + "msg": "", + "count": 6, + "data": [ + { + "experimentId": 80, + "experimentTypeId": 32, + "experimentName": "数字电子技术实验1", + "experimentRequire": null, + "experimentTemplate": null, + "createUserId": 485, + "createTime": "2019/09/03 10:05:50", + "updateTime": "2019/09/03 10:05:50", + "createUserName": "邓", + "experimentTypeName": "数字电子实验课" + }, + { + "experimentId": 81, + "experimentTypeId": 32, + "experimentName": "数字电子技术实验2", + "experimentRequire": null, + "experimentTemplate": null, + "createUserId": 485, + "createTime": "2019/09/03 10:05:50", + "updateTime": "2019/09/03 10:05:50", + "createUserName": "邓", + "experimentTypeName": "数字电子实验课" + }, + { + "experimentId": 82, + "experimentTypeId": 32, + "experimentName": "数字电子技术实验3", + "experimentRequire": null, + "experimentTemplate": null, + "createUserId": 485, + "createTime": "2019/09/03 10:05:50", + "updateTime": "2019/09/03 10:05:50", + "createUserName": "邓", + "experimentTypeName": "数字电子实验课" + }, + { + "experimentId": 83, + "experimentTypeId": 32, + "experimentName": "数字电子技术实验4", + "experimentRequire": null, + "experimentTemplate": null, + "createUserId": 485, + "createTime": "2019/09/03 10:05:50", + "updateTime": "2019/09/03 10:05:50", + "createUserName": "邓", + "experimentTypeName": "数字电子实验课" + }, + { + "experimentId": 84, + "experimentTypeId": 32, + "experimentName": "数字电子技术实验5", + "experimentRequire": null, + "experimentTemplate": null, + "createUserId": 485, + "createTime": "2019/09/03 10:05:50", + "updateTime": "2019/09/03 10:05:50", + "createUserName": "邓", + "experimentTypeName": "数字电子实验课" + }, + { + "experimentId": 85, + "experimentTypeId": 32, + "experimentName": "数字电子技术实验6", + "experimentRequire": null, + "experimentTemplate": null, + "createUserId": 485, + "createTime": "2019/09/03 10:05:50", + "updateTime": "2019/09/03 10:05:50", + "createUserName": "邓", + "experimentTypeName": "数字电子实验课" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/e-dialog-tb1.json b/jun_pc_web/json/e-dialog-tb1.json new file mode 100644 index 000000000..f5fb0178b --- /dev/null +++ b/jun_pc_web/json/e-dialog-tb1.json @@ -0,0 +1,77 @@ +{ + "code": 0, + "msg": "", + "count": 5, + "data": [ + { + "id": 1, + "name": "付小小", + "department": "研发部", + "position": "前端工程师", + "summary": "完成了一个页面", + "plan": "完成下一个页面", + "comments": "无法重现", + "state": 0, + "createTime": "2019/03/29 16:38:03", + "img1": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img2": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img3": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg" + }, + { + "id": 2, + "name": "曲丽丽 ", + "department": "研发部", + "position": "开发工程师", + "summary": "解决了一个bug", + "plan": "配合测试", + "comments": "设计如此", + "state": 1, + "createTime": "2019/03/29 16:38:03", + "img1": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img2": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img3": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg" + }, + { + "id": 3, + "name": "吴加好", + "department": "研发部", + "position": "开发工程师", + "summary": "解决了一个bug", + "plan": "配合测试", + "comments": "外部原因", + "state": 1, + "createTime": "2019/03/29 16:38:03", + "img1": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img2": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img3": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg" + }, + { + "id": 4, + "name": "董娜娜", + "department": "研发部", + "position": "开发工程师", + "summary": "解决了一个bug", + "plan": "配合测试", + "comments": "无法重现", + "state": 1, + "createTime": "2019/03/29 16:38:03", + "img1": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img2": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img3": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg" + }, + { + "id": 5, + "name": "周星星", + "department": "测试部", + "position": "测试工程师", + "summary": "发现了一个bug", + "plan": "集成测试", + "comments": "与设计不符", + "state": 1, + "createTime": "2019/03/29 16:38:03", + "img1": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img2": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "img3": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/e-dialog-tb2.json b/jun_pc_web/json/e-dialog-tb2.json new file mode 100644 index 000000000..b35fc225e --- /dev/null +++ b/jun_pc_web/json/e-dialog-tb2.json @@ -0,0 +1,21 @@ +{ + "code": 0, + "msg": "", + "count": 2, + "data": [ + { + "id": 52, + "content": "今天做的工作还不错呀!", + "createTime": "2019/05/31 21:11:12", + "updateTime": "2019/05/31 21:11:12", + "nickName": "李莉" + }, + { + "id": 53, + "content": "今天感觉怎么样?", + "createTime": "2019/05/31 21:13:23", + "updateTime": "2019/05/31 21:13:23", + "nickName": "李婷" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/files.json b/jun_pc_web/json/files.json new file mode 100644 index 000000000..d92917827 --- /dev/null +++ b/jun_pc_web/json/files.json @@ -0,0 +1,138 @@ +{ + "msg": "查询成功", + "code": 200, + "data": [ + { + "name": "其他", + "updateTime": 1545804042000, + "type": "dir", + "isDir": true + }, + { + "name": "JMerter测试说明书.doc", + "updateTime": 1545803706000, + "type": "doc", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.doc", + "isDir": false + }, + { + "name": "HPI修订情况一览表.xls", + "updateTime": 1545803726000, + "type": "xls", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.xls", + "isDir": false + }, + { + "name": "仓库管理系统产品介绍180313.pptx", + "updateTime": 1545803742000, + "type": "ppt", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.pptx", + "isDir": false + }, + { + "name": "宣传画册1-17.pdf", + "updateTime": 1545803770000, + "type": "pdf", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.pdf", + "isDir": false + }, + { + "name": "更新日志.txt", + "updateTime": 1545803848000, + "type": "txt", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.txt", + "isDir": false + }, + { + "name": "index.html", + "updateTime": 1545803972000, + "type": "htm", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.html", + "isDir": false + }, + { + "name": "honehone_clock_wh.swf", + "updateTime": 1545803998000, + "type": "flash", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.swf", + "isDir": false + }, + { + "name": "试验报告管理平台.pdm", + "updateTime": 1545804016000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.pdm", + "isDir": false + }, + { + "smUrl": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "hasSm": true, + "name": "a0e0bffa077b4218a0739433439521e2.jpg", + "updateTime": 1545804022000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "isDir": false + }, + { + "smUrl": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "hasSm": true, + "name": "微信图片_20180423141141.jpg", + "updateTime": 1545804026000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "isDir": false + }, + { + "smUrl": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "hasSm": true, + "name": "微信图片_20180423140441.jpg", + "updateTime": 1545804396000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "isDir": false + }, + { + "smUrl": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "hasSm": true, + "name": "微信图片_20180423141146.jpg", + "updateTime": 1545804428000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "isDir": false + }, + { + "name": "runnerw.exe", + "updateTime": 1545815206000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.exe", + "isDir": false + }, + { + "smUrl": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "hasSm": true, + "name": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "updateTime": 1545815222000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "isDir": false + }, + { + "smUrl": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "hasSm": true, + "name": "Penguins.jpg", + "updateTime": 1545815694000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "isDir": false + }, + { + "smUrl": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "hasSm": true, + "name": "TIM图片20171018133340.png", + "updateTime": 1545815704000, + "type": "file", + "url": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg", + "isDir": false + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/getLoginUser.json b/jun_pc_web/json/getLoginUser.json new file mode 100644 index 000000000..2b6a3d44a --- /dev/null +++ b/jun_pc_web/json/getLoginUser.json @@ -0,0 +1,519 @@ +{ + "success": true, + "code": 200, + "message": "请求成功", + "data": { + "id": "1265476890672672808", + "account": "superAdmin", + "nickName": "超级管理员", + "name": "超级管理员", + "avatar": "1668164232231026690", + "birthday": "2020-03-18 00:00:00.000", + "sex": 1, + "email": "superAdmin@qq.com", + "phone": "15228937093", + "tel": "1234567890", + "adminType": 1, + "lastLoginIp": "127.0.0.1", + "lastLoginTime": "2023-06-13 10:29:23", + "lastLoginAddress": "-", + "lastLoginBrowser": "Chrome", + "lastLoginOs": "Windows 10 or Windows Server 2016", + "loginEmpInfo": { + "jobNum": null, + "orgId": null, + "orgName": null, + "extOrgPos": [], + "positions": [] + }, + "apps": [ + { + "code": "dashboard", + "name": "首页", + "active": true + }, + { + "code": "systool", + "name": "系统工具", + "active": false + }, + { + "code": "system", + "name": "系统应用", + "active": false + } + ], + "roles": [], + "permissions": [], + "menus": [ + { + "code": "dashboard", + "value": [ + { + "id": "133886400789280768111", + "parentId": "0", + "title": "工作台", + "value": "page/console/workplace.html", + "icon": "layui-icon-app", + "weight": 1, + "children": [], + "pid": "0" + }, + { + "id": "133886400789280768112", + "parentId": "0", + "title": "控制台", + "value": "page/console/console.html", + "icon": "layui-icon-app", + "weight": 1, + "children": [], + "pid": "0" + }, + { + "id": "133886400789280768113", + "parentId": "0", + "title": "分析页", + "value": "page/console/dashboard.html", + "icon": "layui-icon-app", + "weight": 1, + "children": [], + "pid": "0" + } + ] + }, + { + "code": "systool", + "value": [ + { + "id": "1338864007892807681", + "parentId": "0", + "title": "代码生成", + "value": "page/console/dashboard1.html", + "icon": "layui-icon-app", + "weight": 1, + "children": [], + "pid": "0" + } + ] + }, + { + "code": "system", + "value": [ + + + { + "id": "12646220396422553112", + "parentId": "0", + "title": "系统管理", + "value": "javascript:;", + "icon": "layui-icon-set", + "weight": 1, + "children": [ + { + "id": "1264622039642255321", + "parentId": "1264622039642255311", + "title": "用户管理", + "value": "page/system/user.html", + "icon": null, + "weight": 1, + "children": [], + "pid": "1264622039642255311" + }, + { + "id": "1264622039642255331", + "parentId": "1264622039642255311", + "title": "角色管理", + "value": "page/system/role.html", + "icon": null, + "weight": 2, + "children": [], + "pid": "1264622039642255311" + }, + { + "id": "1264622039642255332", + "parentId": "1264622039642255311", + "title": "权限管理", + "value": "page/system/authorities.html", + "icon": null, + "weight": 3, + "children": [], + "pid": "1264622039642255311" + }, + { + "id": "1264622039642255332", + "parentId": "1264622039642255311", + "title": "字典管理", + "value": "page/system/dictionary.html", + "icon": null, + "weight": 3, + "children": [], + "pid": "1264622039642255311" + }, + { + "id": "1264622039642255332", + "parentId": "1264622039642255311", + "title": "机构管理", + "value": "page/system/organization.html", + "icon": null, + "weight": 3, + "children": [], + "pid": "1264622039642255311" + }, + { + "id": "1264622039642255332", + "parentId": "1264622039642255311", + "title": "登录日志", + "value": "page/system/login-record.html", + "icon": null, + "weight": 3, + "children": [], + "pid": "1264622039642255311" + } + ], + "pid": "0" + }, + + + { + "id": "1264622039642255341", + "parentId": "0", + "title": "组织架构", + "value": "javascript:;", + "icon": "layui-icon-user", + "weight": 2, + "children": [ + { + "id": "1264622039642255351", + "parentId": "1264622039642255341", + "title": "用户管理", + "value": "/sysUser/index", + "icon": null, + "weight": 3, + "children": [], + "pid": "1264622039642255341" + }, + { + "id": "1264622039642255521", + "parentId": "1264622039642255341", + "title": "机构管理", + "value": "/sysOrg/index", + "icon": null, + "weight": 4, + "children": [], + "pid": "1264622039642255341" + }, + { + "id": "1264622039642255601", + "parentId": "1264622039642255341", + "title": "职位管理", + "value": "/sysPos/index", + "icon": null, + "weight": 5, + "children": [], + "pid": "1264622039642255341" + } + ], + "pid": "0" + }, + { + "id": "1264622039642255671", + "parentId": "0", + "title": "权限管理", + "value": "javascript:;", + "icon": "layui-icon-auz", + "weight": 3, + "children": [ + { + "id": "1264622039642255681", + "parentId": "1264622039642255671", + "title": "应用管理", + "value": "/sysApp/index", + "icon": null, + "weight": 6, + "children": [], + "pid": "1264622039642255671" + }, + { + "id": "1264622039642255761", + "parentId": "1264622039642255671", + "title": "菜单管理", + "value": "/sysMenu/index", + "icon": null, + "weight": 7, + "children": [], + "pid": "1264622039642255671" + }, + { + "id": "1264622039642255851", + "parentId": "1264622039642255671", + "title": "角色管理", + "value": "/sysRole/index", + "icon": null, + "weight": 8, + "children": [], + "pid": "1264622039642255671" + } + ], + "pid": "0" + }, + { + "id": "1264622039642255961", + "parentId": "0", + "title": "开发管理", + "value": "javascript:;", + "icon": "layui-icon-code-circle", + "weight": 4, + "children": [ + { + "id": "1264622039642255971", + "parentId": "1264622039642255961", + "title": "系统配置", + "value": "/sysConfig/index", + "icon": null, + "weight": 9, + "children": [], + "pid": "1264622039642255961" + }, + { + "id": "1264622039642256041", + "parentId": "1264622039642255961", + "title": "邮件发送", + "value": "/sysEmail/index", + "icon": null, + "weight": 10, + "children": [], + "pid": "1264622039642255961" + }, + { + "id": "1264622039642256071", + "parentId": "1264622039642255961", + "title": "短信管理", + "value": "/sysSms/index", + "icon": null, + "weight": 11, + "children": [], + "pid": "1264622039642255961" + }, + { + "id": "1264622039642256111", + "parentId": "1264622039642255961", + "title": "字典管理", + "value": "/sysDictType/index", + "icon": null, + "weight": 12, + "children": [], + "pid": "1264622039642255961" + }, + { + "id": "1264622039642256271", + "parentId": "1264622039642255961", + "title": "接口文档", + "value": "/doc.html", + "icon": null, + "weight": 13, + "children": [], + "pid": "1264622039642255961" + } + ], + "pid": "0" + }, + { + "id": "1264622039642256281", + "parentId": "0", + "title": "日志管理", + "value": "javascript:;", + "icon": "layui-icon-log", + "weight": 5, + "children": [ + { + "id": "1264622039642256291", + "parentId": "1264622039642256281", + "title": "访问日志", + "value": "/sysVisLog/index", + "icon": null, + "weight": 14, + "children": [], + "pid": "1264622039642256281" + }, + { + "id": "1264622039642256321", + "parentId": "1264622039642256281", + "title": "操作日志", + "value": "/sysOpLog/index", + "icon": null, + "weight": 15, + "children": [], + "pid": "1264622039642256281" + } + ], + "pid": "0" + }, + { + "id": "1264622039642256351", + "parentId": "0", + "title": "系统监控", + "value": "javascript:;", + "icon": "layui-icon-chart-screen", + "weight": 6, + "children": [ + { + "id": "1264622039642256361", + "parentId": "1264622039642256351", + "title": "服务监控", + "value": "/sysMachine/index", + "icon": null, + "weight": 16, + "children": [], + "pid": "1264622039642256351" + }, + { + "id": "1264622039642256381", + "parentId": "1264622039642256351", + "title": "在线用户", + "value": "/sysOnlineUser/index", + "icon": null, + "weight": 17, + "children": [], + "pid": "1264622039642256351" + }, + { + "id": "1264622039642256411", + "parentId": "1264622039642256351", + "title": "数据监控", + "value": "/druid", + "icon": null, + "weight": 18, + "children": [], + "pid": "1264622039642256351" + } + ], + "pid": "0" + }, + { + "id": "1264622039642256421", + "parentId": "0", + "title": "通知公告", + "value": "javascript:;", + "icon": "layui-icon-speaker", + "weight": 7, + "children": [ + { + "id": "1264622039642256431", + "parentId": "1264622039642256421", + "title": "公告管理", + "value": "/sysNotice/index", + "icon": null, + "weight": 19, + "children": [], + "pid": "1264622039642256421" + }, + { + "id": "1264622039642256501", + "parentId": "1264622039642256421", + "title": "已收公告", + "value": "/sysNotice/receivedPage", + "icon": null, + "weight": 20, + "children": [], + "pid": "1264622039642256421" + } + ], + "pid": "0" + }, + { + "id": "1264622039642256521", + "parentId": "0", + "title": "文件管理", + "value": "javascript:;", + "icon": "layui-icon-file", + "weight": 8, + "children": [ + { + "id": "1264622039642256531", + "parentId": "1264622039642256521", + "title": "系统文件", + "value": "/sysFileInfo/index", + "icon": null, + "weight": 21, + "children": [], + "pid": "1264622039642256521" + }, + { + "id": "1264622039642256602", + "parentId": "1264622039642256521", + "title": "在线文档", + "value": "/sysFileInfo/onlineIndex", + "icon": null, + "weight": 21, + "children": [], + "pid": "1264622039642256521" + } + ], + "pid": "0" + }, + { + "id": "1264622039642256721", + "parentId": "0", + "title": "系统区域", + "value": "javascript:;", + "icon": "layui-icon-console", + "weight": 100, + "children": [ + { + "id": "1264622039642256731", + "parentId": "1264622039642256721", + "title": "区域管理", + "value": "/sysArea/index", + "icon": null, + "weight": 100, + "children": [], + "pid": "1264622039642256721" + }, + { + "id": "1264622039642256741", + "parentId": "1264622039642256721", + "title": "区域选择", + "value": "/sysArea/select", + "icon": null, + "weight": 100, + "children": [], + "pid": "1264622039642256721" + } + ], + "pid": "0" + }, + { + "id": "1264622039642256611", + "parentId": "0", + "title": "定时任务", + "value": "javascript:;", + "icon": "layui-icon-console", + "weight": 100, + "children": [ + { + "id": "1264622039642256621", + "parentId": "1264622039642256611", + "title": "任务管理", + "value": "/sysTimers/index", + "icon": null, + "weight": 22, + "children": [], + "pid": "1264622039642256611" + } + ], + "pid": "0" + } + ] + } + ], + "dataScopes": [], + "tenants": null, + "enabled": true, + "authorities": [], + "password": null, + "username": "superAdmin", + "accountNonExpired": true, + "credentialsNonExpired": true, + "accountNonLocked": true + } +} \ No newline at end of file diff --git a/jun_pc_web/json/getLoginUser2.json b/jun_pc_web/json/getLoginUser2.json new file mode 100644 index 000000000..08619bc19 --- /dev/null +++ b/jun_pc_web/json/getLoginUser2.json @@ -0,0 +1 @@ +{"success":true,"code":200,"message":"请求成功","data":{"id":"1265476890672672808","account":"superAdmin","nickName":"超级管理员","name":"超级管理员","avatar":"1668164232231026690","birthday":"2020-03-18 00:00:00.000","sex":1,"email":"superAdmin@qq.com","phone":"15228937093","tel":"1234567890","adminType":1,"lastLoginIp":"127.0.0.1","lastLoginTime":"2023-06-13 10:29:23","lastLoginAddress":"-","lastLoginBrowser":"Chrome","lastLoginOs":"Windows 10 or Windows Server 2016","loginEmpInfo":{"jobNum":null,"orgId":null,"orgName":null,"extOrgPos":[],"positions":[]},"apps":[{"code":"systool","name":"系统工具","active":true},{"code":"system","name":"系统应用","active":true}],"roles":[],"permissions":[],"menus":[{"code":"systool","value":[{"id":"1338864007892807681","parentId":"0","title":"代码生成","value":"/codeGenerate/index","icon":"layui-icon-app","weight":1,"children":[],"pid":"0"}]},{"code":"system","value":[{"id":"1264622039642255311","parentId":"0","title":"主控面板","value":"javascript:;","icon":"layui-icon-home","weight":1,"children":[{"id":"1264622039642255321","parentId":"1264622039642255311","title":"分析页","value":"/other/dashboardHtml","icon":null,"weight":1,"children":[],"pid":"1264622039642255311"},{"id":"1264622039642255331","parentId":"1264622039642255311","title":"工作台","value":"/other/workplaceHtml","icon":null,"weight":2,"children":[],"pid":"1264622039642255311"},{"id":"1264622039642255332","parentId":"1264622039642255311","title":"控制台","value":"/other/consoleHtml","icon":null,"weight":3,"children":[],"pid":"1264622039642255311"}],"pid":"0"},{"id":"1264622039642255341","parentId":"0","title":"组织架构","value":"javascript:;","icon":"layui-icon-user","weight":2,"children":[{"id":"1264622039642255351","parentId":"1264622039642255341","title":"用户管理","value":"/sysUser/index","icon":null,"weight":3,"children":[],"pid":"1264622039642255341"},{"id":"1264622039642255521","parentId":"1264622039642255341","title":"机构管理","value":"/sysOrg/index","icon":null,"weight":4,"children":[],"pid":"1264622039642255341"},{"id":"1264622039642255601","parentId":"1264622039642255341","title":"职位管理","value":"/sysPos/index","icon":null,"weight":5,"children":[],"pid":"1264622039642255341"}],"pid":"0"},{"id":"1264622039642255671","parentId":"0","title":"权限管理","value":"javascript:;","icon":"layui-icon-auz","weight":3,"children":[{"id":"1264622039642255681","parentId":"1264622039642255671","title":"应用管理","value":"/sysApp/index","icon":null,"weight":6,"children":[],"pid":"1264622039642255671"},{"id":"1264622039642255761","parentId":"1264622039642255671","title":"菜单管理","value":"/sysMenu/index","icon":null,"weight":7,"children":[],"pid":"1264622039642255671"},{"id":"1264622039642255851","parentId":"1264622039642255671","title":"角色管理","value":"/sysRole/index","icon":null,"weight":8,"children":[],"pid":"1264622039642255671"}],"pid":"0"},{"id":"1264622039642255961","parentId":"0","title":"开发管理","value":"javascript:;","icon":"layui-icon-code-circle","weight":4,"children":[{"id":"1264622039642255971","parentId":"1264622039642255961","title":"系统配置","value":"/sysConfig/index","icon":null,"weight":9,"children":[],"pid":"1264622039642255961"},{"id":"1264622039642256041","parentId":"1264622039642255961","title":"邮件发送","value":"/sysEmail/index","icon":null,"weight":10,"children":[],"pid":"1264622039642255961"},{"id":"1264622039642256071","parentId":"1264622039642255961","title":"短信管理","value":"/sysSms/index","icon":null,"weight":11,"children":[],"pid":"1264622039642255961"},{"id":"1264622039642256111","parentId":"1264622039642255961","title":"字典管理","value":"/sysDictType/index","icon":null,"weight":12,"children":[],"pid":"1264622039642255961"},{"id":"1264622039642256271","parentId":"1264622039642255961","title":"接口文档","value":"/doc.html","icon":null,"weight":13,"children":[],"pid":"1264622039642255961"}],"pid":"0"},{"id":"1264622039642256281","parentId":"0","title":"日志管理","value":"javascript:;","icon":"layui-icon-log","weight":5,"children":[{"id":"1264622039642256291","parentId":"1264622039642256281","title":"访问日志","value":"/sysVisLog/index","icon":null,"weight":14,"children":[],"pid":"1264622039642256281"},{"id":"1264622039642256321","parentId":"1264622039642256281","title":"操作日志","value":"/sysOpLog/index","icon":null,"weight":15,"children":[],"pid":"1264622039642256281"}],"pid":"0"},{"id":"1264622039642256351","parentId":"0","title":"系统监控","value":"javascript:;","icon":"layui-icon-chart-screen","weight":6,"children":[{"id":"1264622039642256361","parentId":"1264622039642256351","title":"服务监控","value":"/sysMachine/index","icon":null,"weight":16,"children":[],"pid":"1264622039642256351"},{"id":"1264622039642256381","parentId":"1264622039642256351","title":"在线用户","value":"/sysOnlineUser/index","icon":null,"weight":17,"children":[],"pid":"1264622039642256351"},{"id":"1264622039642256411","parentId":"1264622039642256351","title":"数据监控","value":"/druid","icon":null,"weight":18,"children":[],"pid":"1264622039642256351"}],"pid":"0"},{"id":"1264622039642256421","parentId":"0","title":"通知公告","value":"javascript:;","icon":"layui-icon-speaker","weight":7,"children":[{"id":"1264622039642256431","parentId":"1264622039642256421","title":"公告管理","value":"/sysNotice/index","icon":null,"weight":19,"children":[],"pid":"1264622039642256421"},{"id":"1264622039642256501","parentId":"1264622039642256421","title":"已收公告","value":"/sysNotice/receivedPage","icon":null,"weight":20,"children":[],"pid":"1264622039642256421"}],"pid":"0"},{"id":"1264622039642256521","parentId":"0","title":"文件管理","value":"javascript:;","icon":"layui-icon-file","weight":8,"children":[{"id":"1264622039642256531","parentId":"1264622039642256521","title":"系统文件","value":"/sysFileInfo/index","icon":null,"weight":21,"children":[],"pid":"1264622039642256521"},{"id":"1264622039642256602","parentId":"1264622039642256521","title":"在线文档","value":"/sysFileInfo/onlineIndex","icon":null,"weight":21,"children":[],"pid":"1264622039642256521"}],"pid":"0"},{"id":"1264622039642256721","parentId":"0","title":"系统区域","value":"javascript:;","icon":"layui-icon-console","weight":100,"children":[{"id":"1264622039642256731","parentId":"1264622039642256721","title":"区域管理","value":"/sysArea/index","icon":null,"weight":100,"children":[],"pid":"1264622039642256721"},{"id":"1264622039642256741","parentId":"1264622039642256721","title":"区域选择","value":"/sysArea/select","icon":null,"weight":100,"children":[],"pid":"1264622039642256721"}],"pid":"0"},{"id":"1264622039642256611","parentId":"0","title":"定时任务","value":"javascript:;","icon":"layui-icon-console","weight":100,"children":[{"id":"1264622039642256621","parentId":"1264622039642256611","title":"任务管理","value":"/sysTimers/index","icon":null,"weight":22,"children":[],"pid":"1264622039642256611"}],"pid":"0"}]}],"dataScopes":[],"tenants":null,"enabled":true,"authorities":[],"password":null,"username":"superAdmin","accountNonExpired":true,"credentialsNonExpired":true,"accountNonLocked":true}} \ No newline at end of file diff --git a/jun_pc_web/json/get_department_tree.json b/jun_pc_web/json/get_department_tree.json new file mode 100644 index 000000000..157fb6530 --- /dev/null +++ b/jun_pc_web/json/get_department_tree.json @@ -0,0 +1,308 @@ +{ + "trees": [ + { + "id": 1, + "title": "董事会", + "pid": 0, + "leader_id": 2, + "phone": "13688888888", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526795, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": true, + "parentId": 0, + "name": "董事会", + "children": [ + { + "id": 2, + "title": "人事部", + "pid": 1, + "leader_id": 5, + "phone": "13688888889", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685860088, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": true, + "parentId": 1, + "name": "人事部", + "children": [] + }, + { + "id": 3, + "title": "财务部", + "pid": 1, + "leader_id": 4, + "phone": "13688888898", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685860096, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "财务部", + "children": [] + }, + { + "id": 4, + "title": "市场部", + "pid": 1, + "leader_id": 6, + "phone": "13688888978", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526811, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "市场部", + "children": [] + }, + { + "id": 5, + "title": "销售部", + "pid": 1, + "leader_id": 8, + "phone": "13688889868", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526819, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "销售部", + "children": [ + { + "id": 8, + "title": "销售一部", + "pid": 5, + "leader_id": 23, + "phone": "13688998838", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526824, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 5, + "name": "销售一部", + "children": [] + }, + { + "id": 9, + "title": "销售二部", + "pid": 5, + "leader_id": 24, + "phone": "13688999828", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526828, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 5, + "name": "销售二部", + "children": [] + }, + { + "id": 10, + "title": "销售三部", + "pid": 5, + "leader_id": 25, + "phone": "13688999918", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526833, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 5, + "name": "销售三部", + "children": [] + } + ] + }, + { + "id": 6, + "title": "技术部", + "pid": 1, + "leader_id": 7, + "phone": "13688898858", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526838, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "技术部", + "children": [ + { + "id": 11, + "title": "产品部", + "pid": 6, + "leader_id": 51, + "phone": "13688888886", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526842, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 6, + "name": "产品部", + "children": [] + }, + { + "id": 12, + "title": "设计部", + "pid": 6, + "leader_id": 52, + "phone": "13688888876", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526847, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 6, + "name": "设计部", + "children": [] + }, + { + "id": 13, + "title": "研发部", + "pid": 6, + "leader_id": 53, + "phone": "13688888666", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526852, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 6, + "name": "研发部", + "children": [] + } + ] + }, + { + "id": 7, + "title": "客服部", + "pid": 1, + "leader_id": 9, + "phone": "13688988848", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526857, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 1, + "name": "客服部", + "children": [ + { + "id": 14, + "title": "客服一部", + "pid": 7, + "leader_id": 71, + "phone": "13688888865", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526863, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 7, + "name": "客服一部", + "children": [] + }, + { + "id": 15, + "title": "客服二部", + "pid": 7, + "leader_id": 72, + "phone": "13688888855", + "sort": 0, + "remark": "", + "status": 1, + "create_time": 0, + "update_time": 1685526868, + "checkArr": { + "type": 0, + "isChecked": 0 + }, + "spread": false, + "parentId": 7, + "name": "客服二部", + "children": [] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/get_employee.json b/jun_pc_web/json/get_employee.json new file mode 100644 index 000000000..4150a751c --- /dev/null +++ b/jun_pc_web/json/get_employee.json @@ -0,0 +1,242 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 9, + "did": 7, + "position_id": 6, + "mobile": 13800000008, + "name": "红尘雪", + "nickname": "红尘雪", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_1l2qbjwdci1638067440.png", + "username": "hongchenxue", + "department": "客服部" + }, + { + "id": 71, + "did": 14, + "position_id": 16, + "mobile": 13800000071, + "name": "翠萝寒", + "nickname": "翠萝寒", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_xyvu7m0asg1638071274.png", + "username": "cuiluohan", + "department": "客服一部" + }, + { + "id": 72, + "did": 15, + "position_id": 16, + "mobile": 13800000072, + "name": "夜飞天", + "nickname": "夜飞天", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_o8twf4xnda1638071313.png", + "username": "yefeitian", + "department": "客服二部" + }, + { + "id": 73, + "did": 14, + "position_id": 16, + "mobile": 13800000073, + "name": "剑琅琊", + "nickname": "剑琅琊", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_7jr1ygith41638071360.png", + "username": "jianlangya", + "department": "客服一部" + }, + { + "id": 74, + "did": 14, + "position_id": 16, + "mobile": 13800000074, + "name": "独梦君", + "nickname": "独梦君", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_7k2d9q10m81638071384.png", + "username": "dumengjun", + "department": "客服一部" + }, + { + "id": 75, + "did": 14, + "position_id": 16, + "mobile": 13800000075, + "name": "风霁月", + "nickname": "风霁月", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_9137szunx41638071414.png", + "username": "fengjiyue", + "department": "客服一部" + }, + { + "id": 76, + "did": 14, + "position_id": 16, + "mobile": 13800000076, + "name": "霜叶飞", + "nickname": "霜叶飞", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_irw36xkup71638071446.png", + "username": "shuangyefei", + "department": "客服一部" + }, + { + "id": 77, + "did": 14, + "position_id": 16, + "mobile": 13800000077, + "name": "闻琴语", + "nickname": "闻琴语", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_7vf0tgu2cr1638071467.png", + "username": "wenqinyu", + "department": "客服一部" + }, + { + "id": 78, + "did": 14, + "position_id": 16, + "mobile": 13800000079, + "name": "翠厚生", + "nickname": "翠厚生", + "sex": 1, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_938fgix2sc1638071496.png", + "username": "cuihousheng", + "department": "客服一部" + }, + { + "id": 79, + "did": 14, + "position_id": 16, + "mobile": 13800000080, + "name": "绯羽怨姬", + "nickname": "绯羽怨姬", + "sex": 1, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_8qakfnvtr61638071536.png", + "username": "feiyuyuanji", + "department": "客服一部" + }, + { + "id": 80, + "did": 15, + "position_id": 16, + "mobile": 13800000081, + "name": "小水仙", + "nickname": "小水仙", + "sex": 1, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_fsk7382wv41638071589.png", + "username": "xiaoshuixian", + "department": "客服二部" + }, + { + "id": 81, + "did": 15, + "position_id": 16, + "mobile": 13800000082, + "name": "姒玄英", + "nickname": "姒玄英", + "sex": 1, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_y8sm9xvhwl1638071635.png", + "username": "sixuanying", + "department": "客服二部" + }, + { + "id": 82, + "did": 15, + "position_id": 16, + "mobile": 13800000083, + "name": "仙踪无名", + "nickname": "仙踪无名", + "sex": 1, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_yfircomeaw1638071664.png", + "username": "xianzongwuming", + "department": "客服二部" + }, + { + "id": 83, + "did": 14, + "position_id": 16, + "mobile": 13800000084, + "name": "刹紫烟", + "nickname": "刹紫烟", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_5be3lky96u1638071700.png", + "username": "shaziyan", + "department": "客服一部" + }, + { + "id": 84, + "did": 15, + "position_id": 16, + "mobile": 13800000085, + "name": "凌波影", + "nickname": "凌波影", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_wnzslqxyea1638071737.png", + "username": "lingboying", + "department": "客服二部" + }, + { + "id": 85, + "did": 15, + "position_id": 16, + "mobile": 13800000086, + "name": "鸳鸯镜", + "nickname": "鸳鸯镜", + "sex": 2, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_s4h7op3dir1638071759.png", + "username": "yuanyangjing", + "department": "客服二部" + }, + { + "id": 86, + "did": 15, + "position_id": 16, + "mobile": 13800000087, + "name": "脊令原", + "nickname": "脊令原", + "sex": 1, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_9g7z5x2fiw1638071831.png", + "username": "jilingyuan", + "department": "客服二部" + }, + { + "id": 87, + "did": 15, + "position_id": 16, + "mobile": 13800000088, + "name": "孤星泪", + "nickname": "孤星泪", + "sex": 1, + "status": 1, + "thumb": "\/storage\/avatars\/avatar_256_cxdp8y54901638071856.png", + "username": "guxinglei", + "department": "客服二部" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/get_work_cate.json b/jun_pc_web/json/get_work_cate.json new file mode 100644 index 000000000..4d36501d0 --- /dev/null +++ b/jun_pc_web/json/get_work_cate.json @@ -0,0 +1,64 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "title": "其他", + "status": 1, + "create_time": 1637987189, + "update_time": 0 + }, + { + "id": 2, + "title": "方案策划", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 3, + "title": "撰写文档", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 4, + "title": "需求调研", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 5, + "title": "需求沟通", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 6, + "title": "参加会议", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 7, + "title": "拜访客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + }, + { + "id": 8, + "title": "接待客户", + "status": 1, + "create_time": 1637987199, + "update_time": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/login-record.json b/jun_pc_web/json/login-record.json new file mode 100644 index 000000000..09e6c92ce --- /dev/null +++ b/jun_pc_web/json/login-record.json @@ -0,0 +1,117 @@ +{ + "code": 0, + "msg": "", + "count": 2577, + "data": [ + { + "id": 887, + "userId": 1, + "osName": "Windows 10", + "device": "Windows 10", + "browserType": "Chrome", + "ipAddress": "113.44.121.179", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 886, + "userId": 1, + "osName": "Mac OS X", + "device": "Mac OS X", + "browserType": "Chrome", + "ipAddress": "113.116.50.136", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 885, + "userId": 1, + "osName": "Windows 10", + "device": "Windows 10", + "browserType": "Chrome", + "ipAddress": "110.178.97.34", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 884, + "userId": 1, + "osName": "Windows 8", + "device": "Windows 8", + "browserType": "Chrome", + "ipAddress": "183.226.54.242", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 883, + "userId": 1, + "osName": "Windows 7", + "device": "Windows 7", + "browserType": "Chrome", + "ipAddress": "36.106.66.162", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 882, + "userId": 1, + "osName": "Windows 10", + "device": "Windows 10", + "browserType": "Chrome", + "ipAddress": "182.109.237.54", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 881, + "userId": 1, + "osName": "Windows 7", + "device": "Windows 7", + "browserType": "Firefox", + "ipAddress": "125.70.176.119", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 880, + "userId": 1, + "osName": "Mac OS X", + "device": "Mac OS X", + "browserType": "Chrome", + "ipAddress": "124.16.4.11", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 879, + "userId": 1, + "osName": "Windows 10", + "device": "Windows 10", + "browserType": "Chrome", + "ipAddress": "182.242.114.157", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + }, + { + "id": 878, + "userId": 1, + "osName": "Windows 7", + "device": "Windows 7", + "browserType": "Chrome", + "ipAddress": "113.116.53.92", + "createTime": "2019/03/29 16:38:03", + "username": "admin", + "nickName": "管理员" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/menu.json b/jun_pc_web/json/menu.json new file mode 100644 index 000000000..7cbece251 --- /dev/null +++ b/jun_pc_web/json/menu.json @@ -0,0 +1,919 @@ +[ + { + "id": 1, + "title": "工作台", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 1001, + "title": "办公工作台", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/index/main.html" + } + ] + }, + { + "id": 102, + "title": "系统管理NEW", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 1002, + "title": "菜单权限配置", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/menus/menu_list.html" + }, + { + "id": 1003, + "title": "字典管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/sysdict/list.html" + }, + { + "id": 1003, + "title": "用户管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/users/user_list.html" + }, + { + "id": 1003, + "title": "角色管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/roles/role_list.html" + }, + { + "id": 1003, + "title": "组织机构", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/depts/dept_list.html" + }, + { + "id": 1003, + "title": "代码生成", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/generate/index.html" + } + , + { + "id": 1003, + "title": "代码生成V1", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/code/code.html" + } + , + { + "id": 1003, + "title": "自定义SQL", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/sql/index.html" + } + , + { + "id": 1003, + "title": "自定义SQL2", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "sys/code/sql_new.html" + } + + + ] + }, + { + "id": 2, + "title": "系统管理", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 1002, + "title": "系统配置", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/conf/index.html" + } + , + { + "id": 1003, + "title": "功能模块", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/module/index.html" + } + , + { + "id": 1004, + "title": "功能节点", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/menu/index.html" + } + , + { + "id": 1004, + "title": "角色权限", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/role/index.html" + }, + { + "id": 1004, + "title": "数据权限", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/dataauth/index.html" + }, + { + "id": 1004, + "title": "操作日志", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/log/index.html" + }, + { + "id": 1004, + "title": "备份数据", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/database/database.html" + }, + { + "id": 1004, + "title": "还原数据", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/database/backuplist.html" + } + ] + }, + { + "id": 3, + "title": "基础数据", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 2002, + "title": "审批类型", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/cate/flow_type.html" + } + , + { + "id": 2003, + "title": "审批流程", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/flow/index.html" + } + , + { + "id": 2004, + "title": "报销类型", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/cate/expense_cate.html" + } + , + { + "id": 2005, + "title": "费用类型", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/cate/cost_cate.html" + } + , + { + "id": 2006, + "title": "企业主体", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/cate/subject.html" + }, + { + "id": 2007, + "title": "行业类型", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/cate/industry_cate.html" + }, + { + "id": 2008, + "title": "工作类别", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/cate/work_cate.html" + }, + { + "id": 2009, + "title": "服务类型", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/cate/services_cate.html" + }, + { + "id": 2010, + "title": "关键字", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/keywords/index.html" + }, + { + "id": 2011, + "title": "附件管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/files/index.html" + } + ] + }, + { + "id": 4, + "title": "人力资源", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 3001, + "title": "部门架构", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "user/department/index.html" + }, + { + "id": 3002, + "title": "岗位职称", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "user/position/index.html" + }, + { + "id": 3003, + "title": "企业员工", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "user/user/index.html" + }, + { + "id": 3004, + "title": "人事调动", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "user/personal/change.html" + }, + { + "id": 3005, + "title": "离职档案", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "user/personal/leave.html" + } + ] + }, + { + "id": 5, + "title": "行政管理", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 5001, + "title": "印章管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "adm/seal/seal_cate.html" + }, + { + "id": 5002, + "title": "车辆管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "adm/car/car_cate.html" + }, + { + "id": 5003, + "title": "会议室管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "adm/meeting/meeting_cate.html" + } + ] + }, + { + "id": 6, + "title": "企业公告", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 6001, + "title": "公告类型", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "note/index/note_cate.html" + }, + { + "id": 6002, + "title": "公告列表", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "note/index/index.html" + } + ] + }, + { + "id": 7, + "title": "办公审批", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 7001, + "title": "我发起的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/approve/index.html" + }, + { + "id": 7002, + "title": "我处理的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/approve/list.html" + }, + { + "id": 7002, + "title": "抄送我的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/approve/copy.html" + } + ] + }, + { + "id": 8, + "title": "日常办公", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 8001, + "title": "日程安排", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/plan/index.html" + }, + { + "id": 8002, + "title": "日程日历", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/plan/calendar.html" + }, + { + "id": 8003, + "title": "工作记录", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/schedule/index.html" + }, + { + "id": 8004, + "title": "工作日历", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/schedule/calendar.html" + }, + { + "id": 8005, + "title": "工作汇报", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "oa/work/index.html" + } + ] + }, + { + "id": 9, + "title": "财务管理", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 9, + "title": "报销管理", + "type": 0, + "href": "", + "children": [ + { + "id": 90011, + "title": "我申请的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/expense/index.html" + }, + { + "id": 90021, + "title": "我处理的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/expense/list.html" + }, + { + "id": 90031, + "title": "抄送我的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/expense/copy.html" + }, + { + "id": 90041, + "title": "打款(财务专用)", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/expense/checkedlist.html" + } + ] + }, + { + "id": 9, + "title": "发票管理", + "type": 0, + "href": "", + "children": [ + { + "id": 90012, + "title": "我申请的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/invoice/index.html" + }, + { + "id": 90022, + "title": "我处理的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/invoice/list.html" + }, + { + "id": 90032, + "title": "抄送我的", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/invoice/copy.html" + }, + { + "id": 90042, + "title": "开票(财务专用)", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/invoice/checkedlist.html" + } + ] + }, + { + "id": 90033, + "title": "到账管理", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "finance/income/index.html" + } + ] + }, + { + "id": 10, + "title": "客户管理", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 10001, + "title": "客户等级", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/grade/index.html" + }, + { + "id": 10002, + "title": "客户渠道", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/source/index.html" + }, + { + "id": 10003, + "title": "抢客宝", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/index/rush.html" + }, + { + "id": 10004, + "title": "客户列表", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/index/index.html" + }, + { + "id": 10005, + "title": "公海客户", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/index/sea.html" + }, + { + "id": 10006, + "title": "废弃客户", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/index/trash.html" + }, + { + "id": 10007, + "title": "客户联系人", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/contact/index.html" + }, + { + "id": 10008, + "title": "销售机会", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/chance/index.html" + }, + { + "id": 10009, + "title": "跟进记录", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "customer/trace/index.html" + } + ] + }, + { + "id": 11, + "title": "合同管理", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 11001, + "title": "合同类别", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "contract/cate/cate.html" + }, + { + "id": 11002, + "title": "合同列表", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "contract/index/index.html" + }, + { + "id": 11003, + "title": "合同归档", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "contract/index/archive.html" + } + ] + }, + { + "id": 12, + "title": "项目管理", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 12001, + "title": "项目列表", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "project/index/index.html" + }, + { + "id": 12002, + "title": "任务列表", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "project/task/index.html" + }, + { + "id": 12003, + "title": "任务工时", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "project/task/task_time.html" + }, + { + "id": 12003, + "title": "文档列表", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "project/document/index.html" + } + ] + }, + { + "id": 13, + "title": "知识文章", + "icon": "icon-jichupeizhi", + "type": 0, + "href": "", + "children": [ + { + "id": 13001, + "title": "知识类型", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "article/cate/cate.html" + }, + { + "id": 12002, + "title": "共享知识", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "article/index/index.html" + }, + { + "id": 12003, + "title": "个人知识", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "article/index/list.html" + } + ] + }, + + + + { + "id": 9999, + "title": "------分割线------", + "icon": "bi-house", + "type": 0, + "target": "_iframe", + "href": "home/home/main.html" + }, + { + "id": 1, + "title": "推荐页面", + "icon": "bi-house", + "type": 0, + "href": "", + "children": [ + { + "id": 1001, + "title": "勾股main", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "home/home/main.html" + }, + + { + "id": 11, + "title": "勾股DEV", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "_view/home/gougudev.html" + }, + { + "id": 12, + "title": "勾股OA", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "_view/home/gouguoa.html" + }, + + { + "id": 13, + "title": "勾股BLOG", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/home/gougublog.html" + } , { + "id": 14, + "title": "数据统计", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/home/analysis.html" + }, { + "id": 15, + "title": "内嵌页面", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "https://cn.bing.com" + }] + },{ + "id": 2, + "title": "基础组件", + "icon": "bi-box", + "type": 0, + "children": [ + { + "id": 201, + "title": "Layout 布局", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/base/layout.html" + }, + { + "id": 202, + "title": "Button 按钮", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/base/button.html" + }, { + "id": 203, + "title": "Icon 图标", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "assets/icon/index.html" + }, { + "id": 204, + "title": "Image 图片", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/base/image.html" + },{ + "id": 205, + "title": "Badge 徽标数", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/base/badge.html" + }, { + "id": 206, + "title": "Tag 标签", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/base/tag.html" + }] + }, { + "id": 3, + "title": "表单组件", + "icon": "bi-card-text", + "type": 0, + "children": [{ + "id": 301, + "title": "普通表单", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/form/index.html" + },{ + "id": 302, + "title": "表单校验", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/form/verify.html" + },{ + "id": 303, + "title": "富文本编辑器", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/form/tinymce.html" + },{ + "id": 304, + "title": "Mardown编辑器", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/form/editormd.html" + }] + }, { + "id": 4, + "title": "数据组件", + "icon": "bi-layers", + "type": 0, + "children": [{ + "id": 401, + "title": "数据表格", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/table/index.html" + },{ + "id": 402, + "title": "树形表格", + "icon": "", + "type": 1, + "target": "_iframe", + "href": "view/table/tree_table.html" + }] + } +] \ No newline at end of file diff --git a/jun_pc_web/json/note.json b/jun_pc_web/json/note.json new file mode 100644 index 000000000..1817b811c --- /dev/null +++ b/jun_pc_web/json/note.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[{"id":8,"title":"项目管理协作系统,勾股DEV2.0开源发布","create_time":"2022-03-21 :16:16","cate_title":"普通公告"},{"id":7,"title":"项目管理系统——勾股DEV即将开源发布","create_time":"2022-03-21 :16:16","cate_title":"普通公告"},{"id":6,"title":"项目管理系统——勾股DEV开始内测","create_time":"2022-03-21 :16:15","cate_title":"紧急公告"},{"id":5,"title":"勾股OA2.0发布啦","create_time":"2022-02-13 :23:44","cate_title":"紧急公告"},{"id":3,"title":"关于员工2021年度个税抵扣问题","create_time":"2021-11-28 :16:54","cate_title":"普通公告"},{"id":2,"title":"公司全体员工开始使用勾股OA办公系统","create_time":"2021-11-28 :16:12","cate_title":"紧急公告"},{"id":1,"title":"欢迎使用勾股OA办公系统","create_time":"2021-11-27 :11:49","cate_title":"普通公告"}]} \ No newline at end of file diff --git a/jun_pc_web/json/oa_data.json b/jun_pc_web/json/oa_data.json new file mode 100644 index 000000000..f4e7aaa25 --- /dev/null +++ b/jun_pc_web/json/oa_data.json @@ -0,0 +1 @@ +{"code":0,"msg":"","url":"","data":{"data_first":[17,51,55,20,21,14,24,23,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"data_second":[62,125,136,20,87,18,51,20,37,44,50,35,23,72,33,30,46,29,212,17,19,36,31,96],"data_three":{"2021-07-01":117,"2021-07-02":113,"2021-07-03":55,"2021-07-04":114,"2021-07-05":84,"2021-07-06":42,"2021-07-07":47,"2021-07-08":93,"2021-07-09":63,"2021-07-10":36,"2021-07-11":71,"2021-07-12":45,"2021-07-13":72,"2021-07-14":129,"2021-07-15":48,"2021-07-16":63,"2021-07-17":83,"2021-07-18":56,"2021-07-19":80,"2021-07-20":86,"2021-07-21":104,"2021-07-22":105,"2021-07-23":45,"2021-07-24":42,"2021-07-25":53,"2021-07-26":89,"2021-07-27":116,"2021-07-28":91,"2021-07-29":93,"2021-07-30":68,"2021-07-31":70,"2021-08-01":73,"2021-08-02":67,"2021-08-03":100,"2021-08-04":112,"2021-08-05":84,"2021-08-06":68,"2021-08-07":110,"2021-08-08":74,"2021-08-09":86,"2021-08-10":185,"2021-08-11":76,"2021-08-12":120,"2021-08-13":97,"2021-08-14":108,"2021-08-15":68,"2021-08-16":268,"2021-08-17":186,"2021-08-18":201,"2021-08-19":209,"2021-08-20":153,"2021-08-21":189,"2021-08-22":106,"2021-08-23":121,"2021-08-24":143,"2021-08-25":135,"2021-08-26":154,"2021-08-27":157,"2021-08-28":106,"2021-08-29":129,"2021-08-30":147,"2021-08-31":269,"2021-09-01":232,"2021-09-02":125,"2021-09-03":252,"2021-09-04":133,"2021-09-05":102,"2021-09-06":221,"2021-09-07":172,"2021-09-08":212,"2021-09-09":286,"2021-09-10":136,"2021-09-11":372,"2021-09-12":189,"2021-09-13":136,"2021-09-14":178,"2021-09-15":201,"2021-09-16":165,"2021-09-17":258,"2021-09-18":176,"2021-09-19":193,"2021-09-20":157,"2021-09-21":178,"2021-09-22":122,"2021-09-23":155,"2021-09-24":212,"2021-09-25":185,"2021-09-26":114,"2021-09-27":208,"2021-09-28":365,"2021-09-29":176,"2021-09-30":206,"2021-10-01":138,"2021-10-02":219,"2021-10-03":208,"2021-10-04":217,"2021-10-05":217,"2021-10-06":156,"2021-10-07":364,"2021-10-08":194,"2021-10-09":170,"2021-10-10":168,"2021-10-11":167,"2021-10-12":229,"2021-10-13":168,"2021-10-14":217,"2021-10-15":142,"2021-10-16":267,"2021-10-17":340,"2021-10-18":211,"2021-10-19":211,"2021-10-20":211,"2021-10-21":215,"2021-10-22":161,"2021-10-23":337,"2021-10-24":244,"2021-10-25":1082,"2021-10-26":253,"2021-10-27":296,"2021-10-28":178,"2021-10-29":236,"2021-10-30":178,"2021-10-31":195,"2021-11-01":398,"2021-11-02":218,"2021-11-03":156,"2021-11-04":179,"2021-11-05":218,"2021-11-06":183,"2021-11-07":161,"2021-11-08":163,"2021-11-09":243,"2021-11-10":209,"2021-11-11":257,"2021-11-12":182,"2021-11-13":178,"2021-11-14":194,"2021-11-15":288,"2021-11-16":245,"2021-11-17":186,"2021-11-18":338,"2021-11-19":276,"2021-11-20":132,"2021-11-21":220,"2021-11-22":321,"2021-11-23":289,"2021-11-24":314,"2021-11-25":290,"2021-11-26":236,"2021-11-27":331,"2021-11-28":216,"2021-11-29":266,"2021-11-30":274,"2021-12-01":359,"2021-12-02":398,"2021-12-03":328,"2021-12-04":404,"2021-12-05":400,"2021-12-06":404,"2021-12-07":402,"2021-12-08":349,"2021-12-09":527,"2021-12-10":569,"2021-12-11":522,"2021-12-12":368,"2021-12-13":331,"2021-12-14":490,"2021-12-15":520,"2021-12-16":393,"2021-12-17":400,"2021-12-18":302,"2021-12-19":368,"2021-12-20":445,"2021-12-21":411,"2021-12-22":389,"2021-12-23":483,"2021-12-24":445,"2021-12-25":533,"2021-12-26":463,"2021-12-27":450,"2021-12-28":459,"2021-12-29":431,"2021-12-30":317,"2021-12-31":523,"2022-01-01":313,"2022-01-02":384,"2022-01-03":303,"2022-01-04":464,"2022-01-05":614,"2022-01-06":571,"2022-01-07":459,"2022-01-08":317,"2022-01-09":314,"2022-01-10":316,"2022-01-11":446,"2022-01-12":558,"2022-01-13":542,"2022-01-14":384,"2022-01-15":411,"2022-01-16":447,"2022-01-17":498,"2022-01-18":405,"2022-01-19":846,"2022-01-20":607,"2022-01-21":401,"2022-01-22":338,"2022-01-23":395,"2022-01-24":495,"2022-01-25":328,"2022-01-26":370,"2022-01-27":289,"2022-01-28":309,"2022-01-29":415,"2022-01-30":316,"2022-01-31":367,"2022-02-01":262,"2022-02-02":407,"2022-02-03":384,"2022-02-04":287,"2022-02-05":315,"2022-02-06":278,"2022-02-07":307,"2022-02-08":450,"2022-02-09":426,"2022-02-10":579,"2022-02-11":596,"2022-02-12":373,"2022-02-13":419,"2022-02-14":580,"2022-02-15":388,"2022-02-16":442,"2022-02-17":694,"2022-02-18":869,"2022-02-19":557,"2022-02-20":620,"2022-02-21":604,"2022-02-22":466,"2022-02-23":515,"2022-02-24":692,"2022-02-25":428,"2022-02-26":425,"2022-02-27":325,"2022-02-28":560,"2022-03-01":834,"2022-03-02":639,"2022-03-03":554,"2022-03-04":752,"2022-03-05":542,"2022-03-06":1299,"2022-03-07":1081,"2022-03-08":1093,"2022-03-09":1005,"2022-03-10":1204,"2022-03-11":986,"2022-03-12":509,"2022-03-13":490,"2022-03-14":664,"2022-03-15":654,"2022-03-16":620,"2022-03-17":569,"2022-03-18":458,"2022-03-19":460,"2022-03-20":386,"2022-03-21":570,"2022-03-22":379,"2022-03-23":462,"2022-03-24":642,"2022-03-25":705,"2022-03-26":1021,"2022-03-27":775,"2022-03-28":629,"2022-03-29":660,"2022-03-30":642,"2022-03-31":978,"2022-04-01":1065,"2022-04-02":796,"2022-04-03":847,"2022-04-04":626,"2022-04-05":715,"2022-04-06":896,"2022-04-07":1332,"2022-04-08":793,"2022-04-09":438,"2022-04-10":602,"2022-04-11":717,"2022-04-12":704,"2022-04-13":605,"2022-04-14":1096,"2022-04-15":586,"2022-04-16":671,"2022-04-17":607,"2022-04-18":815,"2022-04-19":565,"2022-04-20":738,"2022-04-21":681,"2022-04-22":718,"2022-04-23":641,"2022-04-24":750,"2022-04-25":994,"2022-04-26":932,"2022-04-27":793,"2022-04-28":816,"2022-04-29":1023,"2022-04-30":629,"2022-05-01":985,"2022-05-02":869,"2022-05-03":706,"2022-05-04":850,"2022-05-05":1066,"2022-05-06":1005,"2022-05-07":814,"2022-05-08":1052,"2022-05-09":843,"2022-05-10":1185,"2022-05-11":999,"2022-05-12":804,"2022-05-13":921,"2022-05-14":997,"2022-05-15":887,"2022-05-16":1252,"2022-05-17":856,"2022-05-18":1019,"2022-05-19":1588,"2022-05-20":1019,"2022-05-21":1275,"2022-05-22":620,"2022-05-23":1162,"2022-05-24":1471,"2022-05-25":1636,"2022-05-26":235}}} \ No newline at end of file diff --git a/jun_pc_web/json/ok.json b/jun_pc_web/json/ok.json new file mode 100644 index 000000000..3b3246ae9 --- /dev/null +++ b/jun_pc_web/json/ok.json @@ -0,0 +1 @@ +{"msg":"操作成功","code":200} \ No newline at end of file diff --git a/jun_pc_web/json/organization.json b/jun_pc_web/json/organization.json new file mode 100644 index 000000000..6a961eb85 --- /dev/null +++ b/jun_pc_web/json/organization.json @@ -0,0 +1,139 @@ +{ + "code": 0, + "msg": "", + "count": 12, + "data": [ + { + "organizationId": 1, + "parentId": 0, + "organizationName": "某某公司", + "organizationFullName": "武汉某某科技有限公司", + "organizationType": 1, + "sortNumber": 1, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 2, + "parentId": 1, + "organizationName": "研发部", + "organizationFullName": "研发部", + "organizationType": 3, + "sortNumber": 2, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 3, + "parentId": 2, + "organizationName": "高教组", + "organizationFullName": "高等教育行业项目组", + "organizationType": 4, + "sortNumber": 3, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 4, + "parentId": 2, + "organizationName": "政务组", + "organizationFullName": "政务行业项目组", + "organizationType": 4, + "sortNumber": 4, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 5, + "parentId": 2, + "organizationName": "制造组", + "organizationFullName": "生产制造行业项目组", + "organizationType": 4, + "sortNumber": 5, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 6, + "parentId": 2, + "organizationName": "仿真组", + "organizationFullName": "虚拟仿真行业项目组", + "organizationType": 4, + "sortNumber": 6, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 7, + "parentId": 1, + "organizationName": "测试部", + "organizationFullName": "测试部", + "organizationType": 3, + "sortNumber": 7, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 8, + "parentId": 1, + "organizationName": "设计部", + "organizationFullName": "设计部", + "organizationType": 3, + "sortNumber": 8, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 9, + "parentId": 1, + "organizationName": "市场部", + "organizationFullName": "设计部", + "organizationType": 3, + "sortNumber": 9, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 10, + "parentId": 9, + "organizationName": "规划组", + "organizationFullName": "产品规划组", + "organizationType": 4, + "sortNumber": 10, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 11, + "parentId": 9, + "organizationName": "售前组", + "organizationFullName": "产品售前组", + "organizationType": 4, + "sortNumber": 11, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + }, + { + "organizationId": 12, + "parentId": 9, + "organizationName": "售后组", + "organizationFullName": "产品售后组", + "organizationType": 4, + "sortNumber": 12, + "comments": "", + "createTime": "2020/03/06 01:27:00", + "updateTime": "2020/03/06 01:27:00" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/role-auth-tree.json b/jun_pc_web/json/role-auth-tree.json new file mode 100644 index 000000000..9938395fc --- /dev/null +++ b/jun_pc_web/json/role-auth-tree.json @@ -0,0 +1,97 @@ +{ + "code": 200, + "msg": "", + "data": [ + { + "name": "系统管理 ", + "checked": true, + "pId": -1, + "id": 1, + "open": true + }, + { + "name": "用户管理 ", + "checked": true, + "pId": 1, + "id": 2, + "open": true + }, + { + "name": "查看用户 user:view", + "checked": true, + "pId": 2, + "id": 3, + "open": true + }, + { + "name": "更新用户 user:update", + "checked": true, + "pId": 2, + "id": 4, + "open": true + }, + { + "name": "角色管理 ", + "checked": true, + "pId": 1, + "id": 5, + "open": true + }, + { + "name": "查看角色 role:view", + "checked": true, + "pId": 5, + "id": 6, + "open": true + }, + { + "name": "更新角色 role:update", + "checked": true, + "pId": 5, + "id": 7, + "open": true + }, + { + "name": "权限管理 ", + "checked": true, + "pId": 1, + "id": 8, + "open": true + }, + { + "name": "查看权限 authorities:view", + "checked": true, + "pId": 8, + "id": 9, + "open": true + }, + { + "name": "更新权限 authorities:update", + "checked": true, + "pId": 8, + "id": 10, + "open": true + }, + { + "name": "登录日志 loginRecord:view", + "checked": true, + "pId": 1, + "id": 11, + "open": true + }, + { + "name": "系统监控 ", + "checked": true, + "pId": -1, + "id": 12, + "open": true + }, + { + "name": "Druid监控 ", + "checked": true, + "pId": 12, + "id": 13, + "open": true + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/role.json b/jun_pc_web/json/role.json new file mode 100644 index 000000000..7c13b7b33 --- /dev/null +++ b/jun_pc_web/json/role.json @@ -0,0 +1,34 @@ +{ + "code": 0, + "msg": "", + "count": 3, + "data": [ + { + "roleId": 1, + "roleName": "管理员", + "comments": "系统管理员", + "roleCode": "admin", + "isDelete": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03" + }, + { + "roleId": 2, + "roleName": "普通用户", + "comments": "系统普通用户", + "roleCode": "user", + "isDelete": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03" + }, + { + "roleId": 3, + "roleName": "游客", + "comments": "系统游客", + "roleCode": "guest", + "isDelete": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/side.json b/jun_pc_web/json/side.json new file mode 100644 index 000000000..5c5f8d04c --- /dev/null +++ b/jun_pc_web/json/side.json @@ -0,0 +1,40 @@ +{ + "code": 200, + "msg": "", + "data": [ + { + "name": "Dashboard", + "icon": "layui-icon layui-icon-home", + "url": "javascript:;", + "subMenus": [ + { + "name": "控制台", + "url": "../console/console.html" + }, + { + "name": "分析页", + "url": "../console/dashboard.html" + } + ] + }, + { + "name": "系统管理", + "icon": "layui-icon layui-icon-set", + "url": "javascript:;", + "subMenus": [ + { + "name": "用户管理", + "url": "../system/user.html" + }, + { + "name": "角色管理", + "url": "../system/role.html" + }, + { + "name": "登录日志", + "url": "../system/login-record.html" + } + ] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/table.json b/jun_pc_web/json/table.json new file mode 100644 index 000000000..9fb71a179 --- /dev/null +++ b/jun_pc_web/json/table.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":46,"data":[{"id":1044,"title":"任务点击完成的时候,完成进度同步改为100%","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"1.0","end_time":"2022-05-15","over_time":0,"director_uid":5,"assist_admin_ids":"4","cate":5,"type":4,"is_bug":1,"priority":2,"flow_status":1,"done_ratio":0,"create_time":1652611360,"update_time":1652611463,"delete_time":0,"director_name":"李工","cate_name":"测试相关","type_name":"缺陷","assist_admin_names":"勾股技术","delay":10,"priority_name":"中","flow_name":"未开始"},{"id":1043,"title":"各个模块的描述详情阅读体验优化","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"3.0","end_time":"2022-05-15","over_time":0,"director_uid":8,"assist_admin_ids":"3,6","cate":4,"type":3,"is_bug":0,"priority":1,"flow_status":1,"done_ratio":0,"create_time":1652526294,"update_time":0,"delete_time":0,"director_name":"前端大神","cate_name":"技术开发","type_name":"研发","assist_admin_names":"黄玉龙,欧阳产品","delay":10,"priority_name":"低","flow_name":"未开始"},{"id":1024,"title":"员工评论的回复,展现的不清晰","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"5.0","end_time":"2022-05-16","over_time":0,"director_uid":4,"assist_admin_ids":"3,5","cate":4,"type":4,"is_bug":1,"priority":1,"flow_status":1,"done_ratio":0,"create_time":1650361588,"update_time":1652610966,"delete_time":0,"director_name":"勾股技术","cate_name":"技术开发","type_name":"缺陷","assist_admin_names":"黄玉龙,李工","delay":9,"priority_name":"低","flow_name":"未开始"},{"id":1023,"title":"添加工作记录中的年月日,应该有默认值","project_id":1001,"test_id":0,"admin_id":5,"plan_hours":"3.0","end_time":"2022-04-27","over_time":0,"director_uid":4,"assist_admin_ids":"6,5","cate":4,"type":4,"is_bug":1,"priority":1,"flow_status":1,"done_ratio":0,"create_time":1650361506,"update_time":1652610978,"delete_time":0,"director_name":"勾股技术","cate_name":"技术开发","type_name":"缺陷","assist_admin_names":"李工,欧阳产品","delay":28,"priority_name":"低","flow_name":"未开始"},{"id":1009,"title":"勾股DEV使用文档撰写","project_id":1005,"test_id":0,"admin_id":6,"plan_hours":"5.0","end_time":"2022-05-31","over_time":0,"director_uid":6,"assist_admin_ids":"3","cate":5,"type":1,"is_bug":0,"priority":1,"flow_status":1,"done_ratio":0,"create_time":1650014918,"update_time":1652670055,"delete_time":0,"director_name":"欧阳产品","cate_name":"测试相关","type_name":"需求","assist_admin_names":"黄玉龙","delay":0,"priority_name":"低","flow_name":"未开始"},{"id":1008,"title":"勾股DEV产品文档撰写","project_id":1005,"test_id":0,"admin_id":6,"plan_hours":"5.0","end_time":"2022-05-31","over_time":0,"director_uid":6,"assist_admin_ids":"3","cate":3,"type":1,"is_bug":0,"priority":1,"flow_status":1,"done_ratio":0,"create_time":1650014863,"update_time":1652611114,"delete_time":0,"director_name":"欧阳产品","cate_name":"UI设计","type_name":"需求","assist_admin_names":"黄玉龙","delay":0,"priority_name":"低","flow_name":"未开始"},{"id":1005,"title":"工作任务日历功能开发","project_id":1005,"test_id":0,"admin_id":6,"plan_hours":"8.0","end_time":"2022-05-16","over_time":0,"director_uid":6,"assist_admin_ids":"3","cate":3,"type":1,"is_bug":0,"priority":1,"flow_status":1,"done_ratio":0,"create_time":1650012943,"update_time":1652611144,"delete_time":0,"director_name":"欧阳产品","cate_name":"UI设计","type_name":"需求","assist_admin_names":"黄玉龙","delay":9,"priority_name":"低","flow_name":"未开始"},{"id":1045,"title":"工作记录关联项目计划功能开发","project_id":1006,"test_id":0,"admin_id":2,"plan_hours":"56.0","end_time":"2022-05-20","over_time":0,"director_uid":2,"assist_admin_ids":"","cate":4,"type":1,"is_bug":0,"priority":2,"flow_status":2,"done_ratio":0,"create_time":1652682450,"update_time":1652682526,"delete_time":0,"director_name":"勾股挨踢","cate_name":"技术开发","type_name":"需求","assist_admin_names":"-","delay":5,"priority_name":"中","flow_name":"进行中"},{"id":1014,"title":"系统消息模板制定","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"5.0","end_time":"2022-05-10","over_time":0,"director_uid":3,"assist_admin_ids":"2","cate":2,"type":1,"is_bug":0,"priority":1,"flow_status":2,"done_ratio":0,"create_time":1650209440,"update_time":1651884253,"delete_time":0,"director_name":"黄玉龙","cate_name":"产品原型","type_name":"需求","assist_admin_names":"勾股挨踢","delay":15,"priority_name":"低","flow_name":"进行中"},{"id":1042,"title":"各个模块的编辑权限测试","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"2.0","end_time":"2022-05-14","over_time":1652630640,"director_uid":3,"assist_admin_ids":"4,5,8","cate":5,"type":4,"is_bug":0,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1652526200,"update_time":1652630643,"delete_time":0,"director_name":"黄玉龙","cate_name":"测试相关","type_name":"缺陷","assist_admin_names":"勾股技术,李工,前端大神","delay":2,"priority_name":"高","flow_name":"已完成"},{"id":1041,"title":"工作台知识库部分新增阅读数","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"1.0","end_time":"2022-05-14","over_time":1652603838,"director_uid":5,"assist_admin_ids":"3","cate":4,"type":1,"is_bug":0,"priority":2,"flow_status":3,"done_ratio":100,"create_time":1652526020,"update_time":1652603838,"delete_time":0,"director_name":"李工","cate_name":"技术开发","type_name":"需求","assist_admin_names":"黄玉龙","delay":1,"priority_name":"中","flow_name":"已完成"},{"id":1040,"title":"工作台的我的工作情况数据有问题","project_id":1001,"test_id":0,"admin_id":3,"plan_hours":"1.0","end_time":"2022-05-14","over_time":1652540198,"director_uid":4,"assist_admin_ids":"3","cate":5,"type":4,"is_bug":1,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1652525739,"update_time":1652540242,"delete_time":0,"director_name":"勾股技术","cate_name":"测试相关","type_name":"缺陷","assist_admin_names":"黄玉龙","delay":0,"priority_name":"高","flow_name":"已完成"},{"id":1039,"title":"任务详情缺少任务性质字段","project_id":1001,"test_id":0,"admin_id":3,"plan_hours":"1.0","end_time":"2022-05-14","over_time":1652610327,"director_uid":4,"assist_admin_ids":"3,7,5,8","cate":5,"type":4,"is_bug":1,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1652525568,"update_time":1652610390,"delete_time":0,"director_name":"勾股技术","cate_name":"测试相关","type_name":"缺陷","assist_admin_names":"黄玉龙,李工,图小样,前端大神","delay":1,"priority_name":"高","flow_name":"已完成"},{"id":1038,"title":"工时功能模块完善","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"8.0","end_time":"2022-05-12","over_time":1652522338,"director_uid":5,"assist_admin_ids":"3,4,6","cate":4,"type":1,"is_bug":0,"priority":1,"flow_status":3,"done_ratio":100,"create_time":1652286481,"update_time":1652522338,"delete_time":0,"director_name":"李工","cate_name":"技术开发","type_name":"需求","assist_admin_names":"黄玉龙,勾股技术,欧阳产品","delay":2,"priority_name":"低","flow_name":"已完成"},{"id":1037,"title":"二期项目模块修改调整","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"8.0","end_time":"2022-05-09","over_time":1652286160,"director_uid":4,"assist_admin_ids":"3,4,2,5,6","cate":4,"type":1,"is_bug":0,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1652027697,"update_time":1652286160,"delete_time":0,"director_name":"勾股技术","cate_name":"技术开发","type_name":"需求","assist_admin_names":"勾股挨踢,黄玉龙,勾股技术,李工,欧阳产品","delay":3,"priority_name":"高","flow_name":"已完成"},{"id":1036,"title":"二期的任务模块修改调整","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"5.0","end_time":"2022-05-07","over_time":1652521419,"director_uid":5,"assist_admin_ids":"4,6,2,3","cate":4,"type":1,"is_bug":0,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1651852559,"update_time":1652521419,"delete_time":0,"director_name":"李工","cate_name":"技术开发","type_name":"需求","assist_admin_names":"勾股挨踢,黄玉龙,勾股技术,欧阳产品","delay":7,"priority_name":"高","flow_name":"已完成"},{"id":1035,"title":"二期的产品模块修改调整","project_id":1001,"test_id":0,"admin_id":6,"plan_hours":"8.0","end_time":"2022-05-08","over_time":1651890060,"director_uid":4,"assist_admin_ids":"5,4,3,6,2","cate":4,"type":1,"is_bug":0,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1651807628,"update_time":1651890060,"delete_time":0,"director_name":"勾股技术","cate_name":"技术开发","type_name":"需求","assist_admin_names":"勾股挨踢,黄玉龙,勾股技术,李工,欧阳产品","delay":0,"priority_name":"高","flow_name":"已完成"},{"id":1034,"title":"优化消息模块的体验","project_id":1000,"test_id":0,"admin_id":6,"plan_hours":"1.0","end_time":"2022-04-27","over_time":1651106437,"director_uid":4,"assist_admin_ids":"","cate":5,"type":1,"is_bug":0,"priority":1,"flow_status":3,"done_ratio":100,"create_time":1651044032,"update_time":1652517225,"delete_time":0,"director_name":"勾股技术","cate_name":"测试相关","type_name":"需求","assist_admin_names":"-","delay":1,"priority_name":"低","flow_name":"已完成"},{"id":1033,"title":"任务列表新增搜索选项,支持搜任务","project_id":1000,"test_id":0,"admin_id":6,"plan_hours":"3.0","end_time":"2022-04-26","over_time":1650991068,"director_uid":4,"assist_admin_ids":"5,6","cate":4,"type":1,"is_bug":0,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1650935192,"update_time":1650991068,"delete_time":0,"director_name":"勾股技术","cate_name":"技术开发","type_name":"需求","assist_admin_names":"李工,欧阳产品","delay":1,"priority_name":"高","flow_name":"已完成"},{"id":1032,"title":"知识库列表页收藏数功能调整","project_id":1000,"test_id":0,"admin_id":6,"plan_hours":"1.0","end_time":"2022-04-25","over_time":1650882059,"director_uid":2,"assist_admin_ids":"","cate":5,"type":2,"is_bug":0,"priority":3,"flow_status":3,"done_ratio":100,"create_time":1650881375,"update_time":1650882061,"delete_time":0,"director_name":"勾股挨踢","cate_name":"测试相关","type_name":"设计","assist_admin_names":"-","delay":0,"priority_name":"高","flow_name":"已完成"}]} \ No newline at end of file diff --git a/jun_pc_web/json/tabletree.json b/jun_pc_web/json/tabletree.json new file mode 100644 index 000000000..9d6fed84e --- /dev/null +++ b/jun_pc_web/json/tabletree.json @@ -0,0 +1 @@ +{"code":0,"msg":"","url":"","data":[{"id":1,"title":"董事会","pid":0,"leader_id":0,"phone":"13688888888","remark":"","status":1,"create_time":0,"update_time":1652951373,"leader":"一页书"},{"id":2,"title":"人事部","pid":1,"leader_id":0,"phone":"13688888889","remark":"","status":1,"create_time":0,"update_time":0,"leader":"素还真"},{"id":3,"title":"财务部","pid":1,"leader_id":0,"phone":"13688888898","remark":"","status":1,"create_time":0,"update_time":0,"leader":"秦假仙"},{"id":4,"title":"市场部","pid":1,"leader_id":0,"phone":"13688888978","remark":"","status":1,"create_time":0,"update_time":0,"leader":"宫无后"},{"id":5,"title":"销售部","pid":1,"leader_id":0,"phone":"13688889868","remark":"","status":1,"create_time":0,"update_time":0,"leader":"香独秀"},{"id":6,"title":"技术部","pid":1,"leader_id":0,"phone":"13688898858","remark":"","status":1,"create_time":0,"update_time":0,"leader":"剑之初"},{"id":7,"title":"客服部","pid":1,"leader_id":0,"phone":"13688988848","remark":"","status":1,"create_time":0,"update_time":0,"leader":"叶小钗"},{"id":8,"title":"销售一部","pid":5,"leader_id":0,"phone":"13688998838","remark":"","status":1,"create_time":0,"update_time":0,"leader":"意琦行"},{"id":9,"title":"销售二部","pid":5,"leader_id":0,"phone":"13688999828","remark":"","status":1,"create_time":0,"update_time":0,"leader":"谈无欲"},{"id":10,"title":"销售三部","pid":5,"leader_id":0,"phone":"13688999918","remark":"","status":1,"create_time":0,"update_time":0,"leader":"原无乡"},{"id":11,"title":"产品部","pid":6,"leader_id":0,"phone":"13688888886","remark":"","status":1,"create_time":0,"update_time":0,"leader":"笑剑钝"},{"id":12,"title":"设计部","pid":6,"leader_id":0,"phone":"13688888876","remark":"","status":1,"create_time":0,"update_time":0,"leader":"红华雨"},{"id":13,"title":"研发部","pid":6,"leader_id":0,"phone":"13688888666","remark":"","status":1,"create_time":0,"update_time":0,"leader":"佛剑分说"},{"id":14,"title":"客服一部","pid":7,"leader_id":0,"phone":"13688888865","remark":"","status":1,"create_time":0,"update_time":0,"leader":"剑子仙迹"},{"id":15,"title":"客服二部","pid":7,"leader_id":0,"phone":"13688888855","remark":"","status":1,"create_time":0,"update_time":0,"leader":"倦收天"}]} \ No newline at end of file diff --git a/jun_pc_web/json/tablex-tb2.json b/jun_pc_web/json/tablex-tb2.json new file mode 100644 index 000000000..5853f15f7 --- /dev/null +++ b/jun_pc_web/json/tablex-tb2.json @@ -0,0 +1,97 @@ +{ + "code": 0, + "msg": "", + "count": 26, + "data": [ + { + "serialVersionUID": -6058060376656180793, + "parentName": "权限管理", + "authorityName": "查询所有权限", + "createTime": "2019/03/29 16:38:03", + "authority": "get:/v1/authorities", + "checked": 0, + "sort": 1 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "权限管理", + "authorityName": "给角色添加权限", + "createTime": "2019/03/29 16:38:03", + "authority": "post:/v1/authorities/role", + "checked": 0, + "sort": 2 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "权限管理", + "authorityName": "移除角色权限", + "createTime": "2019/03/29 16:38:03", + "authority": "delete:/v1/authorities/role", + "checked": 0, + "sort": 3 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "权限管理", + "authorityName": "同步权限", + "createTime": "2019/03/29 16:38:03", + "authority": "post:/v1/authorities/sync", + "checked": 0, + "sort": 4 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "菜单管理", + "authorityName": "查询所有菜单", + "createTime": "2019/03/29 16:38:03", + "authority": "get:/v1/menu", + "checked": 0, + "sort": 5 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "菜单管理", + "authorityName": "添加菜单", + "createTime": "2019/03/29 16:38:03", + "authority": "post:/v1/menu", + "checked": 0, + "sort": 6 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "菜单管理", + "authorityName": "修改菜单", + "createTime": "2019/03/29 16:38:03", + "authority": "put:/v1/menu", + "checked": 0, + "sort": 7 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "菜单管理", + "authorityName": "删除菜单", + "createTime": "2019/03/29 16:38:03", + "authority": "delete:/v1/menu/{id}", + "checked": 0, + "sort": 8 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "客户端管理", + "authorityName": "查询所有客户端", + "createTime": "2019/03/29 16:38:03", + "authority": "get:/v1/oauth/client", + "checked": 0, + "sort": 9 + }, + { + "serialVersionUID": -6058060376656180793, + "parentName": "客户端管理", + "authorityName": "添加客户端", + "createTime": "2019/03/29 16:38:03", + "authority": "post:/v1/oauth/client", + "checked": 0, + "sort": 10 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/tagsInput.json b/jun_pc_web/json/tagsInput.json new file mode 100644 index 000000000..d25861a00 --- /dev/null +++ b/jun_pc_web/json/tagsInput.json @@ -0,0 +1,10 @@ +{ + "code": 200, + "msg": "", + "data": [ + "管理员", + "用户一", + "用户二", + "用户三" + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/tinymce-upload-ok.json b/jun_pc_web/json/tinymce-upload-ok.json new file mode 100644 index 000000000..f25b562ad --- /dev/null +++ b/jun_pc_web/json/tinymce-upload-ok.json @@ -0,0 +1,3 @@ +{ + "location": "https://pic.qqtn.com/up/2018-9/15367146917869444.jpg" +} \ No newline at end of file diff --git a/jun_pc_web/json/user-all.json b/jun_pc_web/json/user-all.json new file mode 100644 index 000000000..e633d19a6 --- /dev/null +++ b/jun_pc_web/json/user-all.json @@ -0,0 +1,2614 @@ +{ + "code": 0, + "msg": "", + "count": 200, + "data": [ + { + "nickName": "用户1", + "createTime": "2018/07/22 10:03:40", + "state": 0, + "sex": "女", + "phone": "0123456781", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户2", + "createTime": "2018/07/23 10:03:40", + "state": 1, + "sex": "女", + "phone": "0123456782", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户3", + "createTime": "2018/07/24 10:03:40", + "state": 0, + "sex": "男", + "phone": "0123456783", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户4", + "createTime": "2018/07/25 10:03:40", + "state": 0, + "sex": "女", + "phone": "0123456784", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户5", + "createTime": "2018/07/26 10:03:40", + "state": 1, + "sex": "男", + "phone": "0123456785", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户6", + "createTime": "2018/07/27 10:03:40", + "state": 0, + "sex": "女", + "phone": "0123456786", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户7", + "createTime": "2018/07/28 10:03:40", + "state": 1, + "sex": "女", + "phone": "0123456787", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户8", + "createTime": "2018/07/29 10:03:40", + "state": 0, + "sex": "男", + "phone": "0123456788", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户9", + "createTime": "2018/07/30 10:03:40", + "state": 1, + "sex": "女", + "phone": "0123456789", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户10", + "createTime": "2018/07/31 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567810", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户11", + "createTime": "2018/08/01 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567811", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户12", + "createTime": "2018/08/02 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567812", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户13", + "createTime": "2018/08/03 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567813", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户14", + "createTime": "2018/08/04 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567814", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户15", + "createTime": "2018/08/05 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567815", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户16", + "createTime": "2018/08/06 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567816", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户17", + "createTime": "2018/08/07 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567817", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户18", + "createTime": "2018/08/08 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567818", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户19", + "createTime": "2018/08/09 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567819", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户20", + "createTime": "2018/08/10 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567820", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户21", + "createTime": "2018/08/11 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567821", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户22", + "createTime": "2018/08/12 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567822", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户23", + "createTime": "2018/08/13 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567823", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户24", + "createTime": "2018/08/14 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567824", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户25", + "createTime": "2018/08/15 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567825", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户26", + "createTime": "2018/08/16 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567826", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户27", + "createTime": "2018/08/17 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567827", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户28", + "createTime": "2018/08/18 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567828", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户29", + "createTime": "2018/08/19 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567829", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户30", + "createTime": "2018/08/20 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567830", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户31", + "createTime": "2018/08/21 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567831", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户32", + "createTime": "2018/08/22 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567832", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户33", + "createTime": "2018/08/23 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567833", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户34", + "createTime": "2018/08/24 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567834", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户35", + "createTime": "2018/08/25 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567835", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户36", + "createTime": "2018/08/26 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567836", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户37", + "createTime": "2018/08/27 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567837", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户38", + "createTime": "2018/08/28 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567838", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户39", + "createTime": "2018/08/29 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567839", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户40", + "createTime": "2018/08/30 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567840", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户41", + "createTime": "2018/08/31 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567841", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户42", + "createTime": "2018/09/01 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567842", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户43", + "createTime": "2018/09/02 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567843", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户44", + "createTime": "2018/09/03 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567844", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户45", + "createTime": "2018/09/04 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567845", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户46", + "createTime": "2018/09/05 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567846", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户47", + "createTime": "2018/09/06 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567847", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户48", + "createTime": "2018/09/07 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567848", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户49", + "createTime": "2018/09/08 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567849", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户50", + "createTime": "2018/09/09 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567850", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户51", + "createTime": "2018/09/10 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567851", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户52", + "createTime": "2018/09/11 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567852", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户53", + "createTime": "2018/09/12 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567853", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户54", + "createTime": "2018/09/13 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567854", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户55", + "createTime": "2018/09/14 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567855", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户56", + "createTime": "2018/09/15 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567856", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户57", + "createTime": "2018/09/16 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567857", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户58", + "createTime": "2018/09/17 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567858", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户59", + "createTime": "2018/09/18 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567859", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户60", + "createTime": "2018/09/19 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567860", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户61", + "createTime": "2018/09/20 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567861", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户62", + "createTime": "2018/09/21 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567862", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户63", + "createTime": "2018/09/22 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567863", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户64", + "createTime": "2018/09/23 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567864", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户65", + "createTime": "2018/09/24 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567865", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户66", + "createTime": "2018/09/25 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567866", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户67", + "createTime": "2018/09/26 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567867", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户68", + "createTime": "2018/09/27 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567868", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户69", + "createTime": "2018/09/28 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567869", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户70", + "createTime": "2018/09/29 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567870", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户71", + "createTime": "2018/09/30 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567871", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户72", + "createTime": "2018/10/01 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567872", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户73", + "createTime": "2018/10/02 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567873", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户74", + "createTime": "2018/10/03 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567874", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户75", + "createTime": "2018/10/04 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567875", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户76", + "createTime": "2018/10/05 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567876", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户77", + "createTime": "2018/10/06 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567877", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户78", + "createTime": "2018/10/07 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567878", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户79", + "createTime": "2018/10/08 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567879", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户80", + "createTime": "2018/10/09 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567880", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户81", + "createTime": "2018/10/10 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567881", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户82", + "createTime": "2018/10/11 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567882", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户83", + "createTime": "2018/10/12 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567883", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户84", + "createTime": "2018/10/13 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567884", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户85", + "createTime": "2018/10/14 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567885", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户86", + "createTime": "2018/10/15 10:03:40", + "state": 0, + "sex": "女", + "phone": "01234567886", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户87", + "createTime": "2018/10/16 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567887", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户88", + "createTime": "2018/10/17 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567888", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户89", + "createTime": "2018/10/18 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567889", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户90", + "createTime": "2018/10/19 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567890", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户91", + "createTime": "2018/10/20 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567891", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户92", + "createTime": "2018/10/21 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567892", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户93", + "createTime": "2018/10/22 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567893", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户94", + "createTime": "2018/10/23 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567894", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户95", + "createTime": "2018/10/24 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567895", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户96", + "createTime": "2018/10/25 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567896", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户97", + "createTime": "2018/10/26 10:03:40", + "state": 1, + "sex": "女", + "phone": "01234567897", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户98", + "createTime": "2018/10/27 10:03:40", + "state": 1, + "sex": "男", + "phone": "01234567898", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户99", + "createTime": "2018/10/28 10:03:40", + "state": 0, + "sex": "男", + "phone": "01234567899", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户100", + "createTime": "2018/10/29 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678100", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户101", + "createTime": "2018/10/30 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678101", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户102", + "createTime": "2018/10/31 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678102", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户103", + "createTime": "2018/11/01 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678103", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户104", + "createTime": "2018/11/02 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678104", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户105", + "createTime": "2018/11/03 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678105", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户106", + "createTime": "2018/11/04 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678106", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户107", + "createTime": "2018/11/05 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678107", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户108", + "createTime": "2018/11/06 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678108", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户109", + "createTime": "2018/11/07 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678109", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户110", + "createTime": "2018/11/08 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678110", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户111", + "createTime": "2018/11/09 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678111", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户112", + "createTime": "2018/11/10 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678112", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户113", + "createTime": "2018/11/11 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678113", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户114", + "createTime": "2018/11/12 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678114", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户115", + "createTime": "2018/11/13 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678115", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户116", + "createTime": "2018/11/14 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678116", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户117", + "createTime": "2018/11/15 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678117", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户118", + "createTime": "2018/11/16 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678118", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户119", + "createTime": "2018/11/17 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678119", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户120", + "createTime": "2018/11/18 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678120", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户121", + "createTime": "2018/11/19 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678121", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户122", + "createTime": "2018/11/20 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678122", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户123", + "createTime": "2018/11/21 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678123", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户124", + "createTime": "2018/11/22 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678124", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户125", + "createTime": "2018/11/23 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678125", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户126", + "createTime": "2018/11/24 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678126", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户127", + "createTime": "2018/11/25 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678127", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户128", + "createTime": "2018/11/26 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678128", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户129", + "createTime": "2018/11/27 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678129", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户130", + "createTime": "2018/11/28 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678130", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户131", + "createTime": "2018/11/29 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678131", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户132", + "createTime": "2018/11/30 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678132", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户133", + "createTime": "2018/12/01 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678133", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户134", + "createTime": "2018/12/02 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678134", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户135", + "createTime": "2018/12/03 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678135", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户136", + "createTime": "2018/12/04 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678136", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户137", + "createTime": "2018/12/05 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678137", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户138", + "createTime": "2018/12/06 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678138", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户139", + "createTime": "2018/12/07 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678139", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户140", + "createTime": "2018/12/08 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678140", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户141", + "createTime": "2018/12/09 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678141", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户142", + "createTime": "2018/12/10 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678142", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户143", + "createTime": "2018/12/11 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678143", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户144", + "createTime": "2018/12/12 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678144", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户145", + "createTime": "2018/12/13 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678145", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户146", + "createTime": "2018/12/14 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678146", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户147", + "createTime": "2018/12/15 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678147", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户148", + "createTime": "2018/12/16 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678148", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户149", + "createTime": "2018/12/17 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678149", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户150", + "createTime": "2018/12/18 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678150", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户151", + "createTime": "2018/12/19 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678151", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户152", + "createTime": "2018/12/20 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678152", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户153", + "createTime": "2018/12/21 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678153", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户154", + "createTime": "2018/12/22 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678154", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户155", + "createTime": "2018/12/23 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678155", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户156", + "createTime": "2018/12/24 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678156", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户157", + "createTime": "2018/12/25 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678157", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户158", + "createTime": "2018/12/26 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678158", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户159", + "createTime": "2018/12/27 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678159", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户160", + "createTime": "2018/12/28 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678160", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户161", + "createTime": "2018/12/29 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678161", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户162", + "createTime": "2018/12/30 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678162", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户163", + "createTime": "2018/12/31 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678163", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户164", + "createTime": "2019/01/01 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678164", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户165", + "createTime": "2019/01/02 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678165", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户166", + "createTime": "2019/01/03 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678166", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户167", + "createTime": "2019/01/04 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678167", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户168", + "createTime": "2019/01/05 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678168", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户169", + "createTime": "2019/01/06 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678169", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户170", + "createTime": "2019/01/07 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678170", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户171", + "createTime": "2019/01/08 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678171", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户172", + "createTime": "2019/01/09 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678172", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户173", + "createTime": "2019/01/10 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678173", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户174", + "createTime": "2019/01/11 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678174", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户175", + "createTime": "2019/01/12 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678175", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户176", + "createTime": "2019/01/13 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678176", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户177", + "createTime": "2019/01/14 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678177", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户178", + "createTime": "2019/01/15 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678178", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户179", + "createTime": "2019/01/16 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678179", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户180", + "createTime": "2019/01/17 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678180", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户181", + "createTime": "2019/01/18 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678181", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户182", + "createTime": "2019/01/19 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678182", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户183", + "createTime": "2019/01/20 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678183", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户184", + "createTime": "2019/01/21 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678184", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户185", + "createTime": "2019/01/22 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678185", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户186", + "createTime": "2019/01/23 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678186", + "roles": [ + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户187", + "createTime": "2019/01/24 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678187", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户188", + "createTime": "2019/01/25 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678188", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户189", + "createTime": "2019/01/26 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678189", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户190", + "createTime": "2019/01/27 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678190", + "roles": [ + { + "roleName": "管理员" + }, + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户191", + "createTime": "2019/01/28 10:03:40", + "state": 1, + "sex": "女", + "phone": "012345678191", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户192", + "createTime": "2019/01/29 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678192", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户193", + "createTime": "2019/01/30 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678193", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户194", + "createTime": "2019/01/31 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678194", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户195", + "createTime": "2019/02/01 10:03:40", + "state": 0, + "sex": "女", + "phone": "012345678195", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "管理员" + } + ] + }, + { + "nickName": "用户196", + "createTime": "2019/02/02 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678196", + "roles": [ + { + "roleName": "游客" + }, + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户197", + "createTime": "2019/02/03 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678197", + "roles": [ + { + "roleName": "游客" + } + ] + }, + { + "nickName": "用户198", + "createTime": "2019/02/04 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678198", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户199", + "createTime": "2019/02/05 10:03:40", + "state": 0, + "sex": "男", + "phone": "012345678199", + "roles": [ + { + "roleName": "普通用户" + } + ] + }, + { + "nickName": "用户200", + "createTime": "2019/02/06 10:03:40", + "state": 1, + "sex": "男", + "phone": "012345678200", + "roles": [ + { + "roleName": "普通用户" + }, + { + "roleName": "游客" + } + ] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/json/user.json b/jun_pc_web/json/user.json new file mode 100644 index 000000000..efa6db227 --- /dev/null +++ b/jun_pc_web/json/user.json @@ -0,0 +1,255 @@ +{ + "code": 0, + "msg": "", + "count": 8, + "data": [ + { + "userId": 1, + "username": "admin", + "password": "822f69df5fff8f8983e69a515744a9df", + "nickName": "管理员", + "avatar": null, + "sex": "男", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 1, + "roleName": "管理员", + "roles": [ + { + "roleId": 1, + "roleName": "管理员", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + }, + { + "roleId": 2, + "roleName": "普通用户", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + }, + { + "userId": 2, + "username": "user01", + "password": "08b96cdc7dc85dc9e3511a991b6716f4", + "nickName": "用户一", + "avatar": null, + "sex": "男", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 2, + "roleName": "普通用户", + "roles": [ + { + "roleId": 2, + "roleName": "普通用户", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + }, + { + "userId": 3, + "username": "user02", + "password": "08b96cdc7dc85dc9e3511a991b6716f4", + "nickName": "用户二", + "avatar": null, + "sex": "女", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 2, + "roleName": "普通用户", + "roles": [ + { + "roleId": 2, + "roleName": "普通用户", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + }, + { + "userId": 4, + "username": "user03", + "password": "08b96cdc7dc85dc9e3511a991b6716f4", + "nickName": "用户三", + "avatar": null, + "sex": "男", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 1, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 3, + "roleName": "游客", + "roles": [ + { + "roleId": 3, + "roleName": "游客", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + }, + { + "userId": 5, + "username": "user04", + "password": "08b96cdc7dc85dc9e3511a991b6716f4", + "nickName": "用户四", + "avatar": null, + "sex": "男", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 3, + "roleName": "游客", + "roles": [ + { + "roleId": 3, + "roleName": "游客", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + }, + { + "userId": 6, + "username": "user05", + "password": "08b96cdc7dc85dc9e3511a991b6716f4", + "nickName": "用户五", + "avatar": null, + "sex": "男", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 0, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 3, + "roleName": "游客", + "roles": [ + { + "roleId": 3, + "roleName": "游客", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + }, + { + "userId": 7, + "username": "user06", + "password": "08b96cdc7dc85dc9e3511a991b6716f4", + "nickName": "用户六", + "avatar": null, + "sex": "男", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 1, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 3, + "roleName": "游客", + "roles": [ + { + "roleId": 3, + "roleName": "游客", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + }, + { + "userId": 8, + "username": "user07", + "password": "08b96cdc7dc85dc9e3511a991b6716f4", + "nickName": "用户七", + "avatar": null, + "sex": "男", + "phone": "12345678901", + "email": null, + "emailVerified": null, + "trueName": null, + "idCard": null, + "birthday": null, + "departmentId": null, + "state": 1, + "createTime": "2019/03/29 16:38:03", + "updateTime": "2019/03/29 16:38:03", + "roleId": 3, + "roleName": "游客", + "roles": [ + { + "roleId": 3, + "roleName": "游客", + "comments": null, + "isDelete": null, + "createTime": null, + "updateTime": null + } + ] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/login.html b/jun_pc_web/login.html new file mode 100644 index 000000000..16b56b19a --- /dev/null +++ b/jun_pc_web/login.html @@ -0,0 +1,352 @@ + + + + + + + + 齐兴会计师事务所信息系统-登陆 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/login2.html b/jun_pc_web/login2.html new file mode 100644 index 000000000..0e43d7bfd --- /dev/null +++ b/jun_pc_web/login2.html @@ -0,0 +1,353 @@ + + + + + + + + 齐兴会计师事务所信息系统-登陆 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/menu.md b/jun_pc_web/menu.md new file mode 100644 index 000000000..c409db4b2 --- /dev/null +++ b/jun_pc_web/menu.md @@ -0,0 +1,54 @@ +行政管理 + 印章管理 + 车辆管理 + 会议室管理 +企业公告 + 公告类型 + 公告列表 + +办公审批 + 我发起的 + 我处理的 + 抄送给我的 + + + +日常办公 + 日程安排 + 日程日历 + 工作记录 + 工作日历 + 工作汇报 + + + + + + +财务管理 + 报销管理 + 发票管理 + 到账管理 +客户管理 + 客户等级 + 客户渠道 + 抢客宝 + 客户列表 + 公海客户 + 废弃客户 + 客户联系人 + 销售机会 +合同管理 + 合同类别 + 合同列表 + 合同归档 + +项目管理 + 项目列表 + 任务列表 + 任务工时 + 文档列表 +知识文章 + 知识类型 + 共享知识 + 个人知识 \ No newline at end of file diff --git a/jun_pc_web/message/index/add2.html b/jun_pc_web/message/index/add2.html new file mode 100644 index 000000000..abd9685aa --- /dev/null +++ b/jun_pc_web/message/index/add2.html @@ -0,0 +1,326 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +

            发送消息

            + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + + +
            接收人类型 + + + + +
            收件人* + + + + +
            主题* + +
            发送内容* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + +
            接收人类型 + + + + +
            收件人* + {eq name="$detail.type" value="3"} + + {else/} + + {/eq} + + + +
            主题* + +
            发送内容* + + {if condition="($detail.fid > 0)"} + + + + + + {notempty name="$detail.from_file_array"} + + + + + {/notempty} +
            引用消息内容{$detail.from_content}
            引用消息附件 + + + + + + + + {volist name="$detail.from_file_array" id="vo"} + + + + + + {/volist} + +
            文件名文件大小操作
            {$vo.name}{$vo.filesize/1048576|round=2}MB下载
            +
            + {/if} +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/if} +
            + + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/message/index/draft2.html b/jun_pc_web/message/index/draft2.html new file mode 100644 index 000000000..6a2672a22 --- /dev/null +++ b/jun_pc_web/message/index/draft2.html @@ -0,0 +1,155 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + {include file="index/msgmenu" /} +
            +
            +
            + +
            +
            +
            + +
            + ~ +
            + +
            +
            +
            + + +
            +
            +
            +
            +
            + + + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/message/index/inbox2.html b/jun_pc_web/message/index/inbox2.html new file mode 100644 index 000000000..f4972448d --- /dev/null +++ b/jun_pc_web/message/index/inbox2.html @@ -0,0 +1,188 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + {include file="index/msgmenu" /} +
            +
            +
            + +
            +
            +
            + +
            + ~ +
            + +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/message/index/msgmenu2.html b/jun_pc_web/message/index/msgmenu2.html new file mode 100644 index 000000000..3ac08256b --- /dev/null +++ b/jun_pc_web/message/index/msgmenu2.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/jun_pc_web/message/index/read2.html b/jun_pc_web/message/index/read2.html new file mode 100644 index 000000000..f26a1f219 --- /dev/null +++ b/jun_pc_web/message/index/read2.html @@ -0,0 +1,91 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +

            消息详情

            + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} + {notempty name="$detail.read_users"} + + + + + {/notempty} +
            信息主题{$detail.title}
            发送人{$detail.person_name}接收人类别 + {eq name="$detail.type" value="0"}-{/eq} + {eq name="$detail.type" value="1"}同事{/eq} + {eq name="$detail.type" value="2"}部门{/eq} + {eq name="$detail.type" value="3"}岗位{/eq} + {eq name="$detail.type" value="4"}全部{/eq} + 发送时间{$detail.send_time}
            收件人{$detail.users}
            消息内容 + {if condition="($detail.template == 0)"} + {$detail.content} + {if condition="($detail.fid > 0)"} + + + + + + {notempty name="$detail.from_file_array"} + + + + + {/notempty} +
            引用消息内容{$detail.from_content}
            引用消息附件 + {volist name="$detail.from_file_array" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            + {/if} + {else/} + {$detail.content}{:getMessageLink($detail.template,$detail.action_id)} + {/if} +
            相关附件 + {volist name="$detail.file_array" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            收件人已读回执{$detail.read_users}
            + {if condition="($detail.template == 0) AND ($detail.pid != 0)"} +
            + 回复 +
            + {/if} +
            +{/block} + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/jun_pc_web/message/index/reply2.html b/jun_pc_web/message/index/reply2.html new file mode 100644 index 000000000..fb3c15c2b --- /dev/null +++ b/jun_pc_web/message/index/reply2.html @@ -0,0 +1,286 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + {if condition="$type eq 1"} +

            回复消息

            + {else/} +

            转发消息

            + {/if} + + + + + + {if condition="$type eq 1"} + + + + + + + + + {else/} + + + + + + + + + {/if} + + + + + + + + +
            接收人类型 + + + + +
            收件人* + + + + +
            主题* + +
            收件人* + + + + +
            主题* + +
            内容* + + + + + + + + {notempty name="$file_array"} + + + + + {/notempty} +
            原消息内容{$detail.content}
            原消息附件 + {volist name="$detail.from_file_array" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            +
            + + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/message/index/rubbish2.html b/jun_pc_web/message/index/rubbish2.html new file mode 100644 index 000000000..4d0133afa --- /dev/null +++ b/jun_pc_web/message/index/rubbish2.html @@ -0,0 +1,176 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + {include file="index/msgmenu" /} +
            +
            +
            + +
            +
            +
            + +
            + ~ +
            + +
            +
            +
            + + +
            +
            +
            +
            +
            + + + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/message/index/sendbox2.html b/jun_pc_web/message/index/sendbox2.html new file mode 100644 index 000000000..ae06ec77d --- /dev/null +++ b/jun_pc_web/message/index/sendbox2.html @@ -0,0 +1,161 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + {include file="index/msgmenu" /} +
            +
            +
            + +
            +
            +
            + +
            + ~ +
            + +
            +
            +
            + + +
            +
            +
            +
            +
            + + + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/note/index.html b/jun_pc_web/note/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/note/index.json b/jun_pc_web/note/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/note/index/add.html b/jun_pc_web/note/index/add.html new file mode 100644 index 000000000..9a5714502 --- /dev/null +++ b/jun_pc_web/note/index/add.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            新增公告

            + + + + + + + + + + + + + + + + + + + + + + + +
            公告标题* + + 公告分类* + +
            展示期间* +
            + +
            + - +
            + +
            +
            状态* + + +
            关联链接 + + 排序 + +
            公告内容* + +
            + +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/note/index/add2.html b/jun_pc_web/note/index/add2.html new file mode 100644 index 000000000..97912684d --- /dev/null +++ b/jun_pc_web/note/index/add2.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + {eq name="$id" value="0"} +

            新增公告

            + {else/} +

            编辑公告

            + {/eq} + + + + + + + + + + + + + + + + + + + + + + + +
            公告标题* + + 公告分类* + +
            展示期间* +
            + +
            + - +
            + +
            +
            状态* + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
            关联链接 + + 排序 + +
            公告内容* + +
            + +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/note/index/index.html b/jun_pc_web/note/index/index.html new file mode 100644 index 000000000..9f4b476a3 --- /dev/null +++ b/jun_pc_web/note/index/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/note/index/index.json b/jun_pc_web/note/index/index.json new file mode 100644 index 000000000..2f17882d0 --- /dev/null +++ b/jun_pc_web/note/index/index.json @@ -0,0 +1,178 @@ +{ + "code": 0, + "msg": "", + "count": 9, + "data": [ + { + "id": 89, + "cate_id": 6, + "title": "123144", + "content": "

            ces14eeeeeeeeeeeeeeeeeeeeeeeeee<\/p>", + "src": "", + "status": 0, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2024-01-09", + "end_time": "2025-02-13", + "admin_id": 2, + "create_time": "2024-01-08 13:34:45", + "update_time": "2024-01-08 23:12:53", + "cate_title": "测试" + }, + { + "id": 87, + "cate_id": 1, + "title": "上线通知", + "content": "

            英雄联盟雪地贪吃蛇版产品上线<\/p>", + "src": "", + "status": 1, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2024-01-04", + "end_time": "2024-02-02", + "admin_id": 2, + "create_time": "2024-01-04 13:57:08", + "update_time": null, + "cate_title": "普通公告" + }, + { + "id": 86, + "cate_id": 1, + "title": "353252", + "content": "

            测试111<\/p>", + "src": "", + "status": 1, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2024-01-04", + "end_time": "2024-01-27", + "admin_id": 2, + "create_time": "2024-01-03 15:35:25", + "update_time": null, + "cate_title": "普通公告" + }, + { + "id": 75, + "cate_id": 2, + "title": "工资发放通知", + "content": "

            范德萨发达<\/p>\n\n\n\n\n\n\n\n\n
            需要<\/td>\n需要<\/strong><\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
            魂牵梦萦<\/td>\nfds需要<\/strong><\/td>\n魂牵梦萦<\/strong><\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
             <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
             <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
             <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n
             <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n <\/td>\n<\/tr>\n<\/tbody>\n<\/table>", + "src": "https:\/\/www.gougucms.com\/home\/pages\/detail\/s\/gouguoa.html", + "status": 1, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2023-12-11", + "end_time": "2024-01-24", + "admin_id": 4, + "create_time": "2023-12-11 14:59:47", + "update_time": "2024-01-04 14:42:25", + "cate_title": "紧急公告" + }, + { + "id": 91, + "cate_id": 1, + "title": "薪酬审批通知", + "content": "

            请各位确认薪酬报表<\/p>", + "src": "", + "status": 1, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2024-01-09", + "end_time": "2024-01-13", + "admin_id": 2, + "create_time": "2024-01-11 09:31:22", + "update_time": null, + "cate_title": "普通公告" + }, + { + "id": 84, + "cate_id": 1, + "title": "元旦放假通知", + "content": "

            放假通知<\/p>", + "src": "", + "status": 1, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2023-12-25", + "end_time": "2024-01-05", + "admin_id": 2, + "create_time": "2023-12-21 14:56:44", + "update_time": null, + "cate_title": "普通公告" + }, + { + "id": 78, + "cate_id": 2, + "title": "调整上班时间通知", + "content": "

            test<\/p>", + "src": "https:\/\/www.baidu.com\/", + "status": 1, + "sort": 1, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2023-12-01", + "end_time": "2023-12-31", + "admin_id": 4, + "create_time": "2023-12-12 13:39:47", + "update_time": "2023-12-29 09:24:00", + "cate_title": "紧急公告" + }, + { + "id": 76, + "cate_id": 1, + "title": "人事调整通知", + "content": "

            dddddd<\/p>", + "src": "", + "status": 1, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2023-12-12", + "end_time": "2023-12-16", + "admin_id": 4, + "create_time": "2023-12-12 08:04:02", + "update_time": "2023-12-29 09:23:41", + "cate_title": "普通公告" + }, + { + "id": 73, + "cate_id": 2, + "title": "提交绩效报告通知", + "content": "

            提交绩效报告通知<\/strong><\/span><\/p>", + "src": "", + "status": 1, + "sort": 0, + "file_ids": "", + "role_type": 0, + "role_dids": "", + "role_uids": "", + "start_time": "2023-12-09", + "end_time": "2023-12-15", + "admin_id": 2, + "create_time": "2023-12-09 10:24:39", + "update_time": "2024-01-02 16:22:55", + "cate_title": "紧急公告" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/note/index/index2.html b/jun_pc_web/note/index/index2.html new file mode 100644 index 000000000..be15eed70 --- /dev/null +++ b/jun_pc_web/note/index/index2.html @@ -0,0 +1,122 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +

            +
            +
            + + + + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/jun_pc_web/note/index/note_cate.html b/jun_pc_web/note/index/note_cate.html new file mode 100644 index 000000000..24789ed0a --- /dev/null +++ b/jun_pc_web/note/index/note_cate.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            + +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/note/index/note_cate.json b/jun_pc_web/note/index/note_cate.json new file mode 100644 index 000000000..eb17a93a6 --- /dev/null +++ b/jun_pc_web/note/index/note_cate.json @@ -0,0 +1,45 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": [ + { + "id": 1, + "pid": 0, + "sort": 1, + "title": "普通公告", + "create_time": 1637984265, + "update_time": 1637984299, + "children": [] + }, + { + "id": 2, + "pid": 0, + "sort": 2, + "title": "紧急公告", + "create_time": 1637984283, + "update_time": 1637984310, + "children": [ + { + "id": 6, + "pid": 2, + "sort": 0, + "title": "测试", + "create_time": 1685669250, + "update_time": 0, + "children": [] + } + ] + }, + { + "id": 3, + "pid": 0, + "sort": 3, + "title": "防疫公告", + "create_time": 1637984283, + "update_time": 1637984310, + "children": [] + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/note/index/note_cate2.html b/jun_pc_web/note/index/note_cate2.html new file mode 100644 index 000000000..31ba987a8 --- /dev/null +++ b/jun_pc_web/note/index/note_cate2.html @@ -0,0 +1,82 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            + +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/note/index/note_cate_add.html b/jun_pc_web/note/index/note_cate_add.html new file mode 100644 index 000000000..b75834af8 --- /dev/null +++ b/jun_pc_web/note/index/note_cate_add.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            公告分类

            + + + + + + + + + +
            父级分类* + + 分类名称* + + 排序 + +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/note/index/note_cate_add2.html b/jun_pc_web/note/index/note_cate_add2.html new file mode 100644 index 000000000..40b5c0e90 --- /dev/null +++ b/jun_pc_web/note/index/note_cate_add2.html @@ -0,0 +1,80 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +

            公告分类

            + {eq name="$id" value="0"} + + + + + + + + + +
            父级分类* + + 分类名称* + + 排序 + +
            + {else/} + + + + + + + + + +
            父级分类* + + 分类名称* + + 排序 + +
            + {/eq} +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/note/index/view.html b/jun_pc_web/note/index/view.html new file mode 100644 index 000000000..c02928d6d --- /dev/null +++ b/jun_pc_web/note/index/view.html @@ -0,0 +1,81 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +
            +

            欢迎使用勾股OA办公系统

            +
            + 超级员工发表于:2021-11-27 11:49:22公告分类:普通公告 + 展示期间:2021-11-01 - 2030-12-31 +
            +
            +

            欢迎使用勾股OA办公系统,勾股办公是一款简单实用的开源免费的企业办公系统。系统集成了系统设置、人事管理、行政管理、消息管理、日常办公、财务管理、客户管理、项目管理、合同管理、知识管理等基础模块。系统简约,易于功能扩展,方便二次开发,让开发者更专注于业务深度需求的开发,帮助开发者简单高效降低二次开发成本,通过二次开发之后可以用来做CRM,ERP,业务管理等系统。

            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/note/index/view2.html b/jun_pc_web/note/index/view2.html new file mode 100644 index 000000000..97dd6fbae --- /dev/null +++ b/jun_pc_web/note/index/view2.html @@ -0,0 +1,43 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} + +

            {$note.title}

            +
            + {$note.admin_name}发表于:{$note.create_time | date='Y-m-d H:i:s'}公告分类:{$note.cate_title} + 展示期间:{$note.start_time | date='Y-m-d'} - {$note.end_time | date='Y-m-d'} +
            +
            + {$note.content|raw} +
            + +{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/add.html b/jun_pc_web/oa/add.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/add.json b/jun_pc_web/oa/add.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/2/add_caigou2.html b/jun_pc_web/oa/approve/2/add_caigou2.html new file mode 100644 index 000000000..a79754dd3 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_caigou2.html @@ -0,0 +1,122 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} + +

            采购申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + +
            物品名称*期望交互日期* + +
            采购数量*采购金额*
            采购事由* + +
            备注 + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + +
            物品名称*期望交互日期* + +
            采购数量*采购金额*
            采购事由* + +
            备注 + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_chuchai2.html b/jun_pc_web/oa/approve/2/add_chuchai2.html new file mode 100644 index 000000000..767fec263 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_chuchai2.html @@ -0,0 +1,196 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            出差审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            出差天数-
            出差地点*
            出差事由* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            出差天数{$detail.duration|default='-'}
            出差地点*
            出差事由* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_flow2.html b/jun_pc_web/oa/approve/2/add_flow2.html new file mode 100644 index 000000000..ec76d89ab --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_flow2.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + diff --git a/jun_pc_web/oa/approve/2/add_fukuan2.html b/jun_pc_web/oa/approve/2/add_fukuan2.html new file mode 100644 index 000000000..99f24ea1c --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_fukuan2.html @@ -0,0 +1,156 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            付款申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            付款金额*付款方式* + + 付款日期* + +
            收款人全称*银行账号开户行 + +
            付款事由* + +
            备注 + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            付款金额*付款方式* + + 付款日期* + +
            收款人全称*银行账号开户行 + +
            付款事由* + +
            备注 + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_gongwen2.html b/jun_pc_web/oa/approve/2/add_gongwen2.html new file mode 100644 index 000000000..c5c9a6d7d --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_gongwen2.html @@ -0,0 +1,103 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            公文流转审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + +
            文件名称*紧急程度* + +
            来文单位*来文日期* + +
            文件摘要* +
            备注 + +
            + {else/} + + + + + + + + + + + + + + + + + + + + + +
            文件名称*紧急程度* + +
            来文单位*来文日期* + +
            会议室名称*
            备注 + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_huiyishi2.html b/jun_pc_web/oa/approve/2/add_huiyishi2.html new file mode 100644 index 000000000..5a43b4f3b --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_huiyishi2.html @@ -0,0 +1,92 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            会议室预定审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + +
            会议室选择* + + 开始时间* + + 结束时间* + +
            备注 + +
            + {else/} + + + + + + + + + + + + + +
            会议室选择* + + 开始时间* + + 结束时间* + +
            备注 + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_huodong2.html b/jun_pc_web/oa/approve/2/add_huodong2.html new file mode 100644 index 000000000..ce2d40e19 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_huodong2.html @@ -0,0 +1,127 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            活动经费审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + +
            活动名称*活动预算*
            活动说明* + +
            开始时间* + + 结束时间* + +
            备注 + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + +
            活动名称*活动预算*
            活动说明* + +
            开始时间* + + 结束时间* + +
            备注 + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_jiaban2.html b/jun_pc_web/oa/approve/2/add_jiaban2.html new file mode 100644 index 000000000..6633157d9 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_jiaban2.html @@ -0,0 +1,167 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            加班申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            加班天数-
            加班事由* + +
            + {else/} + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            加班天数{$detail.duration|default='-'}
            请假事由* + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_jiangli2.html b/jun_pc_web/oa/approve/2/add_jiangli2.html new file mode 100644 index 000000000..5079d75e2 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_jiangli2.html @@ -0,0 +1,110 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            奖励申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + +
            奖励金额*奖励日期* + +
            奖励事由* + +
            备注 + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + +
            奖励金额*奖励日期* + +
            奖励事由* + +
            备注 + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_jiekuan2.html b/jun_pc_web/oa/approve/2/add_jiekuan2.html new file mode 100644 index 000000000..1a15dd7a0 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_jiekuan2.html @@ -0,0 +1,119 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            借款申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + +
            借款金额*借款类型* + + 申请日期* + +
            借款人*银行账号*开户行* + +
            借款事由* + +
            备注 + +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + +
            借款金额*费用类型* + + 申请日期* + +
            借款人*银行账号*开户行* + +
            借款事由* + +
            备注 + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_lizhi2.html b/jun_pc_web/oa/approve/2/add_lizhi2.html new file mode 100644 index 000000000..68eafdff3 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_lizhi2.html @@ -0,0 +1,159 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            离职申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 入职日期* + +
            所在部门* + + 担任职务* + +
            申请离职日期*预计离职日期* + +
            离职原因* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 入职日期* + +
            所在部门* + + 担任职务* + +
            申请离职日期*预计离职日期* + +
            离职原因* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_qingjia2.html b/jun_pc_web/oa/approve/2/add_qingjia2.html new file mode 100644 index 000000000..9bea31df2 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_qingjia2.html @@ -0,0 +1,222 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            请假申请

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + +
            请假类型* + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            请假天数-
            请假事由* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + +
            请假类型* + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            请假天数{$detail.duration|default='-'}
            请假事由* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_ruzhi2.html b/jun_pc_web/oa/approve/2/add_ruzhi2.html new file mode 100644 index 000000000..6952a4a39 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_ruzhi2.html @@ -0,0 +1,126 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            入职申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名*入职日期* + +
            手机号码*性别* + + +
            入职部门* + + 担任职务* + +
            备注 + +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名*入职日期* + +
            手机号码*性别* + + +
            入职部门* + + 担任职务* + +
            备注 + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_style2.html b/jun_pc_web/oa/approve/2/add_style2.html new file mode 100644 index 000000000..08e6d45af --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_style2.html @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_tongyong2.html b/jun_pc_web/oa/approve/2/add_tongyong2.html new file mode 100644 index 000000000..abb181318 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_tongyong2.html @@ -0,0 +1,100 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            通用审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + +
            审批内容*紧急程度* + +
            详细描述* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + +
            审批内容*紧急程度* + +
            详细描述* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_waichu2.html b/jun_pc_web/oa/approve/2/add_waichu2.html new file mode 100644 index 000000000..a621dd68c --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_waichu2.html @@ -0,0 +1,196 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            外出审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + +
            外出地点*
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            外出天数-
            外出事由* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + +
            外出地点*
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            外出天数{$detail.duration|default='-'}
            外出事由* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_weixiu2.html b/jun_pc_web/oa/approve/2/add_weixiu2.html new file mode 100644 index 000000000..83c8a0d4c --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_weixiu2.html @@ -0,0 +1,123 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            物品维修审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + +
            故障设备名称*紧急程度* + +
            预计维修费用*报修日期* + +
            故障描述* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + +
            故障设备名称*紧急程度* + +
            预计维修费用*报修日期* + +
            故障描述* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_yongche2.html b/jun_pc_web/oa/approve/2/add_yongche2.html new file mode 100644 index 000000000..ff120c78f --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_yongche2.html @@ -0,0 +1,193 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            用车审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            用车天数-
            用车目的地*车辆选择* + +
            用车事由* + +
            + {else/} + + + + + + + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            用车天数{$detail.duration|default='-'}
            用车目的地*车辆选择* + +
            用车事由* + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_yongcheguihai2.html b/jun_pc_web/oa/approve/2/add_yongcheguihai2.html new file mode 100644 index 000000000..2afe972a8 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_yongcheguihai2.html @@ -0,0 +1,94 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            用车归还审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + +
            车辆选择* + + 归还时间* + +
            用车前公里数*用车后公里数*
            备注 + +
            + {else/} + + + + + + + + + + + + + + + + + +
            车辆选择* + + 归还时间* + +
            用车前公里数*用车后公里数*
            备注 + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_yongzhang2.html b/jun_pc_web/oa/approve/2/add_yongzhang2.html new file mode 100644 index 000000000..0e486b3c8 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_yongzhang2.html @@ -0,0 +1,156 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            用章审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + +
            用印日期* + + 印章类型* + +
            文件名称*
            文件类型* + + 文件份数* + +
            用印事由* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + +
            用印日期* + + 印章类型* + +
            文件名称*
            文件类型* + + 文件份数* + +
            用印事由* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_zhaopin2.html b/jun_pc_web/oa/approve/2/add_zhaopin2.html new file mode 100644 index 000000000..550a460fd --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_zhaopin2.html @@ -0,0 +1,156 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            招聘需求审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + +
            招聘部门* + + 期望到岗日期* + +
            招聘岗位* + + 招聘人数* + +
            岗位职责* + +
            任职要求* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + +
            招聘部门* + + 期望到岗日期* + +
            招聘岗位* + + 招聘人数* + +
            岗位职责* + +
            任职要求* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_zhuangang2.html b/jun_pc_web/oa/approve/2/add_zhuangang2.html new file mode 100644 index 000000000..a7eedb51d --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_zhuangang2.html @@ -0,0 +1,199 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            转岗申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 入职日期* + +
            当前所在部门* + + 当前担任职务* + +
            转岗后部门* + + 转岗后职务* + +
            申请转岗日期*预计转岗日期* + +
            转岗原因* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 入职日期* + +
            所在部门* + + 担任职务* + +
            转岗后部门* + + 转岗后职务* + +
            申请转岗日期*预计转岗日期* + +
            转岗原因* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_zhuanzheng2.html b/jun_pc_web/oa/approve/2/add_zhuanzheng2.html new file mode 100644 index 000000000..536c50415 --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_zhuanzheng2.html @@ -0,0 +1,144 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            转正申请审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 转正日期* + +
            所在部门* + + 担任职务* + +
            试用期评价* + +
            附件
            +
            + +
            +
            + {else/} + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 转正日期* + +
            所在部门* + + 担任职务* + +
            试用期评价* + +
            附件
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/add_zizhi2.html b/jun_pc_web/oa/approve/2/add_zizhi2.html new file mode 100644 index 000000000..453aec0de --- /dev/null +++ b/jun_pc_web/oa/approve/2/add_zizhi2.html @@ -0,0 +1,188 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/add_style" /} +{/block} + +{block name="body"} +
            +

            资质借用审批

            + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            借用人* + + 借用人手机*
            借用部门* + +
            借用类型* + + 档案类型* + +
            所借档案用途* +
            借用日期* + + 拟归还日期* + +
            借用档案明细* + + +
            备注 + +
            + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            借用人* + + 借用人手机*
            借用部门* + +
            借用类型* + + 档案类型* + +
            所借档案用途* +
            借用日期* + + 拟归还日期* + +
            借用档案明细* + +
            备注 + +
            + {/eq} + {include file="/approve/add_flow" /} +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view2.html b/jun_pc_web/oa/approve/2/view2.html new file mode 100644 index 000000000..4d28b909f --- /dev/null +++ b/jun_pc_web/oa/approve/2/view2.html @@ -0,0 +1,350 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            外出审批

            + + + + + + + + + + + + + + + +
            外出地点ssss
            外出日期2023-09-06 的下午 至 2023-09-07 的下午外出天数共8.0天
            外出事由
            + + + + + + + + + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人叶小钗抄送人-
            审批流程 +
            +
            + +
            风采铃
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-09-06 17:08风采铃提交了此申请。操作意见:提交申请

              +
            • +
            +
            审批节点 * + + +
            + +
            +
            审批意见 * + +
            + + + +
            + 通过 + 拒绝 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/2/view_caigou2.html b/jun_pc_web/oa/approve/2/view_caigou2.html new file mode 100644 index 000000000..fb29c56e8 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_caigou2.html @@ -0,0 +1,52 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            采购申请审批

            + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            物品名称{$detail.name}期望交付日期{$detail.detail_time}
            采购数量{$detail.num}采购金额{$detail.amount}
            采购事由{$detail.content}
            备注{$detail.remark}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_chuchai2.html b/jun_pc_web/oa/approve/2/view_chuchai2.html new file mode 100644 index 000000000..b30b6f5fd --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_chuchai2.html @@ -0,0 +1,46 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            出差审批

            + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            出差地点{$detail.address}
            出差日期{$detail.start_time} 的{$detail.start_time_span==1?'上午':'下午'} 至 {$detail.end_time} 的{$detail.end_time_span==1?'上午':'下午'}出差天数共{$detail.duration}天
            出差事由{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_fukuan2.html b/jun_pc_web/oa/approve/2/view_fukuan2.html new file mode 100644 index 000000000..aede91f7a --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_fukuan2.html @@ -0,0 +1,64 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            付款申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            付款金额{$detail.amount}付款方式 + {eq name="$detail.detail_type" value="1"}银行卡{/eq} + {eq name="$detail.detail_type" value="2"}现金{/eq} + {eq name="$detail.detail_type" value="3"}汇票{/eq} + {eq name="$detail.detail_type" value="4"}电汇{/eq} + {eq name="$detail.detail_type" value="5"}贷记{/eq} + {eq name="$detail.detail_type" value="6"}支票{/eq} + {eq name="$detail.detail_type" value="7"}其他{/eq} + 付款日期{$detail.detail_time}
            收款人全称{$detail.name}银行账号{$detail.bank}开户行{$detail.address}
            付款事由{$detail.content}
            备注{$detail.remark}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_gongwen2.html b/jun_pc_web/oa/approve/2/view_gongwen2.html new file mode 100644 index 000000000..f7d45132a --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_gongwen2.html @@ -0,0 +1,67 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            公文流转审批

            + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            文件名称{$detail.name}紧急程度 + {eq name="$detail.detail_type" value="1"}普通{/eq} + {eq name="$detail.detail_type" value="2"}紧急{/eq} + {eq name="$detail.detail_type" value="3"}特急{/eq} +
            来文单位{$detail.address}来文日期{$detail.detail_time}
            文件摘要{$detail.content}
            备注{$detail.remark}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            +
            + +
            +
            {$vo.name}
            +
            {:to_size($vo.filesize)},{$vo.create_time|date='Y-m-d H:i'}
            +
            +
            + +
            +
            +
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_huiyishi2.html b/jun_pc_web/oa/approve/2/view_huiyishi2.html new file mode 100644 index 000000000..6c288c32a --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_huiyishi2.html @@ -0,0 +1,37 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            会议室预定审批

            + + + + + + + + + + + + + +
            会议室 + {volist name=":oa_meeting_cate()" id="vo"} + {eq name="$detail.detail_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            预定时间{$detail.start_time_hour} 至 {$detail.end_time_hour}
            备注{$detail.remark}
            + + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_huodong2.html b/jun_pc_web/oa/approve/2/view_huodong2.html new file mode 100644 index 000000000..174fd7189 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_huodong2.html @@ -0,0 +1,48 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            活动经费审批

            + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            活动名称{$detail.name}活动预算{$detail.amount}活动日期{$detail.start_time_hour} 至 {$detail.end_time_hour}
            活动说明{$detail.content}
            备注{$detail.remark}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_jiaban2.html b/jun_pc_web/oa/approve/2/view_jiaban2.html new file mode 100644 index 000000000..e40fbc9be --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_jiaban2.html @@ -0,0 +1,31 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            加班申请审批

            + + + + + + + + + + + +
            加班时间{$detail.start_time} 的{$detail.start_time_span==1?'上午':'下午'} 至 {$detail.end_time} 的{$detail.end_time_span==1?'上午':'下午'}请假天数共{$detail.duration}天
            加班事由{$detail.content}
            + + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_jiangli2.html b/jun_pc_web/oa/approve/2/view_jiangli2.html new file mode 100644 index 000000000..8abd612b2 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_jiangli2.html @@ -0,0 +1,46 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            奖励申请审批

            + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            奖励金额{$detail.amount}奖励日期{$detail.detail_time}
            奖励事由{$detail.content}
            备注{$detail.remark}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_jiekuan2.html b/jun_pc_web/oa/approve/2/view_jiekuan2.html new file mode 100644 index 000000000..31935293a --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_jiekuan2.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            借款申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + +
            借款金额{$detail.amount}借款类型 + {volist name=":oa_cost_cate()" id="vo"} + {eq name="$detail.detail_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 申请日期{$detail.detail_time}
            借款人{$detail.name}银行账号{$detail.bank}开户行{$detail.address}
            借款事由{$detail.content}
            备注{$detail.remark}
            + + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_lizhi2.html b/jun_pc_web/oa/approve/2/view_lizhi2.html new file mode 100644 index 000000000..d5157e7de --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_lizhi2.html @@ -0,0 +1,62 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            离职申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            员工姓名{$detail.name}入职日期{$detail.detail_time}
            所在部门 + {volist name=":get_department()" id="vo"} + {eq name="$detail.department_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 担任职务 + {volist name=":get_position()" id="vo"} + {eq name="$detail.position_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            申请离职日期{$detail.start_time}预计离职日期{$detail.end_time}
            申请离职原因{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_qingjia2.html b/jun_pc_web/oa/approve/2/view_qingjia2.html new file mode 100644 index 000000000..0aaca2f16 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_qingjia2.html @@ -0,0 +1,54 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            请假审批

            + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            请假类型 + {eq name="$detail.detail_type" value="1"}事假{/eq} + {eq name="$detail.detail_type" value="2"}年假{/eq} + {eq name="$detail.detail_type" value="3"}调休假{/eq} + {eq name="$detail.detail_type" value="4"}病假{/eq} + {eq name="$detail.detail_type" value="5"}婚假{/eq} + {eq name="$detail.detail_type" value="6"}丧假{/eq} + {eq name="$detail.detail_type" value="7"}产假{/eq} + {eq name="$detail.detail_type" value="8"}陪产假{/eq} + {eq name="$detail.detail_type" value="9"}其他{/eq} + 请假日期{$detail.start_time} 的{$detail.start_time_span==1?'上午':'下午'} 至 {$detail.end_time} 的{$detail.end_time_span==1?'上午':'下午'}请假天数共{$detail.duration}天
            请假事由{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_ruzhi2.html b/jun_pc_web/oa/approve/2/view_ruzhi2.html new file mode 100644 index 000000000..113396c1e --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_ruzhi2.html @@ -0,0 +1,54 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            入职申请审批

            + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名{$detail.name}入职日期{$detail.detail_time}
            手机号码{$detail.num}性别 + {eq name="$detail.other_type" value="1"}男{/eq} + {eq name="$detail.other_type" value="2"}女{/eq} +
            入职部门 + {volist name=":get_department()" id="vo"} + {eq name="$detail.department_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 担任职务 + {volist name=":get_position()" id="vo"} + {eq name="$detail.position_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            备注{$detail.remark}
            + + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_script2.html b/jun_pc_web/oa/approve/2/view_script2.html new file mode 100644 index 000000000..7ce9649eb --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_script2.html @@ -0,0 +1,204 @@ + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_step2.html b/jun_pc_web/oa/approve/2/view_step2.html new file mode 100644 index 000000000..e38495f4c --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_step2.html @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + {notempty name="$check_record"} + + + + + {/notempty} + {if ( $detail.check_status lt 2) AND ( $is_check_admin eq 1) } + {eq name="$flows.flow_type" value="0"} + + + + + {/eq} + + + + + {/if} +
            审核状态{eq name="$detail.check_status" value="0"}待审批{/eq} + {eq name="$detail.check_status" value="1"}审批中{/eq} + {eq name="$detail.check_status" value="2"}已通过{/eq} + {eq name="$detail.check_status" value="3"}已拒绝{/eq} + {eq name="$detail.check_status" value="4"}已撤销{/eq} + 当前审核人{$detail.check_user}抄送人{$detail.copy_user}
            审批流程 +
            +
            + +
            {$detail.create_user}
            +
            创建
            + +
            +
            +
            审批记录 +
              + {volist name="$check_record" id="vo"} +
            • + +

              {$vo.check_time_str}{$vo.name}{$vo.status_str}了此申请。操作意见:{$vo.content}

              +
            • + {/volist} +
            +
            审批节点 * + + +
            + +
            +
            审批意见 * + +
            + + + +
            + {if ( $detail.check_status lt 2)} + {eq name="$is_check_admin" value='1'} + 通过 + {$flows.flow_type == 5?'回退':'拒绝'} + {/eq} + {eq name="$is_create_admin" value='1'} + 撤回 + {/eq} + {/if} + {if ( $detail.check_status gt 2) AND ( $is_create_admin eq 1) } + 重新编辑 + {/if} +
            \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_style2.html b/jun_pc_web/oa/approve/2/view_style2.html new file mode 100644 index 000000000..972eab8c0 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_style2.html @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_tongyong2.html b/jun_pc_web/oa/approve/2/view_tongyong2.html new file mode 100644 index 000000000..dd0f6b57e --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_tongyong2.html @@ -0,0 +1,46 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            通用审批

            + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            紧急程度 + {eq name="$detail.detail_type" value="1"}普通{/eq} + {eq name="$detail.detail_type" value="2"}紧急{/eq} + {eq name="$detail.detail_type" value="3"}特急{/eq} + 审批内容{$detail.name}
            审批详细描述{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_waichu2.html b/jun_pc_web/oa/approve/2/view_waichu2.html new file mode 100644 index 000000000..486b561a4 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_waichu2.html @@ -0,0 +1,46 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            外出审批

            + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            外出地点{$detail.address}
            外出日期{$detail.start_time} 的{$detail.start_time_span==1?'上午':'下午'} 至 {$detail.end_time} 的{$detail.end_time_span==1?'上午':'下午'}外出天数共{$detail.duration}天
            外出事由{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_weixiu2.html b/jun_pc_web/oa/approve/2/view_weixiu2.html new file mode 100644 index 000000000..8954d989d --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_weixiu2.html @@ -0,0 +1,52 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            物品维修审批

            + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            紧急程度 + {eq name="$detail.detail_type" value="1"}普通{/eq} + {eq name="$detail.detail_type" value="2"}紧急{/eq} + {eq name="$detail.detail_type" value="3"}特急{/eq} + 故障设备名称{$detail.name}
            报修日期{$detail.detail_time}预计维修费用{$detail.amount}
            故障描述{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_yongche2.html b/jun_pc_web/oa/approve/2/view_yongche2.html new file mode 100644 index 000000000..2b2a0ba16 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_yongche2.html @@ -0,0 +1,41 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            用车审批

            + + + + + + + + + + + + + + + + + +
            用车时间{$detail.start_time} 的{$detail.start_time_span==1?'上午':'下午'} 至 {$detail.end_time} 的{$detail.end_time_span==1?'上午':'下午'}用车天数共{$detail.duration}天
            目的地{$detail.address}车辆 + {volist name=":oa_car_cate()" id="vo"} + {eq name="$detail.detail_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            用车事由{$detail.content}
            + + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_yongcheguihai2.html b/jun_pc_web/oa/approve/2/view_yongcheguihai2.html new file mode 100644 index 000000000..027421852 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_yongcheguihai2.html @@ -0,0 +1,41 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            用车归还审批

            + + + + + + + + + + + + + + + + + +
            车辆 + {volist name=":oa_car_cate()" id="vo"} + {eq name="$detail.detail_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 用车前公里数{$detail.num}
            归还时间{$detail.detail_time}用车后公里数{$detail.num1}
            备注{$detail.remark}
            + + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_yongzhang2.html b/jun_pc_web/oa/approve/2/view_yongzhang2.html new file mode 100644 index 000000000..4fdab33a2 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_yongzhang2.html @@ -0,0 +1,63 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            用章审批

            + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            用印日期{$detail.detail_time}印章类型 + {volist name=":oa_seal_cate()" id="vo"} + {eq name="$detail.detail_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            文件名称{$detail.name}
            文件类型 + {eq name="$detail.other_type" value="1"}公告类{/eq} + {eq name="$detail.other_type" value="2"}规则制度类{/eq} + {eq name="$detail.other_type" value="3"}合同类{/eq} + {eq name="$detail.other_type" value="4"}资质更新类{/eq} + {eq name="$detail.other_type" value="5"}员工证明{/eq} + {eq name="$detail.other_type" value="6"}其他{/eq} + 文件份数{$detail.num}
            用印事由{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_zhaopin2.html b/jun_pc_web/oa/approve/2/view_zhaopin2.html new file mode 100644 index 000000000..1e393047f --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_zhaopin2.html @@ -0,0 +1,60 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            招聘需求审批

            + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            招聘部门 + {volist name=":get_department()" id="vo"} + {eq name="$detail.department_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 招聘岗位 + {volist name=":get_position()" id="vo"} + {eq name="$detail.position_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            招聘人数{$detail.num}期望到岗日期{$detail.detail_time}
            岗位职责{$detail.content}
            任职要求{$detail.remark}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_zhuangang2.html b/jun_pc_web/oa/approve/2/view_zhuangang2.html new file mode 100644 index 000000000..4f658c6b9 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_zhuangang2.html @@ -0,0 +1,76 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            转岗申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            员工姓名{$detail.name}入职日期{$detail.detail_time}
            当前所在部门 + {volist name=":get_department()" id="vo"} + {eq name="$detail.department_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 当前担任职务 + {volist name=":get_position()" id="vo"} + {eq name="$detail.position_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            转岗后部门 + {volist name=":get_department()" id="vo"} + {eq name="$detail.num" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 转岗后职务 + {volist name=":get_position()" id="vo"} + {eq name="$detail.num1" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            申请转岗日期{$detail.start_time}预计转岗日期{$detail.end_time}
            申请转岗原因{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_zhuanzheng2.html b/jun_pc_web/oa/approve/2/view_zhuanzheng2.html new file mode 100644 index 000000000..c902ef6e5 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_zhuanzheng2.html @@ -0,0 +1,56 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            转正申请审批

            + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
            员工姓名{$detail.name}转正日期{$detail.detail_time}
            所在部门 + {volist name=":get_department()" id="vo"} + {eq name="$detail.department_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} + 担任职务 + {volist name=":get_position()" id="vo"} + {eq name="$detail.position_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            试用期评价{$detail.content}
            相关附件 +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/2/view_zizhi2.html b/jun_pc_web/oa/approve/2/view_zizhi2.html new file mode 100644 index 000000000..45f9cba10 --- /dev/null +++ b/jun_pc_web/oa/approve/2/view_zizhi2.html @@ -0,0 +1,71 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} +{include file="/approve/view_style" /} +{/block} + +{block name="body"} + +

            资质借用审批

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            借用人{$detail.name}借用人手机{$detail.mobile}
            借用部门 + {volist name=":get_department()" id="vo"} + {eq name="$detail.department_type" value="$vo.id"}{$vo.title}{/eq} + {/volist} +
            借用类型 + {eq name="$detail.detail_type" value="1"}原件{/eq} + {eq name="$detail.detail_type" value="2"}扫描件{/eq} + {eq name="$detail.detail_type" value="3"}复印件{/eq} + 档案类型 + {eq name="$detail.other_type" value="1"}公司资质{/eq} + {eq name="$detail.other_type" value="2"}人员资质{/eq} + {eq name="$detail.other_type" value="3"}离职/清退人员资质{/eq} + {eq name="$detail.other_type" value="4"}注册人员执业印章{/eq} + {eq name="$detail.other_type" value="5"}劳动合同{/eq} + {eq name="$detail.other_type" value="6"}社保缴费记录{/eq} + {eq name="$detail.other_type" value="7"}收入证明{/eq} + {eq name="$detail.other_type" value="8"}其它{/eq} +
            所借档案用途{$detail.content}
            借用日期{$detail.start_time|date='Y-m-d'}拟归还日期{$detail.end_time|date='Y-m-d'}
            借用档案明细{$detail.remark}
            备注{$detail.remark1}
            + {include file="/approve/view_step" /} + +{/block} + + + +{block name="script"} +{include file="/approve/view_script" /} +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/add.html b/jun_pc_web/oa/approve/add.html new file mode 100644 index 000000000..36383df12 --- /dev/null +++ b/jun_pc_web/oa/approve/add.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            请假申请

            + + + + + + + + + + + + + + + + + + + + + + + +
            请假类型* + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            请假天数-
            请假事由* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add1.html b/jun_pc_web/oa/approve/add1.html new file mode 100644 index 000000000..36383df12 --- /dev/null +++ b/jun_pc_web/oa/approve/add1.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            请假申请

            + + + + + + + + + + + + + + + + + + + + + + + +
            请假类型* + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            请假天数-
            请假事由* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add10.html b/jun_pc_web/oa/approve/add10.html new file mode 100644 index 000000000..5304b2b9d --- /dev/null +++ b/jun_pc_web/oa/approve/add10.html @@ -0,0 +1,312 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            用车审批

            + + + + + + + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            用车天数-
            用车目的地*车辆选择* + +
            用车事由* + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add11.html b/jun_pc_web/oa/approve/add11.html new file mode 100644 index 000000000..8f53140f4 --- /dev/null +++ b/jun_pc_web/oa/approve/add11.html @@ -0,0 +1,231 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            用车归还审批

            + + + + + + + + + + + + + + + + + +
            车辆选择* + + 归还时间* + +
            用车前公里数*用车后公里数*
            备注 + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add12.html b/jun_pc_web/oa/approve/add12.html new file mode 100644 index 000000000..d35ca409d --- /dev/null +++ b/jun_pc_web/oa/approve/add12.html @@ -0,0 +1,248 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            借款申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + +
            借款金额*借款类型* + + 申请日期* + +
            借款人*银行账号*开户行* + +
            借款事由* + +
            备注 + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add13.html b/jun_pc_web/oa/approve/add13.html new file mode 100644 index 000000000..bc01d5c4e --- /dev/null +++ b/jun_pc_web/oa/approve/add13.html @@ -0,0 +1,264 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            付款申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            付款金额*付款方式* + + 付款日期* + +
            收款人全称*银行账号开户行 + +
            付款事由* + +
            备注 + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add14.html b/jun_pc_web/oa/approve/add14.html new file mode 100644 index 000000000..bf568e213 --- /dev/null +++ b/jun_pc_web/oa/approve/add14.html @@ -0,0 +1,241 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            奖励申请审批

            + + + + + + + + + + + + + + + + + + + +
            奖励金额*奖励日期* + +
            奖励事由* + +
            备注 + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add15.html b/jun_pc_web/oa/approve/add15.html new file mode 100644 index 000000000..53a8defa0 --- /dev/null +++ b/jun_pc_web/oa/approve/add15.html @@ -0,0 +1,247 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            采购申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + +
            物品名称*期望交互日期* + +
            采购数量*采购金额*
            采购事由* + +
            备注 + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add16.html b/jun_pc_web/oa/approve/add16.html new file mode 100644 index 000000000..43d304259 --- /dev/null +++ b/jun_pc_web/oa/approve/add16.html @@ -0,0 +1,250 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            活动经费审批

            + + + + + + + + + + + + + + + + + + + + + + + + + +
            活动名称*活动预算*
            活动说明* + +
            开始时间* + + 结束时间* + +
            备注 + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add17.html b/jun_pc_web/oa/approve/add17.html new file mode 100644 index 000000000..7b265b429 --- /dev/null +++ b/jun_pc_web/oa/approve/add17.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            入职申请审批

            + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名*入职日期* + +
            手机号码*性别* + + +
            入职部门* + + 担任职务* + +
            备注 + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add18.html b/jun_pc_web/oa/approve/add18.html new file mode 100644 index 000000000..074aa5a00 --- /dev/null +++ b/jun_pc_web/oa/approve/add18.html @@ -0,0 +1,270 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            转正申请审批

            + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 转正日期* + +
            所在部门* + + 担任职务* + +
            试用期评价* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add19.html b/jun_pc_web/oa/approve/add19.html new file mode 100644 index 000000000..7bfec8400 --- /dev/null +++ b/jun_pc_web/oa/approve/add19.html @@ -0,0 +1,277 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            离职申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 入职日期* + +
            所在部门* + + 担任职务* + +
            申请离职日期*预计离职日期* + +
            离职原因* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add2.html b/jun_pc_web/oa/approve/add2.html new file mode 100644 index 000000000..c7a3b0ac2 --- /dev/null +++ b/jun_pc_web/oa/approve/add2.html @@ -0,0 +1,311 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            出差审批

            + + + + + + + + + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            出差天数-
            出差地点*
            出差事由* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add20.html b/jun_pc_web/oa/approve/add20.html new file mode 100644 index 000000000..c213efa55 --- /dev/null +++ b/jun_pc_web/oa/approve/add20.html @@ -0,0 +1,309 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            转岗申请审批

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            员工姓名* + + + 入职日期* + +
            当前所在部门* + + 当前担任职务* + +
            转岗后部门* + + 转岗后职务* + +
            申请转岗日期*预计转岗日期* + +
            转岗原因* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add21.html b/jun_pc_web/oa/approve/add21.html new file mode 100644 index 000000000..223bf478a --- /dev/null +++ b/jun_pc_web/oa/approve/add21.html @@ -0,0 +1,277 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            招聘需求审批

            + + + + + + + + + + + + + + + + + + + + + + + + + +
            招聘部门* + + 期望到岗日期* + +
            招聘岗位* + + 招聘人数* + +
            岗位职责* + +
            任职要求* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add22.html b/jun_pc_web/oa/approve/add22.html new file mode 100644 index 000000000..9194e8873 --- /dev/null +++ b/jun_pc_web/oa/approve/add22.html @@ -0,0 +1,232 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            通用审批

            + + + + + + + + + + + + + + + +
            审批内容*紧急程度* + +
            详细描述* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add23.html b/jun_pc_web/oa/approve/add23.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add24.html b/jun_pc_web/oa/approve/add24.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add25.html b/jun_pc_web/oa/approve/add25.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add26.html b/jun_pc_web/oa/approve/add26.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add27.html b/jun_pc_web/oa/approve/add27.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add28.html b/jun_pc_web/oa/approve/add28.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add29.html b/jun_pc_web/oa/approve/add29.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add3.html b/jun_pc_web/oa/approve/add3.html new file mode 100644 index 000000000..b594ac9d5 --- /dev/null +++ b/jun_pc_web/oa/approve/add3.html @@ -0,0 +1,311 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            外出审批

            + + + + + + + + + + + + + + + + + + + + + + + +
            外出地点*
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            外出天数-
            外出事由* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add30.html b/jun_pc_web/oa/approve/add30.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/approve/add4.html b/jun_pc_web/oa/approve/add4.html new file mode 100644 index 000000000..5e2ea8e88 --- /dev/null +++ b/jun_pc_web/oa/approve/add4.html @@ -0,0 +1,299 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            加班申请审批

            + + + + + + + + + + + + + + + +
            开始时间* +
            + +
            +
            + + +
            +
            结束时间* +
            + +
            +
            + + +
            +
            加班天数-
            加班事由* + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add5.html b/jun_pc_web/oa/approve/add5.html new file mode 100644 index 000000000..bc12a4026 --- /dev/null +++ b/jun_pc_web/oa/approve/add5.html @@ -0,0 +1,231 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            会议室预定审批

            + + + + + + + + + + + + + +
            会议室选择* + + 开始时间* + + 结束时间* + +
            备注 + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add6.html b/jun_pc_web/oa/approve/add6.html new file mode 100644 index 000000000..4b8f0c0d8 --- /dev/null +++ b/jun_pc_web/oa/approve/add6.html @@ -0,0 +1,236 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            公文流转审批

            + + + + + + + + + + + + + + + + + + + + + +
            文件名称*紧急程度* + +
            来文单位*来文日期* + +
            文件摘要* +
            备注 + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add7.html b/jun_pc_web/oa/approve/add7.html new file mode 100644 index 000000000..e2aab9c88 --- /dev/null +++ b/jun_pc_web/oa/approve/add7.html @@ -0,0 +1,247 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            物品维修审批

            + + + + + + + + + + + + + + + + + + + + + +
            故障设备名称*紧急程度* + +
            预计维修费用*报修日期* + +
            故障描述* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add8.html b/jun_pc_web/oa/approve/add8.html new file mode 100644 index 000000000..17bae4144 --- /dev/null +++ b/jun_pc_web/oa/approve/add8.html @@ -0,0 +1,293 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            资质借用审批

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            借用人* + + 借用人手机*
            借用部门* + +
            借用类型* + + 档案类型* + +
            所借档案用途* +
            借用日期* + + 拟归还日期* + +
            借用档案明细* + + +
            备注 + +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/add9.html b/jun_pc_web/oa/approve/add9.html new file mode 100644 index 000000000..8c89daa4c --- /dev/null +++ b/jun_pc_web/oa/approve/add9.html @@ -0,0 +1,265 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            用章审批

            + + + + + + + + + + + + + + + + + + + + + + + + + +
            用印日期* + + 印章类型* + +
            文件名称*
            文件类型* + + 文件份数* + +
            用印事由* + +
            附件
            +
            + +
            +
            + + + + + + + + + + + + + +
            选择审批流程* + +
            审核人* + +
            抄送人 + +
            +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/copy.html b/jun_pc_web/oa/approve/copy.html new file mode 100644 index 000000000..697fdef1f --- /dev/null +++ b/jun_pc_web/oa/approve/copy.html @@ -0,0 +1,153 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/copy.json b/jun_pc_web/oa/approve/copy.json new file mode 100644 index 000000000..f581ceb4b --- /dev/null +++ b/jun_pc_web/oa/approve/copy.json @@ -0,0 +1 @@ +{"code":0,"msg":"","count":0,"data":[]} \ No newline at end of file diff --git a/jun_pc_web/oa/approve/copy2.html b/jun_pc_web/oa/approve/copy2.html new file mode 100644 index 000000000..624d800fe --- /dev/null +++ b/jun_pc_web/oa/approve/copy2.html @@ -0,0 +1,93 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/index.html b/jun_pc_web/oa/approve/index.html new file mode 100644 index 000000000..dffe6c5c6 --- /dev/null +++ b/jun_pc_web/oa/approve/index.html @@ -0,0 +1,185 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +
            +
            +
            +

            审批新申请

            +
            假勤
            +
            +
            +
            请假
            +
            出差
            +
            外出
            +
            加班
            +
            +
            +
            行政
            +
            +
            +
            会议室预定
            +
            公文流转
            +
            物品维修
            +
            资质借用
            +
            用章
            +
            用车
            +
            用车归还
            +
            +
            +
            财务
            +
            +
            +
            借款
            +
            付款
            +
            奖励
            +
            采购
            +
            活动经费
            +
            +
            +
            人事
            +
            +
            +
            入职
            +
            转正
            +
            离职
            +
            转岗
            +
            招聘需求
            +
            +
            +
            其他
            +
            +
            +
            通用审批
            +
            +
            +
            +
            +
            +
            +
            +
              +
            • 全部
            • +
            • 待审批
            • +
            • 审批通过
            • +
            • 审批拒绝
            • +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/index.json b/jun_pc_web/oa/approve/index.json new file mode 100644 index 000000000..944ecdec8 --- /dev/null +++ b/jun_pc_web/oa/approve/index.json @@ -0,0 +1,807 @@ +{ + "code": 0, + "msg": "", + "count": 22, + "data": [ + { + "id": 824, + "type": 1, + "flow_id": 1, + "content": "1224", + "name": "叶小钗11", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1703779200, + "start_time_span": 1, + "end_time": 1703865600, + "end_time_span": 2, + "duration": "2.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-12-28 08:36", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 705, + "type": 1, + "flow_id": 1, + "content": "咳嗽", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1701187200, + "start_time_span": 1, + "end_time": 1701187200, + "end_time_span": 2, + "duration": "1.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 4, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-11-29 16:03", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 689, + "type": 4, + "flow_id": 4, + "content": "SDFA", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1700928000, + "start_time_span": 1, + "end_time": 1701100800, + "end_time_span": 2, + "duration": "3.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "4", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 0, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-11-26 20:03", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "加班", + "check_user": "风采铃" + }, + { + "id": 684, + "type": 1, + "flow_id": 1, + "content": "3421432", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1700668800, + "start_time_span": 1, + "end_time": 1701100800, + "end_time_span": 1, + "duration": "5.5", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-11-24 10:50", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 680, + "type": 1, + "flow_id": 1, + "content": "11111", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1699459200, + "start_time_span": 1, + "end_time": 1700755200, + "end_time_span": 2, + "duration": "16.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-11-22 21:00", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 675, + "type": 1, + "flow_id": 1, + "content": "家中有事情", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1700496000, + "start_time_span": 2, + "end_time": 1700496000, + "end_time_span": 2, + "duration": "0.5", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-11-21 17:50", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 667, + "type": 15, + "flow_id": 15, + "content": "购买脸盆用于喝茶", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 1699372800, + "start_time": 0, + "start_time_span": 0, + "end_time": 0, + "end_time_span": 0, + "duration": "0.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "33", + "flow_admin_ids": "", + "copy_uids": "66", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 0, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 13, + "num1": 0, + "amount": "26.00", + "create_time": "2023-11-17 15:11", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "采购", + "check_user": "慕少艾" + }, + { + "id": 647, + "type": 1, + "flow_id": 1, + "content": "asdasd", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1699545600, + "start_time_span": 0, + "end_time": 1700236800, + "end_time_span": 0, + "duration": "48.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-11-10 15:23", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 597, + "type": 1, + "flow_id": 1, + "content": "粗去玩", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1698796800, + "start_time_span": 0, + "end_time": 1698854400, + "end_time_span": 0, + "duration": "8.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33,5", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-10-31 17:51", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 579, + "type": 7, + "flow_id": 7, + "content": "123", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 1697990400, + "start_time": 0, + "start_time_span": 0, + "end_time": 0, + "end_time_span": 0, + "duration": "0.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "51", + "flow_admin_ids": "", + "copy_uids": "4", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 2, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "123.00", + "create_time": "2023-10-23 23:22", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "物品维修", + "check_user": "照世明灯" + }, + { + "id": 484, + "type": 1, + "flow_id": 1, + "content": "1", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1695916800, + "start_time_span": 0, + "end_time": 1696003200, + "end_time_span": 0, + "duration": "8.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-09-15 06:47", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 424, + "type": 9, + "flow_id": 9, + "content": "11111", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 1692720000, + "start_time": 0, + "start_time_span": 0, + "end_time": 0, + "end_time_span": 0, + "duration": "0.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "5", + "flow_admin_ids": "", + "copy_uids": "", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 3, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 11111, + "num1": 0, + "amount": "0.00", + "create_time": "2023-08-29 22:44", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "用章", + "check_user": "玉辞心" + }, + { + "id": 385, + "type": 1, + "flow_id": 1, + "content": "无", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1692320400, + "start_time_span": 0, + "end_time": 1692493200, + "end_time_span": 0, + "duration": "8.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 3, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-08-18 10:07", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 332, + "type": 2, + "flow_id": 2, + "content": "大大", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1690905600, + "start_time_span": 0, + "end_time": 1692288180, + "end_time_span": 0, + "duration": "0.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "4", + "flow_admin_ids": "", + "copy_uids": "21", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 0, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "山东", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-08-02 17:47", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "出差", + "check_user": "风采铃" + }, + { + "id": 316, + "type": 1, + "flow_id": 1, + "content": "151", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1688659200, + "start_time_span": 0, + "end_time": 1689264005, + "end_time_span": 0, + "duration": "40.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33,2", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-07-29 21:41", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 315, + "type": 1, + "flow_id": 1, + "content": "是多少", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1688400000, + "start_time_span": 0, + "end_time": 1690560240, + "end_time_span": 0, + "duration": "152.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-07-29 21:39", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 177, + "type": 1, + "flow_id": 1, + "content": "awfsfras", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1689609600, + "start_time_span": 0, + "end_time": 1690560000, + "end_time_span": 0, + "duration": "72.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-07-10 16:15", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 150, + "type": 1, + "flow_id": 1, + "content": "test", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1688140800, + "start_time_span": 0, + "end_time": 1689177600, + "end_time_span": 0, + "duration": "64.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-07-01 09:08", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 104, + "type": 1, + "flow_id": 1, + "content": "test", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1687104000, + "start_time_span": 0, + "end_time": 1687795200, + "end_time_span": 0, + "duration": "16.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "88,105,60,68", + "flow_admin_ids": "", + "copy_uids": "33", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 2, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-06-19 15:42", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "请假", + "check_user": "欧阳翎,剑君十二恨,枫岫主人" + }, + { + "id": 43, + "type": 3, + "flow_id": 3, + "content": "大大是的", + "name": "叶小钗", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1686159000, + "start_time_span": 0, + "end_time": 1686240000, + "end_time_span": 0, + "duration": "6.0", + "admin_id": 7, + "department_id": 6, + "check_step_sort": 0, + "check_admin_ids": "5", + "flow_admin_ids": "", + "copy_uids": "10", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 0, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "A客户家里", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-06-08 05:01", + "update_time": 0, + "delete_time": 0, + "department_name": "技术部", + "flow_type": "外出", + "check_user": "玉辞心" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/oa/approve/index2.html b/jun_pc_web/oa/approve/index2.html new file mode 100644 index 000000000..f718e005f --- /dev/null +++ b/jun_pc_web/oa/approve/index2.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +
            +
            +
            +

            审批新申请

            + {volist name="type" id="v" offset="0" length='5'} +
            {$v.title}
            +
            +
            + {volist name="list" id="vo"} + {eq name="vo.type" value="$v.id"} +
            {$vo.title}
            + {/eq} + {/volist} +
            +
            + {/volist} +
            +
            +
            +
            +
            +
              +
            • 全部
            • +
            • 待审批
            • +
            • 审批通过
            • +
            • 审批拒绝
            • +
            +
            +
            +
            +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/list.html b/jun_pc_web/oa/approve/list.html new file mode 100644 index 000000000..8b6328b01 --- /dev/null +++ b/jun_pc_web/oa/approve/list.html @@ -0,0 +1,171 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            +
              +
            • 全部
            • +
            • 待我审批
            • +
            • 我已审批
            • +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            + +
            +
            + + +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/list.json b/jun_pc_web/oa/approve/list.json new file mode 100644 index 000000000..fd9f38e73 --- /dev/null +++ b/jun_pc_web/oa/approve/list.json @@ -0,0 +1,127 @@ +{ + "code": 0, + "msg": "", + "count": 3, + "data": [ + { + "id": 869, + "type": 6, + "flow_id": 6, + "content": "2222", + "name": "素还真", + "mobile": "", + "remark": "22222", + "remark1": "", + "detail_time": 1704902400, + "start_time": 0, + "start_time_span": 0, + "end_time": 0, + "end_time_span": 0, + "duration": "0.0", + "admin_id": 2, + "department_id": 1, + "check_step_sort": 0, + "check_admin_ids": "7", + "flow_admin_ids": "", + "copy_uids": "23", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 1, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "2", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2024-01-11 14:12", + "update_time": 0, + "delete_time": 0, + "department_name": "董事会", + "flow_type": "公文流转", + "check_user": "叶小钗" + }, + { + "id": 449, + "type": 3, + "flow_id": 3, + "content": "玩", + "name": "风采铃", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1693929600, + "start_time_span": 0, + "end_time": 1694016000, + "end_time_span": 0, + "duration": "8.0", + "admin_id": 4, + "department_id": 3, + "check_step_sort": 0, + "check_admin_ids": "7", + "flow_admin_ids": "", + "copy_uids": "", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 0, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "ssss", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-09-06 17:08", + "update_time": 0, + "delete_time": 0, + "department_name": "财务部", + "flow_type": "外出", + "check_user": "叶小钗" + }, + { + "id": 414, + "type": 4, + "flow_id": 4, + "content": "11", + "name": "素还真", + "mobile": "", + "remark": "", + "remark1": "", + "detail_time": 0, + "start_time": 1692201600, + "start_time_span": 0, + "end_time": 1692288000, + "end_time_span": 0, + "duration": "24.0", + "admin_id": 2, + "department_id": 1, + "check_step_sort": 0, + "check_admin_ids": "7", + "flow_admin_ids": "", + "copy_uids": "38", + "file_ids": "", + "check_status": 0, + "last_admin_id": "0", + "detail_type": 0, + "other_type": 0, + "department_type": 0, + "position_type": 0, + "bank": "", + "address": "", + "num": 0, + "num1": 0, + "amount": "0.00", + "create_time": "2023-08-28 09:52", + "update_time": 0, + "delete_time": 0, + "department_name": "董事会", + "flow_type": "加班", + "check_user": "叶小钗" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/oa/approve/list2.html b/jun_pc_web/oa/approve/list2.html new file mode 100644 index 000000000..9a53672e7 --- /dev/null +++ b/jun_pc_web/oa/approve/list2.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            +
            +
              +
            • 全部
            • +
            • 待我审批
            • +
            • 我已审批
            • +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            + +
            +
            + + +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/approve/view.html b/jun_pc_web/oa/approve/view.html new file mode 100644 index 000000000..6a021b988 --- /dev/null +++ b/jun_pc_web/oa/approve/view.html @@ -0,0 +1,357 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            公文流转审批

            + + + + + + + + + + + + + + + + + + + + + +
            文件名称1紧急程度 + 普通
            来文单位2来文日期2024-01-11
            文件摘要2222
            备注22222
            + + + + + + + + + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人叶小钗抄送人佛剑分说
            审批流程 +
            +
            + +
            素还真
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2024-01-11 14:12素还真提交了此申请。操作意见:提交申请

              +
            • +
            +
            审批节点 * + + +
            + +
            +
            审批意见 * + +
            + + + +
            + 通过 + 拒绝 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view3.html b/jun_pc_web/oa/approve/view3.html new file mode 100644 index 000000000..c4b2502f5 --- /dev/null +++ b/jun_pc_web/oa/approve/view3.html @@ -0,0 +1,347 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            加班申请审批

            + + + + + + + + + + + +
            加班时间2023-08-17 的下午 至 2023-08-18 的下午请假天数共24.0天
            加班事由11
            + + + + + + + + + + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人叶小钗抄送人收万劫
            审批流程 +
            +
            + +
            素还真
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-08-28 09:52素还真提交了此申请。操作意见:提交申请

              +
            • +
            +
            审批节点 * + + +
            + +
            +
            审批意见 * + +
            + + + +
            + 通过 + 拒绝 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_caigou.html b/jun_pc_web/oa/approve/view_caigou.html new file mode 100644 index 000000000..bb46fe4fa --- /dev/null +++ b/jun_pc_web/oa/approve/view_caigou.html @@ -0,0 +1,339 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            采购申请审批

            + + + + + + + + + + + + + + + + + + + + + +
            物品名称购买脸盆期望交付日期2023-11-08
            采购数量13采购金额26.00
            采购事由购买脸盆用于喝茶
            备注
            + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人慕少艾抄送人生命练习生
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-11-17 15:11叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_chuchai.html b/jun_pc_web/oa/approve/view_chuchai.html new file mode 100644 index 000000000..d100e50f4 --- /dev/null +++ b/jun_pc_web/oa/approve/view_chuchai.html @@ -0,0 +1,333 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            出差审批

            + + + + + + + + + + + + + + + +
            出差地点山东
            出差日期2023-08-02 的下午 至 2023-08-18 的下午出差天数共0.0天
            出差事由大大
            + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人风采铃抄送人印巧机
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-08-02 17:47叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_huiyishi.html b/jun_pc_web/oa/approve/view_huiyishi.html new file mode 100644 index 000000000..e503ff09a --- /dev/null +++ b/jun_pc_web/oa/approve/view_huiyishi.html @@ -0,0 +1,333 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            会议室预定审批

            + + + + + + + + + + + + + +
            会议室 + 会议室一
            预定时间2023-06-15 01:30:00 至 2023-06-15 02:00:00
            备注23123123
            + + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人刀兽抄送人刀兽,剑禽,业途灵,荫尸人,金蛾人,摩弗罗,印超机
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-06-02 13:46叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_jiaban.html b/jun_pc_web/oa/approve/view_jiaban.html new file mode 100644 index 000000000..46b6db535 --- /dev/null +++ b/jun_pc_web/oa/approve/view_jiaban.html @@ -0,0 +1,330 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            加班申请审批

            + + + + + + + + + + + +
            加班时间2023-11-26 的上午 至 2023-11-28 的下午请假天数共3.0天
            加班事由SDFA
            + + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人风采铃抄送人慕少艾
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-11-26 20:03叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_qingjia.html b/jun_pc_web/oa/approve/view_qingjia.html new file mode 100644 index 000000000..feb80a8dd --- /dev/null +++ b/jun_pc_web/oa/approve/view_qingjia.html @@ -0,0 +1,332 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            请假审批

            + + + + + + + + + + + + + +
            请假类型 + 事假 请假日期2023-12-29 的上午 至 2023-12-30 的下午请假天数共2.0天
            请假事由1224
            + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人欧阳翎,剑君十二恨,枫岫主人抄送人慕少艾
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-12-28 08:36叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_waichu.html b/jun_pc_web/oa/approve/view_waichu.html new file mode 100644 index 000000000..72fb0ed79 --- /dev/null +++ b/jun_pc_web/oa/approve/view_waichu.html @@ -0,0 +1,333 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            外出审批

            + + + + + + + + + + + + + + + +
            外出地点A客户家里
            外出日期2023-06-08 的下午 至 2023-06-09 的下午外出天数共6.0天
            外出事由大大是的
            + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人玉辞心抄送人秋分
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-06-08 05:01叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_weixiu.html b/jun_pc_web/oa/approve/view_weixiu.html new file mode 100644 index 000000000..08123cf17 --- /dev/null +++ b/jun_pc_web/oa/approve/view_weixiu.html @@ -0,0 +1,336 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            物品维修审批

            + + + + + + + + + + + + + + + + + +
            紧急程度 + 紧急 故障设备名称监控主机
            报修日期2023-10-23预计维修费用123.00
            故障描述123
            + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人照世明灯抄送人风采铃
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-10-23 23:22叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/approve/view_yongzhang.html b/jun_pc_web/oa/approve/view_yongzhang.html new file mode 100644 index 000000000..eb31fee27 --- /dev/null +++ b/jun_pc_web/oa/approve/view_yongzhang.html @@ -0,0 +1,341 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            用章审批

            + + + + + + + + + + + + + + + + + + + + + +
            用印日期2023-08-23印章类型 + 公章
            文件名称qqqq
            文件类型 + 合同类 文件份数11111
            用印事由11111
            + + + + + + + + + + + + + + + + + +
            审核状态待审批 当前审核人玉辞心抄送人-
            审批流程 +
            +
            + +
            叶小钗
            +
            创建
            + +
            +
            +
            审批记录 +
              + +
            • + +

              2023-08-29 22:44叶小钗提交了此申请。操作意见:提交申请

              +
            • +
            +
            + + + +
            + 撤回 +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/index.html b/jun_pc_web/oa/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/index.json b/jun_pc_web/oa/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/oa/plan/calendar.html b/jun_pc_web/oa/plan/calendar.html new file mode 100644 index 000000000..e3ae3d2a5 --- /dev/null +++ b/jun_pc_web/oa/plan/calendar.html @@ -0,0 +1,603 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + + +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/plan/calendar.json b/jun_pc_web/oa/plan/calendar.json new file mode 100644 index 000000000..8072813b4 --- /dev/null +++ b/jun_pc_web/oa/plan/calendar.json @@ -0,0 +1,12 @@ +[ + { + "id": 214, + "type": "1", + "remind_type": 6, + "backgroundColor": "#FFD3D3", + "borderColor": "#FF9999", + "title": "出差到济南", + "start": "2024-01-05 09:00:00", + "end": "2024-01-25 00:00:00" + } +] \ No newline at end of file diff --git a/jun_pc_web/oa/plan/calendar2.html b/jun_pc_web/oa/plan/calendar2.html new file mode 100644 index 000000000..96c483bc5 --- /dev/null +++ b/jun_pc_web/oa/plan/calendar2.html @@ -0,0 +1,564 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} + +
            +
            +
            +
            +
            +
            + +{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/plan/detail.json b/jun_pc_web/oa/plan/detail.json new file mode 100644 index 000000000..751555df8 --- /dev/null +++ b/jun_pc_web/oa/plan/detail.json @@ -0,0 +1,29 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": { + "id": 1, + "title": "11", + "type": "2", + "cid": 0, + "cmid": 0, + "ptid": 0, + "admin_id": 1, + "did": 1, + "start_time": "2024-01-18 09:00", + "end_time": "2024-01-25 00:00", + "remind_type": 0, + "remind_time": "-", + "remark": "111", + "delete_time": 0, + "create_time": "2024-01-18 11:15:09", + "update_time": 0, + "start_time_a": "2024-01-18", + "end_time_a": "2024-01-25", + "start_time_b": "09:00", + "end_time_b": "00:00", + "user": "超级员工" + } +} \ No newline at end of file diff --git a/jun_pc_web/oa/plan/index.html b/jun_pc_web/oa/plan/index.html new file mode 100644 index 000000000..f2ee19d50 --- /dev/null +++ b/jun_pc_web/oa/plan/index.html @@ -0,0 +1,526 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            + +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            + +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/plan/index.json b/jun_pc_web/oa/plan/index.json new file mode 100644 index 000000000..e0a4a4fa3 --- /dev/null +++ b/jun_pc_web/oa/plan/index.json @@ -0,0 +1,121 @@ +{ + "code": 0, + "msg": "", + "count": 6, + "data": [ + { + "id": 214, + "title": "出差到济南", + "type": "1", + "cid": 0, + "cmid": 0, + "ptid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2024-01-05 09:00", + "end_time": "2024-01-25 00:00", + "remind_type": 6, + "remind_time": "2024-01-04 09:00", + "remark": "出差到济南", + "delete_time": 0, + "create_time": "2024-01-04 14:33:39", + "update_time": null, + "create_admin": "叶小钗" + }, + { + "id": 190, + "title": "111", + "type": "1", + "cid": 0, + "cmid": 0, + "ptid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-12-14 09:00", + "end_time": "2023-12-14 18:00", + "remind_type": 0, + "remind_time": "-", + "remark": "111", + "delete_time": 0, + "create_time": "2023-12-14 16:10:12", + "update_time": null, + "create_admin": "叶小钗" + }, + { + "id": 143, + "title": "111", + "type": "1", + "cid": 0, + "cmid": 0, + "ptid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-10-25 09:00", + "end_time": "2023-10-31 00:00", + "remind_type": 0, + "remind_time": "-", + "remark": "111222222", + "delete_time": 0, + "create_time": "2023-10-24 16:22:39", + "update_time": null, + "create_admin": "叶小钗" + }, + { + "id": 141, + "title": "sdd", + "type": "1", + "cid": 0, + "cmid": 0, + "ptid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-10-26 09:00", + "end_time": "2023-10-28 18:00", + "remind_type": 0, + "remind_time": "-", + "remark": "二刀肉飞天狗", + "delete_time": 0, + "create_time": "2023-10-22 10:50:29", + "update_time": null, + "create_admin": "叶小钗" + }, + { + "id": 74, + "title": "ddddd", + "type": "1", + "cid": 0, + "cmid": 0, + "ptid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-07-20 09:00", + "end_time": "2023-07-28 21:30", + "remind_type": 0, + "remind_time": "-", + "remark": "dd", + "delete_time": 0, + "create_time": "2023-07-28 11:23:53", + "update_time": "2023-10-10 08:59:12", + "create_admin": "叶小钗" + }, + { + "id": 42, + "title": "1", + "type": "4", + "cid": 0, + "cmid": 0, + "ptid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-06-30 09:00", + "end_time": "2023-07-01 18:00", + "remind_type": 0, + "remind_time": "-", + "remark": "", + "delete_time": 0, + "create_time": "2023-06-30 14:29:06", + "update_time": "2023-10-10 08:59:21", + "create_admin": "叶小钗" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/oa/plan/index2.html b/jun_pc_web/oa/plan/index2.html new file mode 100644 index 000000000..010c07e8f --- /dev/null +++ b/jun_pc_web/oa/plan/index2.html @@ -0,0 +1,489 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/schedule/calendar.html b/jun_pc_web/oa/schedule/calendar.html new file mode 100644 index 000000000..c27f05810 --- /dev/null +++ b/jun_pc_web/oa/schedule/calendar.html @@ -0,0 +1,265 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + + +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/schedule/calendar.json b/jun_pc_web/oa/schedule/calendar.json new file mode 100644 index 000000000..33a9638fe --- /dev/null +++ b/jun_pc_web/oa/schedule/calendar.json @@ -0,0 +1,28 @@ +[ + { + "id": 198, + "labor_time": "3.00", + "backgroundColor": "#12bb37", + "borderColor": "#12bb37", + "title": "[3.00工时] 111", + "start": "2024-01-12 09:00:00", + "end": "2024-01-12 12:00:00" + }, + { + "id": 199, + "labor_time": "6.00", + "backgroundColor": "#12bb37", + "borderColor": "#12bb37", + "title": "[6.00工时] 333", + "start": "2024-01-12 13:00:00", + "end": "2024-01-12 19:00:00" + }, + { + "backgroundColor": "#eeeeee", + "borderColor": "#eeeeee", + "id": 0, + "title": "【当天总工时:9】", + "start": "2024-01-12", + "end": "2024-01-12" + } +] \ No newline at end of file diff --git a/jun_pc_web/oa/schedule/calendar2.html b/jun_pc_web/oa/schedule/calendar2.html new file mode 100644 index 000000000..aec9e8c86 --- /dev/null +++ b/jun_pc_web/oa/schedule/calendar2.html @@ -0,0 +1,226 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} + +
            +
            +
            +
            +
            +
            + +{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/schedule/detail.json b/jun_pc_web/oa/schedule/detail.json new file mode 100644 index 000000000..1b9f8105b --- /dev/null +++ b/jun_pc_web/oa/schedule/detail.json @@ -0,0 +1,30 @@ +{ + "code": 0, + "msg": "", + "action": "", + "url": "", + "data": { + "id": 1, + "title": "111", + "cid": 1, + "cmid": 0, + "ptid": 0, + "tid": 0, + "admin_id": 1, + "did": 1, + "start_time": "2024-01-16", + "end_time": "2024-01-16", + "labor_time": "0.50", + "labor_type": 1, + "remark": "11", + "delete_time": 0, + "create_time": "2024-01-18 11:25:29", + "update_time": 0, + "start_time_1": "09:00", + "end_time_1": "09:30", + "name": "超级员工", + "labor_type_string": "案头工作", + "department": "董事会", + "work_cate": "其他" + } +} \ No newline at end of file diff --git a/jun_pc_web/oa/schedule/index.html b/jun_pc_web/oa/schedule/index.html new file mode 100644 index 000000000..596ecb363 --- /dev/null +++ b/jun_pc_web/oa/schedule/index.html @@ -0,0 +1,277 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/schedule/index.json b/jun_pc_web/oa/schedule/index.json new file mode 100644 index 000000000..fccf65be0 --- /dev/null +++ b/jun_pc_web/oa/schedule/index.json @@ -0,0 +1,143 @@ +{ + "code": 0, + "msg": "", + "count": 5, + "data": [ + { + "id": 164, + "title": "11", + "cid": 1, + "cmid": 0, + "ptid": 0, + "tid": 1067, + "admin_id": 7, + "did": 6, + "start_time": "2023-11-30 09:00", + "end_time": "09:30", + "labor_time": "0.50", + "labor_type": 2, + "remark": "1", + "delete_time": 0, + "create_time": "2023-11-30 16:26:18", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "其他", + "labor_type_string": "外勤工作", + "task": "摄像头安装", + "project": "OA办公软件", + "start_time_a": "2023-11-30", + "start_time_b": "09:00", + "end_time_a": "2023-11-30", + "end_time_b": "09:30" + }, + { + "id": 139, + "title": "水渠勘察", + "cid": 4, + "cmid": 0, + "ptid": 0, + "tid": 1086, + "admin_id": 7, + "did": 6, + "start_time": "2023-11-15 09:00", + "end_time": "09:30", + "labor_time": "0.50", + "labor_type": 2, + "remark": "水渠勘察", + "delete_time": 0, + "create_time": "2023-11-15 09:57:36", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "需求调研", + "labor_type_string": "外勤工作", + "task": "水渠勘察", + "project": "测试水渠施工", + "start_time_a": "2023-11-15", + "start_time_b": "09:00", + "end_time_a": "2023-11-15", + "end_time_b": "09:30" + }, + { + "id": 113, + "title": "开发任务", + "cid": 3, + "cmid": 0, + "ptid": 0, + "tid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-10-13 08:30", + "end_time": "18:00", + "labor_time": "9.50", + "labor_type": 1, + "remark": "今日任务\n干活\n修电脑\n吃饭", + "delete_time": 0, + "create_time": "2023-10-13 15:54:10", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "撰写文档", + "labor_type_string": "案头工作", + "start_time_a": "2023-10-13", + "start_time_b": "08:30", + "end_time_a": "2023-10-13", + "end_time_b": "18:00" + }, + { + "id": 63, + "title": "2312123", + "cid": 1, + "cmid": 0, + "ptid": 0, + "tid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-08-09 09:00", + "end_time": "09:30", + "labor_time": "0.50", + "labor_type": 2, + "remark": "", + "delete_time": 0, + "create_time": "2023-08-09 18:50:37", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "其他", + "labor_type_string": "外勤工作", + "start_time_a": "2023-08-09", + "start_time_b": "09:00", + "end_time_a": "2023-08-09", + "end_time_b": "09:30" + }, + { + "id": 32, + "title": "问问", + "cid": 3, + "cmid": 0, + "ptid": 0, + "tid": 1023, + "admin_id": 7, + "did": 6, + "start_time": "2023-08-04 09:00", + "end_time": "20:30", + "labor_time": "11.50", + "labor_type": 1, + "remark": "", + "delete_time": 0, + "create_time": "2023-07-14 19:16:48", + "update_time": "2023-07-28 11:26:18", + "name": "叶小钗", + "department": "技术部", + "work_cate": "撰写文档", + "labor_type_string": "案头工作", + "task": "完成方案宾谢", + "project": "wangjiabing", + "start_time_a": "2023-08-04", + "start_time_b": "09:00", + "end_time_a": "2023-08-04", + "end_time_b": "20:30" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/oa/schedule/index2.html b/jun_pc_web/oa/schedule/index2.html new file mode 100644 index 000000000..e6f8934bf --- /dev/null +++ b/jun_pc_web/oa/schedule/index2.html @@ -0,0 +1,240 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/work/add1.html b/jun_pc_web/oa/work/add1.html new file mode 100644 index 000000000..f640d45b5 --- /dev/null +++ b/jun_pc_web/oa/work/add1.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            工作汇报

            + + + + + + + + + + + + + + + + + + + + + +
            接收人* + + + 汇报类型 + 日报
            今日工作* + +
            明日计划 + +
            其它事项 + +
            附件
            +
            + +
            +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/work/add2.html b/jun_pc_web/oa/work/add2.html new file mode 100644 index 000000000..37d865542 --- /dev/null +++ b/jun_pc_web/oa/work/add2.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            工作汇报

            + + + + + + + + + + + + + + + + + + + + + +
            接收人* + + + 汇报类型 + 周报
            本周工作* + +
            下周计划 + +
            其它事项 + +
            附件
            +
            + +
            +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/work/add3.html b/jun_pc_web/oa/work/add3.html new file mode 100644 index 000000000..ad1b6c12e --- /dev/null +++ b/jun_pc_web/oa/work/add3.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            工作汇报

            + + + + + + + + + + + + + + + + + + + + + +
            接收人* + + + 汇报类型 + 月报
            本月工作* + +
            下月计划 + +
            其它事项 + +
            附件
            +
            + +
            +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/work/index.html b/jun_pc_web/oa/work/index.html new file mode 100644 index 000000000..1262b2baf --- /dev/null +++ b/jun_pc_web/oa/work/index.html @@ -0,0 +1,329 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            +
              +
            • 发送的汇报
            • +
            • 接受的汇报
            • +
            +
            +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/work/index.json b/jun_pc_web/oa/work/index.json new file mode 100644 index 000000000..6e48e3ac4 --- /dev/null +++ b/jun_pc_web/oa/work/index.json @@ -0,0 +1,52 @@ +{ + "code": 0, + "msg": "", + "count": 3, + "data": [ + { + "id": 85, + "type": 2, + "type_user": "2", + "works": "1", + "plans": "", + "remark": "", + "admin_id": 7, + "create_time": "2023-11-30 16:23:43", + "update_time": null, + "status": 1, + "person_name": "素还真", + "type_title": "周报", + "files": 0 + }, + { + "id": 84, + "type": 1, + "type_user": "88", + "works": "完成oa部署", + "plans": "外出采购", + "remark": "", + "admin_id": 7, + "create_time": "2023-11-29 15:21:25", + "update_time": null, + "status": 1, + "person_name": "枫岫主人", + "type_title": "日报", + "files": 0 + }, + { + "id": 67, + "type": 1, + "type_user": "4", + "works": "全新风", + "plans": "采购", + "remark": "", + "admin_id": 7, + "create_time": "2023-10-22 11:11:10", + "update_time": "2023-11-29 15:19:38", + "status": 1, + "person_name": "风采铃", + "type_title": "日报", + "files": 0 + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/oa/work/index2.html b/jun_pc_web/oa/work/index2.html new file mode 100644 index 000000000..2f984ba40 --- /dev/null +++ b/jun_pc_web/oa/work/index2.html @@ -0,0 +1,290 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            +
            +
              +
            • 发送的汇报
            • +
            • 接受的汇报
            • +
            +
            +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            +
            +
            + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/oa/work/read.html b/jun_pc_web/oa/work/read.html new file mode 100644 index 000000000..7b40ac9b1 --- /dev/null +++ b/jun_pc_web/oa/work/read.html @@ -0,0 +1,142 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            汇报详情

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            汇报人叶小钗汇报类型周报汇报时间2023-11-30 16:23:43
            接收人素还真
            已读回执素还真
            工作内容 + 1
            工作计划 +
            其他事项 +
            +
            +

            工作点评

            +
            暂无工作点评
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/oa/work/read2.html b/jun_pc_web/oa/work/read2.html new file mode 100644 index 000000000..3a5e6b780 --- /dev/null +++ b/jun_pc_web/oa/work/read2.html @@ -0,0 +1,151 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} +{block name="body"} +
            +

            汇报详情

            + + + + + + + + + + + + + + {notempty name="$detail.read_users"} + + + + + {/notempty} + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
            汇报人{$detail.person_name}汇报类型{$detail.type_title}汇报时间{$detail.send_time}
            接收人{$detail.users}
            已读回执{$detail.read_users}
            工作内容 + {:nl2br($detail.works)} +
            工作计划 + {:nl2br($detail.plans)} +
            其他事项 + {:nl2br($detail.remark)} +
            相关附件 +
            + {volist name="$detail.file_array" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            +
            + {gt name="$detail.update_time" value="0"} +
            该汇报于 {$detail.update_time_str} 进行过编辑
            + {/gt} +
            +

            工作点评

            + {empty name="$detail.comment"} +
            暂无工作点评
            + {/empty} + {volist name="$detail.comment" id="vo"} +
            +
            +
            + {vo.name} +
            +
            +
            + {$vo.name}{$vo.create_time}{$vo.update_time} + {eq name="$vo.admin_id" value="$login_admin.id"} + + {/eq} +
            +
            {$vo.content}
            +
            +
            +
            + {/volist} + {eq name="$detail.comment_auth" value="1"} +
            + + +
            + +
            +
            + {/eq} +
            +
            +{/block} + + +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/jun_pc_web/page/tpl/tpl-lock-screen.html b/jun_pc_web/page/tpl/tpl-lock-screen.html new file mode 100644 index 000000000..c7a66da0f --- /dev/null +++ b/jun_pc_web/page/tpl/tpl-lock-screen.html @@ -0,0 +1,426 @@ +
            +
            +
            +
            + + +
            +
            +
            +
            +
            + +
            退出登录
            +
            +
            +
            + + + + + + \ No newline at end of file diff --git a/jun_pc_web/page/tpl/tpl-message.html b/jun_pc_web/page/tpl/tpl-message.html new file mode 100644 index 000000000..21080e103 --- /dev/null +++ b/jun_pc_web/page/tpl/tpl-message.html @@ -0,0 +1,252 @@ + + + + + diff --git a/jun_pc_web/page/tpl/tpl-note.html b/jun_pc_web/page/tpl/tpl-note.html new file mode 100644 index 000000000..5910e8617 --- /dev/null +++ b/jun_pc_web/page/tpl/tpl-note.html @@ -0,0 +1,206 @@ +
            本地便签
            +
            +
            + +

            没有便签

            +
            +
            + +
            + + + + \ No newline at end of file diff --git a/jun_pc_web/page/tpl/tpl-password.html b/jun_pc_web/page/tpl/tpl-password.html new file mode 100644 index 000000000..6e5cb2cd9 --- /dev/null +++ b/jun_pc_web/page/tpl/tpl-password.html @@ -0,0 +1,48 @@ + +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            + + +
            +
            +
            + + + \ No newline at end of file diff --git a/jun_pc_web/page/tpl/tpl-theme.html b/jun_pc_web/page/tpl/tpl-theme.html new file mode 100644 index 000000000..4b0d3de9d --- /dev/null +++ b/jun_pc_web/page/tpl/tpl-theme.html @@ -0,0 +1,226 @@ +
            主题设置
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + + + +
            +
            + +
            + +
            + +
            + +
            +
            +
            + +
            + +
            + +
            + +
            +
            +
            + +
            + + + +
            +
            +
            + + + + \ No newline at end of file diff --git a/jun_pc_web/project/document/add.html b/jun_pc_web/project/document/add.html new file mode 100644 index 000000000..78a2b90b6 --- /dev/null +++ b/jun_pc_web/project/document/add.html @@ -0,0 +1,219 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            新建文档

            + + + + + + + + + + + + + + + +
            文档名称* + + 关联项目* + +
            +
            关联附件
            +
            + +
            +
            +
            + +
            +
            文档内容* + +
            + +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/document/add2.html b/jun_pc_web/project/document/add2.html new file mode 100644 index 000000000..c750b3657 --- /dev/null +++ b/jun_pc_web/project/document/add2.html @@ -0,0 +1,134 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
            + {eq name="id" value ="0"} +

            新建文档

            + + + + + + + + + + + + + + + +
            文档名称* + + 关联项目* + +
            +
            关联附件
            +
            + +
            +
            +
            + +
            +
            文档内容* + +
            + + {else/} +

            编辑文档

            + + + + + + + + + + + + + + + +
            文档名称* + + + 关联项目* + +
            +
            关联附件
            +
            + +
            +
            +
            + + {notempty name="$detail.file_ids"} + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {/notempty} +
            +
            文档内容* + +
            + {/eq} +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/jun_pc_web/project/document/index.html b/jun_pc_web/project/document/index.html new file mode 100644 index 000000000..52509d94e --- /dev/null +++ b/jun_pc_web/project/document/index.html @@ -0,0 +1,194 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/document/index.json b/jun_pc_web/project/document/index.json new file mode 100644 index 000000000..55a1ec758 --- /dev/null +++ b/jun_pc_web/project/document/index.json @@ -0,0 +1,29 @@ +{ + "code": 0, + "msg": "", + "count": 2, + "data": [ + { + "id": 1039, + "project_id": 1002, + "admin_id": 7, + "title": "大胆点", + "create_time": "2023-11-29 17:24", + "update_time": 0, + "delete_time": 0, + "project_name": "测试项目2", + "admin_name": "叶小钗" + }, + { + "id": 1022, + "project_id": 1040, + "admin_id": 2, + "title": "aaaaaa", + "create_time": "2023-09-27 15:04", + "update_time": 0, + "delete_time": 0, + "project_name": "yougongTest", + "admin_name": "素还真" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/project/document/index2.html b/jun_pc_web/project/document/index2.html new file mode 100644 index 000000000..a85eaf901 --- /dev/null +++ b/jun_pc_web/project/document/index2.html @@ -0,0 +1,150 @@ +{extend name="../../base/view/common/base" /} + +{block name="style"} + +{/block} +{block name="body"} +
            +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/project/document/view2.html b/jun_pc_web/project/document/view2.html new file mode 100644 index 000000000..0c294a49c --- /dev/null +++ b/jun_pc_web/project/document/view2.html @@ -0,0 +1,56 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
            +

            {$detail.title}

            +
            + {$detail.admin_name}发表于:{$detail.create_time | date='Y-m-d H:i:s'}关联项目:{$detail.project_name} +
            +
            + {$detail.content|raw} +
            + {notempty name="$detail.file_ids"} +

            相关附件

            +
            + {volist name="$detail.fileArray" id="vo"} +
            {:file_card($vo,'view')}
            + {/volist} +
            + {/notempty} + +{/block} + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/project/index.html b/jun_pc_web/project/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/project/index.json b/jun_pc_web/project/index.json new file mode 100644 index 000000000..e69de29bb diff --git a/jun_pc_web/project/index/add.html b/jun_pc_web/project/index/add.html new file mode 100644 index 000000000..b03d051f6 --- /dev/null +++ b/jun_pc_web/project/index/add.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + + +

            新建项目

            + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            项目名称* + + 计划完成周期* +
            + +
            + - +
            + +
            +
            负责人* + + + 项目成员* + + +
            关联合同 + + + +
            项目简介* + +
            项目阶段*
            +
            +
            +
            + +
            + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + +
            +
            +
            +
            +
            + +
            + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + +
            +
            + 删除 +
            +
            +
            + +
            + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + +
            +
            + 删除 +
            +
            +
            + +
            + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + +
            +
            + 删除 +
            + +
            + + 添加自定义阶段 +
            +

            温馨提示

            +

            1、项目开始流转前,请确保已完善好各项目信息。

            +

            2、项目开始流转后,只有项目管理员,创建人和负责人可修改项目信息。

            +

            3、项目管理员,创建人和负责人可以修改项目阶段的信息,但是修改完成后已流转的项目阶段需要重新走一遍流程。

            +
            +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/index/add2.html b/jun_pc_web/project/index/add2.html new file mode 100644 index 000000000..d016884ca --- /dev/null +++ b/jun_pc_web/project/index/add2.html @@ -0,0 +1,342 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +

            新建项目

            + + + + + + + + + + + + + + {gt name=":isModule('contract')" value="0"} + + + + + {/gt} + + + + + + + + + + +
            项目名称* + + 计划完成周期* +
            + +
            + - +
            + +
            +
            负责人* + + + 项目成员* + + +
            关联合同 + + + +
            项目简介* + +
            项目阶段*
            +
            + {volist name = "$section" id="vo" key="k"} + {eq name="key" value="0"} +
            +
            + +
            + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + +
            +
            +
            + {else/} +
            +
            + +
            + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + +
            +
            + 删除 +
            + {/eq} + {/volist} +
            + + 添加自定义阶段 +
            +

            温馨提示

            +

            1、项目开始流转前,请确保已完善好各项目信息。

            +

            2、项目开始流转后,只有项目管理员,创建人和负责人可修改项目信息。

            +

            3、项目管理员,创建人和负责人可以修改项目阶段的信息,但是修改完成后已流转的项目阶段需要重新走一遍流程。

            +
            +
            +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/jun_pc_web/project/index/edit2.html b/jun_pc_web/project/index/edit2.html new file mode 100644 index 000000000..610770c9a --- /dev/null +++ b/jun_pc_web/project/index/edit2.html @@ -0,0 +1,222 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +

            编辑项目阶段

            + + + + + + + + + + + + + + {gt name="$detail.contract_id" value="0"} + + + + + {/gt} + + + + + + + + + + +
            项目名称*{$detail.name}计划完成周期{$detail.start_time_str} - {$detail.end_time_str}
            负责人{$detail.director_name}项目成员{$detail.team_admin_names}
            关联合同{$detail.contract}
            项目简介{$detail.content}
            项目阶段*
            +
            + {volist name="$step_array" id="vo"} +
            +
            + +
            + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + + +
            +
            +
            + +
            + +
            +
            +
            + {/volist} +
            + + 添加自定义阶段 +
            +

            温馨提示

            +

            1、项目开始流转前,请确保已完善好各项目信息。

            +

            2、项目开始流转后,只有项目负责人可修改项目信息。

            +

            3、项目负责人可以修改项目阶段的信息,但是修改完成后已流转的项目阶段需要重新走一遍流程。

            +
            +
            +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/jun_pc_web/project/index/index.html b/jun_pc_web/project/index/index.html new file mode 100644 index 000000000..df5aa7488 --- /dev/null +++ b/jun_pc_web/project/index/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/index/index.json b/jun_pc_web/project/index/index.json new file mode 100644 index 000000000..85cbc881a --- /dev/null +++ b/jun_pc_web/project/index/index.json @@ -0,0 +1,245 @@ +{ + "code": 0, + "msg": "", + "count": 10, + "data": [ + { + "id": 1077, + "name": "111s", + "customer_id": 0, + "contract_id": 0, + "admin_id": 6, + "director_uid": 7, + "start_time": 1701187200, + "end_time": 1703865600, + "status": 2, + "step_sort": 0, + "create_time": "2023-11-30 16:22:17", + "update_time": null, + "delete_time": 0, + "director_name": "叶小钗", + "plan_time": "2023-11-29 至 2023-12-30", + "status_name": "进行中", + "tasks_total": 0, + "tasks_finish": 0, + "tasks_unfinish": 0, + "tasks_pensent": "100%", + "step_user": "秦假仙", + "step": "立项阶段-秦假仙" + }, + { + "id": 1073, + "name": "测试项目都市时尚大方", + "customer_id": 0, + "contract_id": 0, + "admin_id": 7, + "director_uid": 33, + "start_time": 1700668800, + "end_time": 1703952000, + "status": 2, + "step_sort": 0, + "create_time": "2023-11-24 20:16:02", + "update_time": null, + "delete_time": 0, + "director_name": "慕少艾", + "plan_time": "2023-11-23 至 2023-12-31", + "status_name": "进行中", + "tasks_total": 1, + "tasks_finish": 0, + "tasks_unfinish": 1, + "tasks_pensent": "0%", + "step_user": "叶小钗", + "step": "立项阶段-叶小钗" + }, + { + "id": 1057, + "name": "test002", + "customer_id": 0, + "contract_id": 0, + "admin_id": 7, + "director_uid": 66, + "start_time": 1698249600, + "end_time": 1701360000, + "status": 2, + "step_sort": 0, + "create_time": "2023-10-26 18:11:13", + "update_time": null, + "delete_time": 0, + "director_name": "生命练习生", + "plan_time": "2023-10-26 至 2023-12-01", + "status_name": "进行中", + "tasks_total": 0, + "tasks_finish": 0, + "tasks_unfinish": 0, + "tasks_pensent": "100%", + "step_user": "叶小钗", + "step": "立项阶段-叶小钗" + }, + { + "id": 1051, + "name": "OA办公软件", + "customer_id": 0, + "contract_id": 0, + "admin_id": 7, + "director_uid": 5, + "start_time": 1697126400, + "end_time": 1703952000, + "status": 2, + "step_sort": 0, + "create_time": "2023-10-13 15:27:10", + "update_time": "2023-11-30 15:12:52", + "delete_time": 0, + "director_name": "玉辞心", + "plan_time": "2023-10-13 至 2023-12-31", + "status_name": "进行中", + "tasks_total": 1, + "tasks_finish": 0, + "tasks_unfinish": 1, + "tasks_pensent": "0%", + "step_user": "叶小钗", + "step": "立项阶段-叶小钗" + }, + { + "id": 1040, + "name": "yougongTest", + "customer_id": 0, + "contract_id": 0, + "admin_id": 4, + "director_uid": 7, + "start_time": 1694448000, + "end_time": 1698681600, + "status": 3, + "step_sort": 1, + "create_time": "2023-09-12 10:28:56", + "update_time": null, + "delete_time": 0, + "director_name": "叶小钗", + "plan_time": "2023-09-12 至 2023-10-31", + "status_name": "已完成", + "tasks_total": 3, + "tasks_finish": 1, + "tasks_unfinish": 2, + "tasks_pensent": "33.33%", + "step": "-" + }, + { + "id": 1034, + "name": "项目", + "customer_id": 0, + "contract_id": 0, + "admin_id": 7, + "director_uid": 7, + "start_time": 1693497600, + "end_time": 1698681600, + "status": 2, + "step_sort": 0, + "create_time": "2023-09-01 08:29:50", + "update_time": null, + "delete_time": 0, + "director_name": "叶小钗", + "plan_time": "2023-09-01 至 2023-10-31", + "status_name": "进行中", + "tasks_total": 0, + "tasks_finish": 0, + "tasks_unfinish": 0, + "tasks_pensent": "100%", + "step_user": "叶小钗", + "step": "立项阶段-叶小钗" + }, + { + "id": 1013, + "name": "wangjiabing", + "customer_id": 0, + "contract_id": 0, + "admin_id": 7, + "director_uid": 7, + "start_time": 1689264000, + "end_time": 1689609600, + "status": 3, + "step_sort": 2, + "create_time": "2023-07-14 19:15:31", + "update_time": "2023-07-26 15:48:40", + "delete_time": 0, + "director_name": "叶小钗", + "plan_time": "2023-07-14 至 2023-07-18", + "status_name": "已完成", + "tasks_total": 1, + "tasks_finish": 0, + "tasks_unfinish": 1, + "tasks_pensent": "0%", + "step": "-" + }, + { + "id": 1012, + "name": "43567890nnn", + "customer_id": 0, + "contract_id": 0, + "admin_id": 2, + "director_uid": 7, + "start_time": 1689091200, + "end_time": 1724256000, + "status": 2, + "step_sort": 2, + "create_time": "2023-07-13 16:35:26", + "update_time": "2023-07-26 15:49:45", + "delete_time": 0, + "director_name": "叶小钗", + "plan_time": "2023-07-12 至 2024-08-22", + "status_name": "进行中", + "tasks_total": 1, + "tasks_finish": 1, + "tasks_unfinish": 0, + "tasks_pensent": "100%", + "step_user": "洛子商", + "step": "验收阶段-洛子商" + }, + { + "id": 1008, + "name": "测试项目-1", + "customer_id": 0, + "contract_id": 0, + "admin_id": 2, + "director_uid": 4, + "start_time": 1685548800, + "end_time": 1690732800, + "status": 2, + "step_sort": 1, + "create_time": "2023-06-24 11:31:56", + "update_time": "2023-07-19 14:13:50", + "delete_time": 0, + "director_name": "风采铃", + "plan_time": "2023-06-01 至 2023-07-31", + "status_name": "进行中", + "tasks_total": 2, + "tasks_finish": 2, + "tasks_unfinish": 0, + "tasks_pensent": "100%", + "step_user": "照世明灯", + "step": "实施阶段-照世明灯" + }, + { + "id": 1002, + "name": "测试项目2", + "customer_id": 0, + "contract_id": 0, + "admin_id": 2, + "director_uid": 5, + "start_time": 1685548800, + "end_time": 1688140800, + "status": 2, + "step_sort": 0, + "create_time": "2023-06-06 09:24:31", + "update_time": "2023-10-12 12:43:45", + "delete_time": 0, + "director_name": "玉辞心", + "plan_time": "2023-06-01 至 2023-07-01", + "status_name": "进行中", + "tasks_total": 1, + "tasks_finish": 0, + "tasks_unfinish": 1, + "tasks_pensent": "0%", + "step_user": "张三", + "step": "立项阶段-张三" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/project/index/index2.html b/jun_pc_web/project/index/index2.html new file mode 100644 index 000000000..1836faf48 --- /dev/null +++ b/jun_pc_web/project/index/index2.html @@ -0,0 +1,100 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/project/index/view.html b/jun_pc_web/project/index/view.html new file mode 100644 index 000000000..c629d6365 --- /dev/null +++ b/jun_pc_web/project/index/view.html @@ -0,0 +1,1695 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +

            + OA办公软件 + +

            +
            + #P1051 + 叶小钗 + 创建于2023-10-13,最近更新于 2023-11-30 + 删除 +
            +
            + +
            +
              +
            • 项目概览
            • +
            • 项目任务
            • +
            • 工作记录
            • +
            • 项目文档
            • +
            • 项目人员
            • +
            • 项目动态
            • +
            • 项目评论
            • +
            +
            +
            +
            +
            +
            + 项目状态: + 『进行中』 + 负责人: + 玉辞心 + + 项目成员:玉辞心,叶小钗,照世明灯,屈世途
            +
            + 计划完成周期: + 2023-10-13 + 至     2023-12-31 + 关联合同: + + +
            +
            + 项目简介: + OA办公软件 + +
            +
            +
            + +
            +
            +
            +
            + 项目阶段 +
            + +
            +
            +
            + 当前阶段:立项阶段 负责人:叶小钗 成员:符应女,照世明灯 周期:2023-10-13 到 2023-10-20
            + 确认 +
            +
            +
            +
            +
            + +
            立项阶段
            +
            叶小钗
            + +
            +
            + +
            测试
            +
            谈无欲
            + +
            +
            +
            +
            +

            阶段流转记录

            +
            暂无记录
            +
            +
            + +
            +
            +
            +
            + 项目附件 +
            +
            + +
            +
            +
            +
            +
            暂无附件
            +
            +
            + +
            +
            +
            +
            + 关联链接 +
            +
            + +
            +
            +
            +
            + + + + + + + + + + + + + + + + + +
            链接URL链接说明添加人操作
            https://www.baidu.com百度叶小钗 +
            + + +
            +
            +
            +
            + +
            +
            +
            +
            + 项目概况 +
            +
            +
            +
            任务 (已完成/全部)
            +
            0 / 1
            +
            +
            +
            +
            +
            项目工时 (实际/计划)
            +
            0.5 / 2
            +
            +
            +
            +
            +
            工作记录
            +
            1
            +
            +
            +
            +
            +
            +
            +
            + 项目进度 +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + +
            +
            + 项目燃尽图 +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            + 任务分配情况 +
            +
            +
            +
            +
            +
            +
            +
            +
            + 工时登记情况 +
            +
            +
            +
            +
            +
            +
            + +
            + +
            +
            +
            +
            + + +
            + +
            +
            +
            +
            + +
            + +
            +
            +
            +
            + + +
            + +
            +
            +
            +
            + + +
            + +
            +
            +
            +
            + +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/index/view2.html b/jun_pc_web/project/index/view2.html new file mode 100644 index 000000000..4e1fc5629 --- /dev/null +++ b/jun_pc_web/project/index/view2.html @@ -0,0 +1,554 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +

            + {$detail.name} + +

            +
            + #P{$detail.id} + {$detail.admin_name} + 创建于{$detail.times}{gt name="$detail.update_time" + value="0"},最近更新于 {:time_trans($detail.update_time)}{/gt} + {eq name="$detail.admin_id" value="$login_admin.id"} + 删除 + {/eq} +
            +
            + +
            +
              +
            • 项目概览
            • +
            • 项目任务
            • +
            • 工作记录
            • +
            • 项目文档
            • +
            • 项目人员
            • +
            • 项目动态
            • +
            • 项目评论
            • +
            +
            +
            + {include file="/index/view_overview" /} +
            + +
            + {include file="/index/view_task" /} +
            + +
            + {include file="/index/view_schedule" /} +
            + +
            + {include file="/index/view_document" /} +
            + +
            + {include file="/index/view_user" /} +
            + +
            + {include file="/index/view_log" /} +
            + +
            + {include file="/index/view_comment" /} +
            +
            +
            + +{/block} + + + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/project/index/view_comment2.html b/jun_pc_web/project/index/view_comment2.html new file mode 100644 index 000000000..190eb4eb6 --- /dev/null +++ b/jun_pc_web/project/index/view_comment2.html @@ -0,0 +1,41 @@ +
            +
            + +
            +
            +
            + \ No newline at end of file diff --git a/jun_pc_web/project/index/view_document2.html b/jun_pc_web/project/index/view_document2.html new file mode 100644 index 000000000..a0764698a --- /dev/null +++ b/jun_pc_web/project/index/view_document2.html @@ -0,0 +1,92 @@ +
            +
            +
            + + \ No newline at end of file diff --git a/jun_pc_web/project/index/view_log2.html b/jun_pc_web/project/index/view_log2.html new file mode 100644 index 000000000..8769a8ff4 --- /dev/null +++ b/jun_pc_web/project/index/view_log2.html @@ -0,0 +1,94 @@ +
            +
            +
            + \ No newline at end of file diff --git a/jun_pc_web/project/index/view_overview2.html b/jun_pc_web/project/index/view_overview2.html new file mode 100644 index 000000000..0c262d768 --- /dev/null +++ b/jun_pc_web/project/index/view_overview2.html @@ -0,0 +1,600 @@ +
            +
            +
            + 项目状态: + 『{$detail.status_name}』 + 负责人: + {$detail.director_name} + + 项目成员:{$detail.team_admin_names} +
            +
            + 计划完成周期: + {$detail.start_time_str} + 至     {$detail.end_time_str} + {gt name=":isModule('contract')" value="0"} + 关联合同: + {$detail.contract} + + {/gt} +
            +
            + 项目简介: + {$detail.content} + +
            +
            +
            + +
            +
            +
            +
            + 项目阶段 +
            + {gt name="$role" value="0"} + + {/gt} +
            +
            + {notempty name="$step" id="vo"} +
            + 当前阶段:{$step.flow_name} + 负责人:{$step.check_name} + 成员:{$step.flow_names} + 周期:{$step.start_time|time_format=###,'Y-m-d'} 到 {$step.end_time|time_format=###,'Y-m-d'} + {eq name="$step.flow_uid" value="$login_admin.id"} +
            + 确认 + {gt name="$detail.step_sort" value="0"} + 退回 + {/gt} +
            + {/eq} +
            + {/notempty} +
            +
            + {volist name="$step_array" id="vo"} +
            + {gt name="$vo.sort" value="$detail.step_sort"} + + {/gt} + {eq name="$vo.sort" value="$detail.step_sort"} + + {/eq} + {lt name="$vo.sort" value="$detail.step_sort"} + + {/lt} +
            {$vo.flow_name}
            +
            {$vo.check_name}
            + +
            + {/volist} +
            +
            +
            +

            阶段流转记录

            + {notempty name="$step_record"} +
              + {volist name="$step_record" id="vo"} +
            • + + {if ($vo.status == 1)} +

              {$vo.check_time_str}{$vo.check_name}{$vo.status_str}了{$vo.flow_name}的工作。

              + {elseif ($vo.status == 2) /} +

              {$vo.check_time_str}{$vo.check_name}在{$vo.flow_name}执行了{$vo.status_str}操作。操作意见:{$vo.content}

              + {else /} +

              {$vo.check_time_str}{$vo.check_name}{$vo.status_str}了该阶段流程。操作意见:{$vo.content}

              + {/if} + +
            • + {/volist} +
            + {else/} +
            暂无记录
            + {/notempty} +
            +
            + +
            +
            +
            +
            + 项目附件 +
            +
            + +
            +
            +
            +
            + {volist name="file_array" id="vo"} +
            {:file_card($vo)}
            + {/volist} + {empty name="$file_array" } +
            暂无附件
            + {/empty} +
            +
            + +
            +
            +
            +
            + 关联链接 +
            +
            + +
            +
            +
            +
            + + + + + + + + + + + {volist name="link_array" id="vo"} + + + + + + + {/volist} + {empty name="$link_array" } + + + + {/empty} + +
            链接URL链接说明添加人操作
            {$vo.url}{$vo.desc}{$vo.admin_name} +
            + + +
            +
            暂无链接
            +
            +
            + +
            +
            +
            +
            + 项目概况 +
            +
            +
            +
            任务 (已完成/全部)
            +
            {$detail.tasks_finish} / {$detail.tasks}
            +
            +
            +
            +
            +
            项目工时 (实际/计划)
            +
            {$detail.hours} / {$detail.plan_hours}
            +
            +
            +
            +
            +
            工作记录
            +
            {$detail.schedules}
            +
            +
            +
            +
            +
            +
            +
            + 项目进度 +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + +
            +
            + 项目燃尽图 +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            + 任务分配情况 +
            +
            +
            +
            +
            +
            +
            +
            +
            + 工时登记情况 +
            +
            +
            +
            +
            +
            +
            + \ No newline at end of file diff --git a/jun_pc_web/project/index/view_schedule2.html b/jun_pc_web/project/index/view_schedule2.html new file mode 100644 index 000000000..030702825 --- /dev/null +++ b/jun_pc_web/project/index/view_schedule2.html @@ -0,0 +1,85 @@ +
            +
            +
            + \ No newline at end of file diff --git a/jun_pc_web/project/index/view_task2.html b/jun_pc_web/project/index/view_task2.html new file mode 100644 index 000000000..06d89560d --- /dev/null +++ b/jun_pc_web/project/index/view_task2.html @@ -0,0 +1,138 @@ +
            +
            +
            + + \ No newline at end of file diff --git a/jun_pc_web/project/index/view_user2.html b/jun_pc_web/project/index/view_user2.html new file mode 100644 index 000000000..85d89e336 --- /dev/null +++ b/jun_pc_web/project/index/view_user2.html @@ -0,0 +1,114 @@ +
            +
            +
            + + \ No newline at end of file diff --git a/jun_pc_web/project/task/add.html b/jun_pc_web/project/task/add.html new file mode 100644 index 000000000..1a2db7308 --- /dev/null +++ b/jun_pc_web/project/task/add.html @@ -0,0 +1,168 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + +
            +

            新建任务

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            任务主题* + + 优先级* + +
            工作类型* + + 预估工时* + + 预计结束日期* + +
            负责人 + + + 协作人 + + +
            前置任务 + + +
            关联项目 + + +
            详细描述* + +
            +
            + + + +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/task/add2.html b/jun_pc_web/project/task/add2.html new file mode 100644 index 000000000..a0945e36e --- /dev/null +++ b/jun_pc_web/project/task/add2.html @@ -0,0 +1,134 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
            +

            新建任务

            + + + + + + + + + + + + + + + + + + + + + + {empty name="$project_id"} + + + + + + + + + {else/} + + + + + {/empty} + + + + +
            任务主题* + + 优先级* + +
            工作类型* + + 预估工时* + + 预计结束日期* + +
            负责人 + + + 协作人 + + +
            前置任务 + + +
            关联项目 + + +
            前置任务 + + + +
            详细描述* + +
            +
            + + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/jun_pc_web/project/task/index.html b/jun_pc_web/project/task/index.html new file mode 100644 index 000000000..d23f95030 --- /dev/null +++ b/jun_pc_web/project/task/index.html @@ -0,0 +1,225 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/task/index.json b/jun_pc_web/project/task/index.json new file mode 100644 index 000000000..d748dc9bf --- /dev/null +++ b/jun_pc_web/project/task/index.json @@ -0,0 +1,459 @@ +{ + "code": 0, + "msg": "", + "count": 15, + "data": [ + { + "id": 1116, + "title": "测试", + "pid": 0, + "project_id": 1073, + "admin_id": 7, + "plan_hours": "11.0", + "end_time": "2023-12-29", + "over_time": 0, + "director_uid": 95, + "assist_admin_ids": "63,64", + "cate": 5, + "type": 1, + "priority": 1, + "before_task": 1067, + "flow_status": 1, + "done_ratio": 0, + "create_time": 1703643482, + "update_time": 1703643521, + "delete_time": 0, + "director_name": "张三", + "assist_admin_names": "不了情,巧天工", + "project_name": "测试项目都市时尚大方", + "cate_name": "需求沟通", + "after_num": 0, + "delay": 17, + "priority_name": "低", + "flow_name": "未开始", + "type_name": "需求" + }, + { + "id": 1067, + "title": "摄像头安装", + "pid": 1078, + "project_id": 1051, + "admin_id": 2, + "plan_hours": "2.0", + "end_time": "2023-10-21", + "over_time": 0, + "director_uid": 54, + "assist_admin_ids": "11", + "cate": 1, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 1, + "done_ratio": 20, + "create_time": 1697684611, + "update_time": 1698905488, + "delete_time": 0, + "director_name": "陆慈心", + "assist_admin_names": "刀兽", + "project_name": "OA办公软件", + "cate_name": "其他", + "after_num": 1, + "after_id": 1116, + "delay": 86, + "priority_name": "低", + "flow_name": "未开始", + "type_name": "需求" + }, + { + "id": 1036, + "title": "任务功能测试2", + "pid": 1116, + "project_id": 0, + "admin_id": 4, + "plan_hours": "2.0", + "end_time": "2023-08-09", + "over_time": 0, + "director_uid": 0, + "assist_admin_ids": "7", + "cate": 8, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 1, + "done_ratio": 0, + "create_time": 1691463338, + "update_time": 1691463360, + "delete_time": 0, + "director_name": "-", + "assist_admin_names": "叶小钗", + "project_name": "-", + "cate_name": "接待客户", + "after_num": 0, + "delay": 159, + "priority_name": "低", + "flow_name": "未开始", + "type_name": "需求" + }, + { + "id": 1035, + "title": "任务功能测试", + "pid": 0, + "project_id": 0, + "admin_id": 4, + "plan_hours": "4.0", + "end_time": "2023-08-09", + "over_time": 0, + "director_uid": 7, + "assist_admin_ids": "7", + "cate": 8, + "type": 1, + "priority": 3, + "before_task": 0, + "flow_status": 1, + "done_ratio": 0, + "create_time": 1691463256, + "update_time": 0, + "delete_time": 0, + "director_name": "叶小钗", + "assist_admin_names": "叶小钗", + "project_name": "-", + "cate_name": "接待客户", + "after_num": 0, + "delay": 159, + "priority_name": "高", + "flow_name": "未开始", + "type_name": "需求" + }, + { + "id": 1032, + "title": "121", + "pid": 0, + "project_id": 0, + "admin_id": 7, + "plan_hours": "1.0", + "end_time": "2023-07-27", + "over_time": 0, + "director_uid": 5, + "assist_admin_ids": "9", + "cate": 8, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 1, + "done_ratio": 0, + "create_time": 1690441049, + "update_time": 0, + "delete_time": 0, + "director_name": "玉辞心", + "assist_admin_names": "红尘雪", + "project_name": "-", + "cate_name": "接待客户", + "after_num": 0, + "delay": 172, + "priority_name": "低", + "flow_name": "未开始", + "type_name": "需求" + }, + { + "id": 1023, + "title": "完成方案宾谢", + "pid": 1036, + "project_id": 1013, + "admin_id": 7, + "plan_hours": "1.0", + "end_time": "2023-07-21", + "over_time": 0, + "director_uid": 13, + "assist_admin_ids": "", + "cate": 3, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 1, + "done_ratio": 0, + "create_time": 1689333382, + "update_time": 1695437883, + "delete_time": 0, + "director_name": "符应女", + "assist_admin_names": "-", + "project_name": "wangjiabing", + "cate_name": "撰写文档", + "after_num": 0, + "delay": 178, + "priority_name": "低", + "flow_name": "未开始", + "type_name": "需求" + }, + { + "id": 1003, + "title": "我的任务", + "pid": 1036, + "project_id": 1002, + "admin_id": 2, + "plan_hours": "2.0", + "end_time": "2023-06-15", + "over_time": 0, + "director_uid": 2, + "assist_admin_ids": "2", + "cate": 6, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 1, + "done_ratio": 0, + "create_time": 1686015031, + "update_time": 1688362925, + "delete_time": 0, + "director_name": "素还真", + "assist_admin_names": "素还真", + "project_name": "测试项目2", + "cate_name": "参加会议", + "after_num": 0, + "delay": 214, + "priority_name": "低", + "flow_name": "未开始", + "type_name": "需求" + }, + { + "id": 1054, + "title": "bbb", + "pid": 0, + "project_id": 1040, + "admin_id": 2, + "plan_hours": "23.0", + "end_time": "2023-09-20", + "over_time": 0, + "director_uid": 2, + "assist_admin_ids": "", + "cate": 2, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 2, + "done_ratio": 0, + "create_time": 1694486152, + "update_time": 1694486237, + "delete_time": 0, + "director_name": "素还真", + "assist_admin_names": "-", + "project_name": "yougongTest", + "cate_name": "方案策划", + "after_num": 0, + "delay": 117, + "priority_name": "低", + "flow_name": "进行中", + "type_name": "需求" + }, + { + "id": 1053, + "title": "aaa", + "pid": 0, + "project_id": 1040, + "admin_id": 4, + "plan_hours": "200.0", + "end_time": "2023-09-20", + "over_time": 0, + "director_uid": 55, + "assist_admin_ids": "", + "cate": 6, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 2, + "done_ratio": 0, + "create_time": 1694485944, + "update_time": 1701249386, + "delete_time": 0, + "director_name": "非凡公子", + "assist_admin_names": "-", + "project_name": "yougongTest", + "cate_name": "参加会议", + "after_num": 0, + "delay": 117, + "priority_name": "低", + "flow_name": "进行中", + "type_name": "需求" + }, + { + "id": 1096, + "title": "召开联络会", + "pid": 0, + "project_id": 1060, + "admin_id": 3, + "plan_hours": "4.0", + "end_time": "2023-11-30", + "over_time": 1700648090, + "director_uid": 7, + "assist_admin_ids": "8,7,9", + "cate": 5, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 3, + "done_ratio": 100, + "create_time": 1700641997, + "update_time": 1700648090, + "delete_time": 0, + "director_name": "叶小钗", + "assist_admin_names": "叶小钗,谈无欲,红尘雪", + "project_name": "晚风做酒", + "cate_name": "需求沟通", + "after_num": 0, + "delay": 0, + "priority_name": "低", + "flow_name": "已完成", + "type_name": "需求" + }, + { + "id": 1052, + "title": "test", + "pid": 0, + "project_id": 1040, + "admin_id": 4, + "plan_hours": "200.0", + "end_time": "2023-09-28", + "over_time": 1704370519, + "director_uid": 13, + "assist_admin_ids": "", + "cate": 2, + "type": 1, + "priority": 2, + "before_task": 0, + "flow_status": 3, + "done_ratio": 100, + "create_time": 1694485877, + "update_time": 1704370519, + "delete_time": 0, + "director_name": "符应女", + "assist_admin_names": "-", + "project_name": "yougongTest", + "cate_name": "方案策划", + "after_num": 1, + "after_id": 1123, + "delay": 98, + "priority_name": "中", + "flow_name": "已完成", + "type_name": "需求" + }, + { + "id": 1021, + "title": "tuyhiu", + "pid": 0, + "project_id": 1012, + "admin_id": 2, + "plan_hours": "7.0", + "end_time": "2023-07-13", + "over_time": 1694760797, + "director_uid": 78, + "assist_admin_ids": "48", + "cate": 3, + "type": 1, + "priority": 3, + "before_task": 0, + "flow_status": 3, + "done_ratio": 0, + "create_time": 1689237444, + "update_time": 1694760797, + "delete_time": 0, + "director_name": "翠厚生", + "assist_admin_names": "花伴月", + "project_name": "43567890nnn", + "cate_name": "撰写文档", + "after_num": 0, + "delay": 64, + "priority_name": "高", + "flow_name": "已完成", + "type_name": "需求" + }, + { + "id": 1013, + "title": "弹窗", + "pid": 0, + "project_id": 1008, + "admin_id": 2, + "plan_hours": "21.0", + "end_time": "2023-06-30", + "over_time": 1688002398, + "director_uid": 2, + "assist_admin_ids": "88", + "cate": 4, + "type": 1, + "priority": 1, + "before_task": 0, + "flow_status": 3, + "done_ratio": 0, + "create_time": 1688002280, + "update_time": 1688002398, + "delete_time": 0, + "director_name": "素还真", + "assist_admin_names": "枫岫主人", + "project_name": "测试项目-1", + "cate_name": "需求调研", + "after_num": 0, + "delay": 0, + "priority_name": "低", + "flow_name": "已完成", + "type_name": "需求" + }, + { + "id": 1020, + "title": "3wertyguhj", + "pid": 0, + "project_id": 1001, + "admin_id": 2, + "plan_hours": "8.0", + "end_time": "2023-07-13", + "over_time": 0, + "director_uid": 7, + "assist_admin_ids": "65", + "cate": 4, + "type": 1, + "priority": 4, + "before_task": 0, + "flow_status": 4, + "done_ratio": 0, + "create_time": 1689237053, + "update_time": 1694760658, + "delete_time": 0, + "director_name": "叶小钗", + "assist_admin_names": "洛子商", + "project_name": "测试项目", + "cate_name": "需求调研", + "after_num": 0, + "delay": 0, + "priority_name": "紧急", + "flow_name": "已拒绝", + "type_name": "需求" + }, + { + "id": 1006, + "title": "测试任务-1", + "pid": 0, + "project_id": 1008, + "admin_id": 2, + "plan_hours": "10.0", + "end_time": "2023-08-02", + "over_time": 0, + "director_uid": 0, + "assist_admin_ids": "", + "cate": 4, + "type": 1, + "priority": 4, + "before_task": 0, + "flow_status": 5, + "done_ratio": 0, + "create_time": 1687577550, + "update_time": 1697006800, + "delete_time": 0, + "director_name": "-", + "assist_admin_names": "-", + "project_name": "测试项目-1", + "cate_name": "需求调研", + "after_num": 0, + "delay": 0, + "priority_name": "紧急", + "flow_name": "已关闭", + "type_name": "需求" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/project/task/index2.html b/jun_pc_web/project/task/index2.html new file mode 100644 index 000000000..8d7cb067d --- /dev/null +++ b/jun_pc_web/project/task/index2.html @@ -0,0 +1,183 @@ +{extend name="../../base/view/common/base" /} + +{block name="style"} + +{/block} +{block name="body"} +
            +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/project/task/task_time.html b/jun_pc_web/project/task/task_time.html new file mode 100644 index 000000000..74c192cee --- /dev/null +++ b/jun_pc_web/project/task/task_time.html @@ -0,0 +1,273 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/task/task_time.json b/jun_pc_web/project/task/task_time.json new file mode 100644 index 000000000..0adc3d7b6 --- /dev/null +++ b/jun_pc_web/project/task/task_time.json @@ -0,0 +1,195 @@ +{ + "code": 0, + "msg": "", + "count": 7, + "data": [ + { + "id": 199, + "title": "333", + "cid": 1, + "cmid": 0, + "ptid": 0, + "tid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2024-01-12 13:00", + "end_time": "19:00", + "labor_time": "6.00", + "labor_type": 2, + "remark": "333", + "delete_time": 0, + "create_time": "2024-01-12 16:52:02", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "其他", + "labor_type_string": "外勤工作", + "start_time_a": "2024-01-12", + "start_time_b": "13:00", + "end_time_a": "2024-01-12", + "end_time_b": "19:00" + }, + { + "id": 198, + "title": "111", + "cid": 1, + "cmid": 0, + "ptid": 0, + "tid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2024-01-12 09:00", + "end_time": "12:00", + "labor_time": "3.00", + "labor_type": 1, + "remark": "111", + "delete_time": 0, + "create_time": "2024-01-12 16:49:25", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "其他", + "labor_type_string": "案头工作", + "start_time_a": "2024-01-12", + "start_time_b": "09:00", + "end_time_a": "2024-01-12", + "end_time_b": "12:00" + }, + { + "id": 164, + "title": "11", + "cid": 1, + "cmid": 0, + "ptid": 0, + "tid": 1067, + "admin_id": 7, + "did": 6, + "start_time": "2023-11-30 09:00", + "end_time": "09:30", + "labor_time": "0.50", + "labor_type": 2, + "remark": "1", + "delete_time": 0, + "create_time": "2023-11-30 16:26:18", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "其他", + "labor_type_string": "外勤工作", + "task": "摄像头安装", + "project": "OA办公软件", + "start_time_a": "2023-11-30", + "start_time_b": "09:00", + "end_time_a": "2023-11-30", + "end_time_b": "09:30" + }, + { + "id": 139, + "title": "水渠勘察", + "cid": 4, + "cmid": 0, + "ptid": 0, + "tid": 1086, + "admin_id": 7, + "did": 6, + "start_time": "2023-11-15 09:00", + "end_time": "09:30", + "labor_time": "0.50", + "labor_type": 2, + "remark": "水渠勘察", + "delete_time": 0, + "create_time": "2023-11-15 09:57:36", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "需求调研", + "labor_type_string": "外勤工作", + "task": "水渠勘察", + "project": "测试水渠施工", + "start_time_a": "2023-11-15", + "start_time_b": "09:00", + "end_time_a": "2023-11-15", + "end_time_b": "09:30" + }, + { + "id": 113, + "title": "开发任务", + "cid": 3, + "cmid": 0, + "ptid": 0, + "tid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-10-13 08:30", + "end_time": "18:00", + "labor_time": "9.50", + "labor_type": 1, + "remark": "今日任务\n干活\n修电脑\n吃饭", + "delete_time": 0, + "create_time": "2023-10-13 15:54:10", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "撰写文档", + "labor_type_string": "案头工作", + "start_time_a": "2023-10-13", + "start_time_b": "08:30", + "end_time_a": "2023-10-13", + "end_time_b": "18:00" + }, + { + "id": 63, + "title": "2312123", + "cid": 1, + "cmid": 0, + "ptid": 0, + "tid": 0, + "admin_id": 7, + "did": 6, + "start_time": "2023-08-09 09:00", + "end_time": "09:30", + "labor_time": "0.50", + "labor_type": 2, + "remark": "", + "delete_time": 0, + "create_time": "2023-08-09 18:50:37", + "update_time": null, + "name": "叶小钗", + "department": "技术部", + "work_cate": "其他", + "labor_type_string": "外勤工作", + "start_time_a": "2023-08-09", + "start_time_b": "09:00", + "end_time_a": "2023-08-09", + "end_time_b": "09:30" + }, + { + "id": 32, + "title": "问问", + "cid": 3, + "cmid": 0, + "ptid": 0, + "tid": 1023, + "admin_id": 7, + "did": 6, + "start_time": "2023-08-04 09:00", + "end_time": "20:30", + "labor_time": "11.50", + "labor_type": 1, + "remark": "", + "delete_time": 0, + "create_time": "2023-07-14 19:16:48", + "update_time": "2023-07-28 11:26:18", + "name": "叶小钗", + "department": "技术部", + "work_cate": "撰写文档", + "labor_type_string": "案头工作", + "task": "完成方案宾谢", + "project": "wangjiabing", + "start_time_a": "2023-08-04", + "start_time_b": "09:00", + "end_time_a": "2023-08-04", + "end_time_b": "20:30" + } + ] +} \ No newline at end of file diff --git a/jun_pc_web/project/task/task_time2.html b/jun_pc_web/project/task/task_time2.html new file mode 100644 index 000000000..fc4eaff5e --- /dev/null +++ b/jun_pc_web/project/task/task_time2.html @@ -0,0 +1,236 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/jun_pc_web/project/task/view.html b/jun_pc_web/project/task/view.html new file mode 100644 index 000000000..a497ae696 --- /dev/null +++ b/jun_pc_web/project/task/view.html @@ -0,0 +1,426 @@ + + + + + + + + + + + + + 勾股OA + + + + + + + + + + + + + + + + + +
            +
            +

            + 测试 + +

            +
            + #T1116 + 叶小钗 + 创建于2023-12-27,最近更新于 2023-12-27 + 删除 +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            任务负责人张三协作人不了情,巧天工
            计划完成日期2023-12-29逾期 + 17 天预估工时11.0工作类型需求沟通优先级 +
            实际完成日期-实际工时13.5 任务状态 + 『未开始』 + 完成进度0%
            前置任务 + + #T1067『未开始』摄像头安装 + + +
            子任务+ 新增 +

            #T1036『未开始』任务功能测试2

            +

            #T1089『未开始』11

            +
            +
            +

            任务描述

            +

            测试

            +
            +
            +

            文件附件

            +
            +
            +
            暂无附件文件
            +
            +
            +
            +
            +
            +
            +

            关联项目

            + + 测试项目都市时尚大方 + +
            + +
            +
            工作记录+ 工作记录
            +
            +
            暂无工作记录
            +
            +
            +
            +
            + +
            +
              +
            • 员工评论(0)
            • +
            • 操作日志(3)
            • +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + diff --git a/jun_pc_web/project/task/view2.html b/jun_pc_web/project/task/view2.html new file mode 100644 index 000000000..cda61897d --- /dev/null +++ b/jun_pc_web/project/task/view2.html @@ -0,0 +1,406 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} +{block name="body"} +
            +
            +

            + {$detail.title} + +

            +
            + #T{$detail.id} + {$detail.admin_name} + 创建于{$detail.times}{gt name="$detail.update_time" value="0"},最近更新于 {:time_trans($detail.update_time)}{/gt} + {eq name="$detail.admin_id" value="$login_admin.id"} + 删除 + {/eq} +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            任务负责人{$detail.director_name}协作人{$detail.assist_admin_names}
            计划完成日期{$detail.end_time| + date='Y-m-d'}{gt name="$detail.delay" value="0"}逾期 + {$detail.delay} 天{/gt}预估工时{$detail.plan_hours}工作类型{$detail.cate_name}优先级{$detail.priority_name} +
            实际完成日期{eq name="$detail.over_time" value="0"}-{else/}{$detail.over_time|date='Y-m-d'}{/eq}实际工时{eq name="$detail.work_hours" value="0"}-{else/}{$detail.work_hours}{/eq} + 任务状态 + 『{$detail.flow_name}』 + 完成进度{$detail.done_ratio}%{neq name="$detail.done_ratio" value="100"}{/neq} +
            前置任务 + + {gt name="$detail.before_task" value="0"} + #T{$detail.before_task}『{$detail.before_task_flow_name}』{$detail.before_task_name} + {else/} + 未设置{/gt} + + +
            子任务+ 新增 + {empty name="$son_task"} + 暂无子任务 + {else/} + {volist name="son_task" id="vo"} +

            #T{$vo.id}『{$vo.flow_name}』{$vo.title}

            + {/volist} + {/empty} +
            +
            +

            任务描述

            +
            {$detail.content|raw}
            +
            +
            +

            文件附件

            +
            + {empty name="$file_array"} +
            +
            暂无附件文件
            +
            + {/empty} + {volist name="$file_array" id="vo"} +
            {:file_card($vo)}
            + {/volist} +
            +
            +
            +
            +
            +

            关联项目

            + + {gt name="$detail.project_id" value="0"}{$detail.project_name}{else/}未设置{/gt} + + +
            + +
            +
            工作记录+ 工作记录
            +
            +
            暂无工作记录
            +
            +
            +
            +
            + +
            +
              +
            • 员工评论({$detail.comments})
            • +
            • 操作日志({$detail.logs})
            • +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/jun_pc_web/static/home/css/common.css b/jun_pc_web/static/home/css/common.css new file mode 100644 index 000000000..f21a34a25 --- /dev/null +++ b/jun_pc_web/static/home/css/common.css @@ -0,0 +1,1025 @@ + /* 滚动条样式 */ + ::-webkit-scrollbar { + width: 8px; + } + ::-webkit-scrollbar-thumb { + background-color:rgba(0,0,0,.15);background-clip:content-box;border:1px solid transparent;border-radius:8px + } + +::-webkit-scrollbar-track{background-color:transparent} +::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} +::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:1px solid transparent} +::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} + + ::-moz-scrollbar { + width: 8px; + background-color: transparent; + } + ::-moz-scrollbar-thumb { + background-color: #c1c1c1; + border-radius: 8px; + } + body.right-open{overflow-y:clip;} + div.layui-table-main::-webkit-scrollbar{width:12px;height:12px} + div.layui-table-main::-webkit-scrollbar-thumb{min-width:12px;min-height:12px;background-color:rgba(0,0,0,.15);background-clip:content-box;border:2px solid transparent;border-radius:12px} + div.layui-table-main::-webkit-scrollbar-track{background-color:transparent} + div.layui-table-main::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} + div.layui-table-main::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:2px solid transparent} + div.layui-table-main::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} + /*placeholder*/ + ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ + color: #aaa; + } + :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #aaa; + } + ::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #aaa; + } + :-ms-input-placeholder { /* Internet Explorer 10-11 */ + color: #aaa; + } + .layui-card { box-shadow: 0 1px 3px 0 rgb(5 32 96 / 10%); margin-bottom:12px!important;} + .layui-table, .layui-table-view{margin:0} + .layui-table td,.layui-table th{padding:9px 10px;} + .layui-table-cell{padding:0 10px;} + .layui-table[lay-size=sm] td, .layui-table[lay-size=sm] th {padding: 5px;} + .layui-form-bar{padding:12px;border:1px solid #eee; border-bottom:none;} + .auth-single .auth-icon{font-size:24px; float:left;} + .auth-single .layui-form-radio,.auth-single .layui-form-checkbox{margin-left:0;} + .auth-single .layui-form-radio{margin-top:0;} + .auth-single .layui-form-radio>i,.auth-single .layui-form-checkbox>i{font-size:20px;} + .layui-select-tags{padding:10px 0;} + .layui-tags-span{padding:5px 8px; font-size:14px; border-radius:3px; margin-bottom:6px; margin-right:6px; border:1px solid #e6e6e6; display:inline-block;cursor:pointer;} + .layui-readonly{background-color: #f5f5f5; color:#999;} + .layui-tags-span:hover{border:1px solid #ddd; background-color:#f2f2f2;} + .layui-tags-span i{margin-left:5px; font-size:14px;} + .layui-tags-span i:hover{border-radius:2px;background-color:#FF6347;color:#fff} + .layui-letter-span{padding:10px 5px; font-size:15px; display:inline-block; cursor:pointer;} + .layui-letter-span.on{color:#FF6347; font-weight:800;} + .layui-letter-span:hover{color:#4285f4;} + .layui-tags-all{float: right; font-weight: 200px; background-color:#4285f4; color:#fff; border-radius: 3px; padding: 2px 6px; cursor: pointer; display: none;} + .layui-table-form{margin-top: 0;} + .layui-table-form tbody tr:hover{background-color: #fff;} + .layui-td-gray{color:#999; width:80px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray2{color:#999; width:100px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray3{color:#999; width:120px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray4{color:#999; width:150px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray font,.layui-td-gray2 font,.layui-td-gray3 font{color:#FF6347; margin-left: 3px;} + .main-body{padding:12px;padding-bottom: 0; min-width: 868px;} + .body-content{background-color:#fff; padding:10px 12px;} + .body-table{background-color:#fff; margin-bottom:12px} + .h3-title{font-size:18px; height:39px; font-weight:800} + .h3-title2{font-size:18px; height:39px; font-weight:800; padding-top:20px} + .body-form-btn{padding:10px 0;} + .span-color--1{color:#999999;} + .span-color-0{color:#5FB878;} + .span-color-1{color:#FF6347;} + .span-color-2{color:#01AAED;} + .span-color-3{color:#d89d00;} + .span-color-4{color:#CC0033;} + .span-color-5{color:#CCCC00;} + .span-color-6{color:#FF33CC;} + .span-color-7{color:#6699FF;} + .span-color-8{color:#CC9933;} +.layui-tab-title .layui-this:after {width:calc(100% - 35px );left:12px; min-width:65px;} + +@keyframes layui-rl{ + from{transform:translateX(0px);}to{transform:translateX(-100%);} +} +@-webkit-keyframes layui-rl{ + from{transform:translateX(0px);}to{transform:translateX(-100%);} +} +.layui-anim { + -webkit-animation-duration: .3s; + animation-duration: .3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.layui-anim-rl { + -webkit-animation-name: layui-rl; + animation-name: layui-rl; +} +.layui-layer-admin-right { + box-shadow: 1px 1px 10px rgba(0,0,0,.1); + border-radius: 0!important; + overflow: auto; +} +.layui-anim-rl.layui-layer-iframe{ + overflow:initial!important; +} +.right-popup-close{position: absolute;width:24px;height:60px; padding:30px 6px; line-height:30px;text-align:center; left: -38px;right:0; top: 20%;background-color:#FF5722;color:#fff;border-radius:6px 0 0 6px; cursor:pointer; border:2px solid #fff; border-right:none; font-weight:600; font-size:14px;} +.right-popup-close:hover{opacity:0.88} +.page-content{background-color:#fff;} + + +@font-face { + font-family: "iconfont"; /* Project id 2936988 */ + src: url('/static/layui/font/extend/iconfont.woff2?t=1636884517050') format('woff2'), + url('/static/layui/font/extend/iconfont.woff?t=1636884517050') format('woff'), + url('/static/layui/font/extend/iconfont.ttf?t=1636884517050') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-xueshengyidong:before { + content: "\e6e9"; +} + +.icon-baokao:before { + content: "\e6ea"; +} + +.icon-chengji:before { + content: "\e6eb"; +} + +.icon-yuejuan:before { + content: "\e6ec"; +} + +.icon-kaoheshezhi:before { + content: "\e6ed"; +} + +.icon-lunwenguanli:before { + content: "\e6ee"; +} + +.icon-shenbao:before { + content: "\e6ef"; +} + +.icon-kecheng:before { + content: "\e6f0"; +} + +.icon-tiku:before { + content: "\e6f1"; +} + +.icon-jiaowushezhi:before { + content: "\e6f2"; +} + +.icon-zidingyishezhi:before { + content: "\e6f3"; +} + +.icon-chaojitongji:before { + content: "\e6f4"; +} + +.icon-zhaoshengtongji:before { + content: "\e6f5"; +} + +.icon-tuiguangtongji:before { + content: "\e6f6"; +} + +.icon-xuexitongji:before { + content: "\e6f7"; +} + +.icon-diqushujutongji:before { + content: "\e6f8"; +} + +.icon-shujudaoru:before { + content: "\e6f9"; +} + +.icon-chengkaoguanli:before { + content: "\e6fb"; +} + +.icon-yuanchengguanli:before { + content: "\e6fe"; +} + +.icon-shujiguanli:before { + content: "\e6ff"; +} + +.icon-guochengxingkaohe:before { + content: "\e700"; +} + +.icon-xuefenrending:before { + content: "\e701"; +} + +.icon-kechengdingdan:before { + content: "\e702"; +} + +.icon-wentifankui:before { + content: "\e703"; +} + +.icon-zichan:before { + content: "\e704"; +} + +.icon-KPIguanli:before { + content: "\e705"; +} + +.icon-xiangmuguanli:before { + content: "\e706"; +} + +.icon-weixingongzhonghao:before { + content: "\e707"; +} + +.icon-anquanshezhi:before { + content: "\e708"; +} + +.icon-fuwuzhongxin:before { + content: "\e709"; +} + +.icon-qiyefuwu:before { + content: "\e70a"; +} + +.icon-wangkefuwu:before { + content: "\e70b"; +} + +.icon-shoufeiguanli:before { + content: "\e70c"; +} + +.icon-quanxianshezhi:before { + content: "\e70d"; +} + +.icon-jiaowutongji:before { + content: "\e70f"; +} + +.icon-jiaoxuetongji:before { + content: "\e710"; +} + +.icon-shoufeitongji:before { + content: "\e711"; +} + +.icon-fuwutongji:before { + content: "\e713"; +} + +.icon-tongzhitongji:before { + content: "\e714"; +} + +.icon-kaohetongji:before { + content: "\e715"; +} + +.icon-yonghuhuoyuedu:before { + content: "\e716"; +} + +.icon-xueshengbaoming:before { + content: "\e717"; +} + +.icon-xueshengluqu:before { + content: "\e718"; +} + +.icon-xueshengzhuce:before { + content: "\e719"; +} + +.icon-zaijixuesheng:before { + content: "\e71a"; +} + +.icon-huamingce:before { + content: "\e71b"; +} + +.icon-fenleiguanli:before { + content: "\e71c"; +} + +.icon-fuwuliebiao:before { + content: "\e71d"; +} + +.icon-fenleiliebiao:before { + content: "\e71e"; +} + +.icon-tongzhiliebiao:before { + content: "\e71f"; +} + +.icon-jiaoxuejihua:before { + content: "\e720"; +} + +.icon-jiaoxueanpai:before { + content: "\e721"; +} + +.icon-chengjiguanli:before { + content: "\e722"; +} + +.icon-tupianguanli:before { + content: "\e723"; +} + +.icon-kaoshijihua:before { + content: "\e724"; +} + +.icon-kaoshipeizhi:before { + content: "\e725"; +} + +.icon-xuexizhongxinguanli:before { + content: "\e726"; +} + +.icon-kaoheguanli:before { + content: "\e728"; +} + +.icon-jiaoshiguanli:before { + content: "\e729"; +} + +.icon-wangkeguanli:before { + content: "\e72a"; +} + +.icon-bulujiesuan:before { + content: "\e72b"; +} + +.icon-biyeguanli:before { + content: "\e72c"; +} + +.icon-kaohezhibiao:before { + content: "\e72d"; +} + +.icon-qiyeguanli:before { + content: "\e77e"; +} + +.icon-chubuguanli:before { + content: "\e77f"; +} + +.icon-hujiaobaobiao:before { + content: "\e780"; +} + +.icon-saomiaodianjing:before { + content: "\e781"; +} + +.icon-jiezhang:before { + content: "\e782"; +} + +.icon-xiaoshoubaobiao:before { + content: "\e783"; +} + +.icon-pingzheng:before { + content: "\e784"; +} + +.icon-hetongyidong:before { + content: "\e785"; +} + +.icon-xiaoshoupin:before { + content: "\e787"; +} + +.icon-xueshuguanli:before { + content: "\e788"; +} + +.icon-yihaopin:before { + content: "\e789"; +} + +.icon-renwuguanli:before { + content: "\e78a"; +} + +.icon-dianshang:before { + content: "\e78b"; +} + +.icon-mingpianbaobiao_1:before { + content: "\e78c"; +} + +.icon-gudingzichan:before { + content: "\e78d"; +} + +.icon-dongtaiguanli:before { + content: "\e78e"; +} + +.icon-jichupeizhi:before { + content: "\e78f"; +} + +.icon-hujiaotongji:before { + content: "\e790"; +} + +.icon-xiaoshoubaobiao_1:before { + content: "\e791"; +} + +.icon-dashuju:before { + content: "\e792"; +} + +.icon-huodongguanli:before { + content: "\e793"; +} + +.icon-hujiaoshezhi:before { + content: "\e794"; +} + +.icon-fenxiaoshichang:before { + content: "\e795"; +} + +.icon-chengjitongji:before { + content: "\e796"; +} + +.icon-tuiguangshezhi:before { + content: "\e797"; +} + +.icon-kechengzhongxin:before { + content: "\e798"; +} + +.icon-hetongshezhi:before { + content: "\e799"; +} + +.icon-kechengbaoguanli:before { + content: "\e79a"; +} + +.icon-yonghuguanli:before { + content: "\e79b"; +} + +.icon-yonghuhuaxiang:before { + content: "\e79c"; +} + +.icon-zhanghaoguanli:before { + content: "\e79d"; +} + +.icon-SEMguanli:before { + content: "\e79e"; +} + +.icon-yusuan:before { + content: "\e79f"; +} + +.icon-mingpianbaobiao:before { + content: "\e7a0"; +} + +.icon-dingdanguanli:before { + content: "\e7a1"; +} + +.icon-tuiguangguanli:before { + content: "\e7a2"; +} + +.icon-zhuantiguanli:before { + content: "\e7a3"; +} + +.icon-xinxiliu:before { + content: "\e7a4"; +} + +.icon-xiaoshoushezhi:before { + content: "\e7a5"; +} + +.icon-sucaiguanli:before { + content: "\e7a9"; +} + +.icon-xueshengdaoru:before { + content: "\e7aa"; +} + +.icon-shangpinguanli:before { + content: "\e7ab"; +} + +.icon-paikeguanli:before { + content: "\e7ac"; +} + +.icon-xinxidaoru:before { + content: "\e7ad"; +} + +.icon-shoufeipeizhi:before { + content: "\e7ae"; +} + +.icon-yonghuquanxian:before { + content: "\e7af"; +} + +.icon-zaijixueshengguanli:before { + content: "\e7b0"; +} + +.icon-xuehaoguanli:before { + content: "\e7b1"; +} + +.icon-kechengziyuanguanli:before { + content: "\e7b2"; +} + +.icon-mianshoujiaoxueanpai:before { + content: "\e7b3"; +} + +.icon-zhangfang:before { + content: "\e7b4"; +} + +.icon-kaikeguanli:before { + content: "\e7b5"; +} + +.icon-biyetongji:before { + content: "\e7b6"; +} + +.icon-zhaoshengzhunbei:before { + content: "\e7b8"; +} + +.icon-paikeshezhi:before { + content: "\e7b9"; +} + +.icon-banjiguanli:before { + content: "\e7ba"; +} + +.icon-jingpinketang:before { + content: "\e7bb"; +} + +.icon-yuangongtidian:before { + content: "\e7bc"; +} + +.icon-kaoshianpai:before { + content: "\e7bd"; +} + +.icon-wangluojiaoxueanpai:before { + content: "\e7bf"; +} + +.icon-ruxuechengji:before { + content: "\e7c3"; +} + +.icon-mianshoujiaoxue:before { + content: "\e7c6"; +} + +.icon-jiaoshijiaoshiguanli:before { + content: "\e7c7"; +} + +.icon-luquguanli:before { + content: "\e7c8"; +} + +.icon-luquchengji:before { + content: "\e7c9"; +} + +.icon-ziyuan:before { + content: "\e7ca"; +} + +.icon-kejian:before { + content: "\e7cc"; +} + +.icon-waibukejian:before { + content: "\e7cd"; +} + +.icon-rizhiguanli:before { + content: "\e7ce"; +} + +.icon-mobanguanli:before { + content: "\e7cf"; +} + +.icon-xuelirenzheng:before { + content: "\e7d1"; +} + +.icon-yiyichuli:before { + content: "\e7d2"; +} + +.icon-lunwenshenbao:before { + content: "\e7d3"; +} + +.icon-lunwenshezhi:before { + content: "\e7d4"; +} + +.icon-jiaoxuedianshezhi:before { + content: "\e7d5"; +} + +.icon-buluchenjiang:before { + content: "\e7d6"; +} + +.icon-mokuaishezhi:before { + content: "\e7d7"; +} + +.icon-ziliaoguanli:before { + content: "\e7d8"; +} + +.icon-jituanguanli:before { + content: "\e7d9"; +} + +.icon-yingyongguanli:before { + content: "\e7da"; +} + +.icon-guanwangshijuan:before { + content: "\e7db"; +} + +.icon-wodewangke:before { + content: "\e7dc"; +} + +.icon-jiaobenguanli:before { + content: "\e7dd"; +} + +.icon-zhuanyeguanliyuan:before { + content: "\e7de"; +} + +.icon-xueshengchengji:before { + content: "\e7df"; +} + +.icon-fuwuguanli:before { + content: "\e7e2"; +} + +.icon-daijinquan:before { + content: "\e7e3"; +} + +.icon-hujiaozhongxin:before { + content: "\e7e4"; +} + +.icon-yinjinshoufei:before { + content: "\e7e5"; +} + +.icon-yingjiaoqingdan:before { + content: "\e7e6"; +} + +.icon-duizhangdan:before { + content: "\e7e7"; +} + +.icon-shangjiguanli:before { + content: "\e7e8"; +} + +.icon-qiyehuihuacundang:before { + content: "\e7e9"; +} + +.icon-yonghushezhi:before { + content: "\e7ea"; +} + +.icon-xiaoxishezhi:before { + content: "\e7ec"; +} + +.icon-yingxiaoshezhi:before { + content: "\e7ed"; +} + +.icon-fuwushichang:before { + content: "\e7ee"; +} + +.icon-sucaiziyuan:before { + content: "\e7ef"; +} + +.icon-yingxiaowanfa:before { + content: "\e7f0"; +} + +.icon-tuiguang:before { + content: "\e7f1"; +} + +.icon-yonghuliebiao:before { + content: "\e7f2"; +} + +.icon-ziyuanguanli:before { + content: "\e692"; +} + +.icon-kechengguanli:before { + content: "\e693"; +} + +.icon-kechengbao:before { + content: "\e694"; +} + +.icon-tikuguanli:before { + content: "\e695"; +} + +.icon-wangkeshichang:before { + content: "\e696"; +} + +.icon-gongdan:before { + content: "\e697"; +} + +.icon-fangkeguanli:before { + content: "\e698"; +} + +.icon-xiansuoguanli:before { + content: "\e699"; +} + +.icon-kehuguanli:before { + content: "\e69a"; +} + +.icon-jituankehu:before { + content: "\e69b"; +} + +.icon-genjinjilu:before { + content: "\e69c"; +} + +.icon-hujiaoguanli:before { + content: "\e69d"; +} + +.icon-gongzuotai:before { + content: "\e69e"; +} + +.icon-shujubaobiao:before { + content: "\e69f"; +} + +.icon-fangkebaobiao:before { + content: "\e6a0"; +} + +.icon-zhangbuguanli:before { + content: "\e6a1"; +} + +.icon-zhangbuguanli_zi:before { + content: "\e6a2"; +} + +.icon-zhangbuguanli_zixitong_A:before { + content: "\e6a3"; +} + +.icon-hetongguanli:before { + content: "\e6a4"; +} + +.icon-yunyingzheguanli:before { + content: "\e6a5"; +} + +.icon-zhaopinguanli:before { + content: "\e6a6"; +} + +.icon-gongziguanli:before { + content: "\e6a7"; +} + +.icon-wodeshenpi:before { + content: "\e6a8"; +} + +.icon-biaozhunmobanshezhi:before { + content: "\e6a9"; +} + +.icon-jichushezhi:before { + content: "\e6aa"; +} + +.icon-caiwushezhi:before { + content: "\e6ab"; +} + +.icon-chanpinshezhi:before { + content: "\e6ac"; +} + +.icon-shenpishezhi:before { + content: "\e6ad"; +} + +.icon-mubiaoguanli:before { + content: "\e6ae"; +} + +.icon-zhandianshezhi:before { + content: "\e6af"; +} + +.icon-renshishezhi:before { + content: "\e6b0"; +} + +.icon-CRMshezhi:before { + content: "\e6b1"; +} + +.icon-mingpianshezhi:before { + content: "\e6b2"; +} + +.icon-wangxiaoshezhi:before { + content: "\e6b3"; +} + +.icon-wodedianping:before { + content: "\e6b4"; +} + +.icon-wodexuesheng:before { + content: "\e6b5"; +} + +.icon-lianxijilu:before { + content: "\e6b8"; +} + +.icon-tousutiwen:before { + content: "\e6b9"; +} + +.icon-peixunjihua:before { + content: "\e6ba"; +} + +.icon-feiyongchaxun:before { + content: "\e6bb"; +} + +.icon-xueshengjiaofei:before { + content: "\e6bc"; +} + +.icon-jizhang:before { + content: "\e6bd"; +} + +.icon-chaxun:before { + content: "\e6be"; +} + +.icon-chazhang:before { + content: "\e6bf"; +} + +.icon-baobiao:before { + content: "\e6c0"; +} + +.icon-shezhi:before { + content: "\e6c2"; +} + +.icon-daqiajilu:before { + content: "\e6ce"; +} + +.icon-wangluobanji:before { + content: "\e6d3"; +} + +.icon-wangxiaoshezhi1:before { + content: "\e6d6"; +} + +.icon-houtaishezhi:before { + content: "\e6d8"; +} + +.icon-zhaoshengshezhi:before { + content: "\e6db"; +} + +.icon-xiaoxizhongxin:before { + content: "\e6df"; +} + +.icon-zhaoshengbaobiao:before { + content: "\e6e1"; +} + +.icon-caidanguanli:before { + content: "\e6e2"; +} + +.icon-jituanshezhi:before { + content: "\e6e3"; +} + +.icon-shichangguanli:before { + content: "\e6e4"; +} + +.icon-chuangjianxitong:before { + content: "\e6e5"; +} + +.icon-gongdanguanli:before { + content: "\e6e6"; +} + +.icon-duanxin:before { + content: "\e6e7"; +} + +.icon-bangzhuzhongxin:before { + content: "\e6e8"; +} \ No newline at end of file diff --git a/jun_pc_web/static/home/css/gougucms.css b/jun_pc_web/static/home/css/gougucms.css new file mode 100644 index 000000000..bef690e13 --- /dev/null +++ b/jun_pc_web/static/home/css/gougucms.css @@ -0,0 +1,77 @@ +.main-body{padding:0;min-width: 1220px; +-moz-user-select: none; /*火狐*/ +-webkit-user-select: none; /*webkit浏览器*/ +-ms-user-select: none; /*IE10*/ +-khtml-user-select: none; /*早期浏览器*/ +user-select: none;} +.layui-layout-admin .layui-header {height:49px;background-color:#fff;box-shadow: 0 2px 6px 0 rgb(5 32 96 / 10%);} +.layui-layout-admin .layui-logo {line-height:49px;cursor:pointer;font-size:16px;color:#fff;background:#001529;width:200px;border-bottom: 1px solid #001529;} +.layui-layout-admin .layui-side {top:50px;width:200px;border-right:1px solid #ddd;} +.layui-header .layui-nav-item {line-height:49px; height:49px; border-left: 1px solid #eee;position: relative;display: inline-block; *display: inline; *zoom: 1; vertical-align: middle;} +.layui-header .layui-nav-item a{padding: 0 12px; text-align: center; min-width: 24px;} +.layui-header.layui-layout-left {color:#333;margin-left:10px;} +.layui-header.layui-layout-left input {border:0;} +.layui-header .layui-nav-bar {display:none;} +.layui-layout-right{padding: 0 3px; background-color:#fff;} +.layui-header .layui-nav-item #ittab-refresh {color:#000;} +.layui-header .layui-nav-item #ittab-refresh i {font-size:16px;} +.layui-header .layui-nav-item #ittab-del-cache{color:#000} +.layui-header .layui-nav-item #ittab-del-cache i{font-size:16px} +.layui-header.layui-layout-right .layui-nav-bar {background-color: #fff;} +.layui-tab-brief>.layui-tab-more li.layui-this:after {border-bottom: 0;} +.layui-nav-img {width:25px;height:25px;margin-right:0;} +.layui-header .msg-num { min-width: 18px;height: 18px;position: absolute;top: -10px;right: 5px;display: none;} +.layui-header .msg-num a {min-width: 18px; height: 18px; margin: 0; padding: 0; display: inline-block; font-size: 11px;line-height: 18px;text-align: center; background-color: #FF5722; color: #fff;border-radius: 12px; cursor: pointer;} + + +.layui-layout-admin .layui-body {top:50px; z-index:1008; padding:0;padding-right:0;padding-bottom:0;bottom:0;left:200px;overflow:visible;right:0;background-color:#F5F8FA;} + +.menulist-bg-gray{background-color:#001529;} +.menulist {width:100%;height:100%; border-right:1px solid #ccc; font-size:14px; color:#aaaaaa;} +.layui-side.menulist-bg-gray::-webkit-scrollbar{width: 0; height: 0;} +.menulist-top {padding: 10px 12px; font-size:0; border-bottom: 1px solid #17232c; text-align:center;} +.menulist-top a {background-color:#34a853; opacity:1; width: 25%; margin:0; padding: 5px 0; display:inline-block;} +.menulist-top .layui-icon {color:#fff;font-size:16px;} +.menulist-top a:first-child {border-radius: 3px 0 0 3px;} +.menulist-top a:last-child {border-radius: 0 3px 3px 0;} +.menulist-top a:hover{opacity: .9;} +.menulist .layui-nav{background-color:#001529;} +.menulist .layui-nav-tree .layui-nav-bar{width:4px;background-color:#E94335} +.layui-nav-tree .layui-nav-child{padding:0;} +.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover{background-color:#131E25} +.layui-nav .layui-nav-item a{padding-left:12px;} +.layui-nav .layui-nav-item a.menu-b{padding-left:32px;} +.layui-nav .layui-nav-item a.menu-c{padding-left:45px;} +.layui-nav .layui-nav-item a.menu-d{padding-left:58px;} + +.gougu-admin-tab {margin:0;} +.gougu-admin-tab .layui-icon-prev,.gougu-admin-tab .layui-icon-next {position:absolute;top:-50px; width:39px; height:49px; line-height:49px; color: #999; text-align:center; cursor:pointer; background-color:#fff;} +.gougu-admin-tab .layui-icon-prev{left:0; border-right: 1px solid #eee;} +.gougu-admin-tab .layui-icon-next {right:152px; border-left: 1px solid #eee;} +.gougu-admin-tab .layui-icon-prev:hover,.gougu-admin-tab .layui-icon-next:hover{color: #333;} + +.gougu-admin-tab .layui-tab-title {position:absolute;top:-50px; z-index:58; height:49px;left:40px; border:0;max-width:calc(100% - 226px); overflow:hidden;} +.gougu-admin-tab .layui-tab-title li {min-width:36px; padding:0 24px 0 12px; color:#666;font-size:12px;line-height:48px;border-top:3px solid #fff; border-right: 1px solid #F5F8FA; background-color:#fff;} +.gougu-admin-tab .layui-tab-title li .gougu-tab-active {display: inline-block; background-color: #999; width: 8px; height: 8px; border-radius: 20px; margin-right: 6px;} +.gougu-admin-tab .layui-tab-title li .layui-tab-close {position:absolute;width:15px;height:15px;line-height:16px;top:16px;right:5px;font-size:10px;display:none;border-radius:50%;} + +.gougu-admin-tab .layui-tab-title li:hover {color:#333;background-color:#F5F8FA;border-top:3px solid #333;} +.gougu-admin-tab .layui-tab-title li:hover .gougu-tab-active {background-color:#333} +.gougu-admin-tab .layui-tab-title li:hover .layui-tab-close {display:inline-block;} + +.gougu-admin-tab .layui-tab-title li .layui-tab-close:hover {background-color:#E94335;color:#fff;} + +.gougu-admin-tab .layui-tab-title li.layui-this {color:#333;background-color:#F5F8FA;border-top:3px solid #E94335;} +.gougu-admin-tab .layui-tab-title li.layui-this .gougu-tab-active{background-color:#E94335;} +.gougu-admin-tab .layui-tab-title li.layui-this .layui-tab-close{display:inline-block;} + +.gougu-admin-tab .layui-tab-title li.ittab-tab-home{padding:0 16px;} +.gougu-admin-tab .layui-tab-title li.ittab-tab-home .layui-tab-close {display:none;} +.gougu-admin-tab .layui-tab-title li.ittab-tab-home:hover .layui-tab-close {display:none;} + +.gougu-admin-tab .layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after {border:0;} +.gougu-admin-tab .layui-tab-item {height:100%;} +.gougu-admin-tab .layui-tab-bar {height: 50px;border-width: 0;line-height: 50px;} + +.layui-layout-admin .layui-footer {left:200px;height:30px;line-height:30px;background-color:#f0f0f0;font-size:12px;} +.layui-tab-content {padding:0px;} \ No newline at end of file diff --git a/jun_pc_web/static/home/file/msg.mp3 b/jun_pc_web/static/home/file/msg.mp3 new file mode 100644 index 000000000..8d576b6c7 Binary files /dev/null and b/jun_pc_web/static/home/file/msg.mp3 differ diff --git "a/jun_pc_web/static/home/file/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/jun_pc_web/static/home/file/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" new file mode 100644 index 000000000..53cacf987 Binary files /dev/null and "b/jun_pc_web/static/home/file/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" differ diff --git "a/jun_pc_web/static/home/file/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/jun_pc_web/static/home/file/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" new file mode 100644 index 000000000..217b1e862 Binary files /dev/null and "b/jun_pc_web/static/home/file/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" differ diff --git a/jun_pc_web/static/home/images/404.gif b/jun_pc_web/static/home/images/404.gif new file mode 100644 index 000000000..dd9a44bcb Binary files /dev/null and b/jun_pc_web/static/home/images/404.gif differ diff --git a/jun_pc_web/static/home/images/bg.png b/jun_pc_web/static/home/images/bg.png new file mode 100644 index 000000000..1d5015e6c Binary files /dev/null and b/jun_pc_web/static/home/images/bg.png differ diff --git a/jun_pc_web/static/home/images/bg_pattern.png b/jun_pc_web/static/home/images/bg_pattern.png new file mode 100644 index 000000000..cfd791106 Binary files /dev/null and b/jun_pc_web/static/home/images/bg_pattern.png differ diff --git a/jun_pc_web/static/home/images/icon.png b/jun_pc_web/static/home/images/icon.png new file mode 100644 index 000000000..9a516e4f3 Binary files /dev/null and b/jun_pc_web/static/home/images/icon.png differ diff --git a/jun_pc_web/static/home/images/icon/7z.png b/jun_pc_web/static/home/images/icon/7z.png new file mode 100644 index 000000000..fa89d1e65 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/7z.png differ diff --git a/jun_pc_web/static/home/images/icon/doc.png b/jun_pc_web/static/home/images/icon/doc.png new file mode 100644 index 000000000..8b700bb7a Binary files /dev/null and b/jun_pc_web/static/home/images/icon/doc.png differ diff --git a/jun_pc_web/static/home/images/icon/docx.png b/jun_pc_web/static/home/images/icon/docx.png new file mode 100644 index 000000000..8b700bb7a Binary files /dev/null and b/jun_pc_web/static/home/images/icon/docx.png differ diff --git a/jun_pc_web/static/home/images/icon/file.png b/jun_pc_web/static/home/images/icon/file.png new file mode 100644 index 000000000..f24402143 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/file.png differ diff --git a/jun_pc_web/static/home/images/icon/gif.png b/jun_pc_web/static/home/images/icon/gif.png new file mode 100644 index 000000000..1bc54f11e Binary files /dev/null and b/jun_pc_web/static/home/images/icon/gif.png differ diff --git a/jun_pc_web/static/home/images/icon/jpg.png b/jun_pc_web/static/home/images/icon/jpg.png new file mode 100644 index 000000000..4c0dd24a1 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/jpg.png differ diff --git a/jun_pc_web/static/home/images/icon/mp4.png b/jun_pc_web/static/home/images/icon/mp4.png new file mode 100644 index 000000000..777c6b33e Binary files /dev/null and b/jun_pc_web/static/home/images/icon/mp4.png differ diff --git a/jun_pc_web/static/home/images/icon/pdf.png b/jun_pc_web/static/home/images/icon/pdf.png new file mode 100644 index 000000000..c6781c617 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/pdf.png differ diff --git a/jun_pc_web/static/home/images/icon/png.png b/jun_pc_web/static/home/images/icon/png.png new file mode 100644 index 000000000..55fef0a76 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/png.png differ diff --git a/jun_pc_web/static/home/images/icon/ppt.png b/jun_pc_web/static/home/images/icon/ppt.png new file mode 100644 index 000000000..b52e2ed6c Binary files /dev/null and b/jun_pc_web/static/home/images/icon/ppt.png differ diff --git a/jun_pc_web/static/home/images/icon/pptx.png b/jun_pc_web/static/home/images/icon/pptx.png new file mode 100644 index 000000000..b52e2ed6c Binary files /dev/null and b/jun_pc_web/static/home/images/icon/pptx.png differ diff --git a/jun_pc_web/static/home/images/icon/psd.png b/jun_pc_web/static/home/images/icon/psd.png new file mode 100644 index 000000000..7471a6999 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/psd.png differ diff --git a/jun_pc_web/static/home/images/icon/rar.png b/jun_pc_web/static/home/images/icon/rar.png new file mode 100644 index 000000000..ee53e3761 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/rar.png differ diff --git a/jun_pc_web/static/home/images/icon/svg.png b/jun_pc_web/static/home/images/icon/svg.png new file mode 100644 index 000000000..d48464d14 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/svg.png differ diff --git a/jun_pc_web/static/home/images/icon/txt.png b/jun_pc_web/static/home/images/icon/txt.png new file mode 100644 index 000000000..bf5360b2c Binary files /dev/null and b/jun_pc_web/static/home/images/icon/txt.png differ diff --git a/jun_pc_web/static/home/images/icon/xls.png b/jun_pc_web/static/home/images/icon/xls.png new file mode 100644 index 000000000..7dfc85ff7 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/xls.png differ diff --git a/jun_pc_web/static/home/images/icon/xlsx.png b/jun_pc_web/static/home/images/icon/xlsx.png new file mode 100644 index 000000000..7dfc85ff7 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/xlsx.png differ diff --git a/jun_pc_web/static/home/images/icon/zip.png b/jun_pc_web/static/home/images/icon/zip.png new file mode 100644 index 000000000..b1e066d68 Binary files /dev/null and b/jun_pc_web/static/home/images/icon/zip.png differ diff --git a/jun_pc_web/static/home/images/lock_bg.svg b/jun_pc_web/static/home/images/lock_bg.svg new file mode 100644 index 000000000..86d3800fb --- /dev/null +++ b/jun_pc_web/static/home/images/lock_bg.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jun_pc_web/static/home/images/login_logo.png b/jun_pc_web/static/home/images/login_logo.png new file mode 100644 index 000000000..b3545a1a4 Binary files /dev/null and b/jun_pc_web/static/home/images/login_logo.png differ diff --git a/jun_pc_web/static/home/images/logo.png b/jun_pc_web/static/home/images/logo.png new file mode 100644 index 000000000..02e37e7f9 Binary files /dev/null and b/jun_pc_web/static/home/images/logo.png differ diff --git a/jun_pc_web/static/home/images/nonepic360x360.jpg b/jun_pc_web/static/home/images/nonepic360x360.jpg new file mode 100644 index 000000000..1bad1ba99 Binary files /dev/null and b/jun_pc_web/static/home/images/nonepic360x360.jpg differ diff --git a/jun_pc_web/static/home/images/nonepic600x360.jpg b/jun_pc_web/static/home/images/nonepic600x360.jpg new file mode 100644 index 000000000..d15f7d1c3 Binary files /dev/null and b/jun_pc_web/static/home/images/nonepic600x360.jpg differ diff --git a/jun_pc_web/static/home/images/nonepic600x600.jpg b/jun_pc_web/static/home/images/nonepic600x600.jpg new file mode 100644 index 000000000..da1f69753 Binary files /dev/null and b/jun_pc_web/static/home/images/nonepic600x600.jpg differ diff --git a/jun_pc_web/static/home/images/syslogo.png b/jun_pc_web/static/home/images/syslogo.png new file mode 100644 index 000000000..2c9a7f72a Binary files /dev/null and b/jun_pc_web/static/home/images/syslogo.png differ diff --git a/jun_pc_web/static/home/images/syslogo_small.png b/jun_pc_web/static/home/images/syslogo_small.png new file mode 100644 index 000000000..82e989345 Binary files /dev/null and b/jun_pc_web/static/home/images/syslogo_small.png differ diff --git a/jun_pc_web/static/images/icon/doc.png b/jun_pc_web/static/images/icon/doc.png new file mode 100644 index 000000000..8b700bb7a Binary files /dev/null and b/jun_pc_web/static/images/icon/doc.png differ diff --git a/jun_pc_web/static/images/icon/docx.png b/jun_pc_web/static/images/icon/docx.png new file mode 100644 index 000000000..8b700bb7a Binary files /dev/null and b/jun_pc_web/static/images/icon/docx.png differ diff --git a/jun_pc_web/static/images/icon/pdf.png b/jun_pc_web/static/images/icon/pdf.png new file mode 100644 index 000000000..c6781c617 Binary files /dev/null and b/jun_pc_web/static/images/icon/pdf.png differ diff --git a/jun_pc_web/static/images/icon/pptx.png b/jun_pc_web/static/images/icon/pptx.png new file mode 100644 index 000000000..b52e2ed6c Binary files /dev/null and b/jun_pc_web/static/images/icon/pptx.png differ diff --git a/jun_pc_web/static/images/icon/xls.png b/jun_pc_web/static/images/icon/xls.png new file mode 100644 index 000000000..7dfc85ff7 Binary files /dev/null and b/jun_pc_web/static/images/icon/xls.png differ diff --git a/jun_pc_web/static/images/icon/xlsx.png b/jun_pc_web/static/images/icon/xlsx.png new file mode 100644 index 000000000..7dfc85ff7 Binary files /dev/null and b/jun_pc_web/static/images/icon/xlsx.png differ diff --git a/jun_pc_web/static/jquery.min.js b/jun_pc_web/static/jquery.min.js new file mode 100644 index 000000000..49990d6e1 --- /dev/null +++ b/jun_pc_web/static/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ +return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
            "],col:[2,"","
            "],tr:[2,"","
            "],td:[3,"","
            "],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("