diff --git a/.gitignore b/.gitignore index d0de5cca8..2e6f44788 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,4 @@ assembly/runtime/* *.umi/ /assembly/deploy /runtime -.flattened-pom.xml \ No newline at end of file +**/.flattened-pom.xml \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG index 9a66340cd..88e9053ba 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,4 +7,15 @@ davinci 0.3.0 change log 6) modify permission process 7) optimize css style 8) optimize filter -9) delete view module \ No newline at end of file +9) delete view module + + +supersonic 0.6.0 change log +1) add llm parser and llm api server +2) support fuzzy mapping +3) support query filter and domain filter in query and search +4) support standalone mode +5) add dsl query in semantic +6) code architecture adjustment in semantic and chat +7) add unit testing and integration testing +8) support dimension and metric alias \ No newline at end of file diff --git a/README.md b/README.md index cb589a349..d8ce42237 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ English | [中文](README_CN.md) **SuperSonic is an out-of-the-box yet highly extensible framework for building a data chatbot**. SuperSonic provides a chat interface that empowers users to query data using natural language and visualize the results with suitable charts. To enable such experience, the only thing necessary is to define logical semantic models (metrics, dimensions, relationships, etc) on top of physical data models, and no data modification or copying is required. Meanwhile SuperSonic is designed to be plugable, allowing new functionalities to be added through plugins and core components to be integrated into other systems. + ## Motivation @@ -28,8 +29,10 @@ With these ideas in mind, we developed SuperSonic as a reference implementation SuperSonic is composed of two layers: supersonic-chat and supersonic-semantic. The chat layer is responsible for converting **natural language query** into semantic query (also known as DSL query), whereas the semantic layer is responsible for converting DSL query into **SQL query**. The high-level architecture and main process flow is shown in below diagram: + + ### Chat Layer The chat layer contains four core components: @@ -64,4 +67,4 @@ SuperSonic comes with sample semantic models as well as chat conversations that ## How to Build -Pull the source code and run script "assembly/bin/build-standalone.sh" to build packages in the standalone mode. \ No newline at end of file +Pull the source code and run script "assembly/bin/build-standalone.sh" to build packages in the standalone mode. diff --git a/assembly/bin/build-chat.sh b/assembly/bin/build-chat.sh new file mode 100755 index 000000000..e00ab2fa9 --- /dev/null +++ b/assembly/bin/build-chat.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +sbinDir=$(cd "$(dirname "$0")"; pwd) +baseDir=$(readlink -f $sbinDir/../) +runtimeDir=$baseDir/runtime +buildDir=$baseDir/build + +cd $baseDir + +#1. move package to build +cp $baseDir/../launchers/chat/target/*.tar.gz ${buildDir}/supersonic-chat.tar.gz + diff --git a/assembly/bin/build-all.sh b/assembly/bin/build-semantic.sh similarity index 74% rename from assembly/bin/build-all.sh rename to assembly/bin/build-semantic.sh index 2259177ec..5eefb3845 100755 --- a/assembly/bin/build-all.sh +++ b/assembly/bin/build-semantic.sh @@ -7,18 +7,17 @@ buildDir=$baseDir/build cd $baseDir -#1. build semantic chat service +#1. build semantic service rm -fr ${buildDir}/*.tar.gz rm -fr dist mvn -f $baseDir/../ clean package -DskipTests #2. move package to build -cp $baseDir/../launchers/chat/target/*.tar.gz ${buildDir}/supersonic-chat.tar.gz cp $baseDir/../launchers/semantic/target/*.tar.gz ${buildDir}/supersonic-semantic.tar.gz #3. build webapp chmod +x $baseDir/../webapp/start-fe-prod.sh cd ../webapp sh ./start-fe-prod.sh -cp -fr ./supersonic-webapp.tar.gz ${buildDir}/ \ No newline at end of file +cp -fr ./supersonic-webapp.tar.gz ${buildDir}/ diff --git a/assembly/bin/start-chat.sh b/assembly/bin/start-chat.sh new file mode 100755 index 000000000..87e1920b4 --- /dev/null +++ b/assembly/bin/start-chat.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +sbinDir=$(cd "$(dirname "$0")"; pwd) +baseDir=$(readlink -f $sbinDir/../) +runtimeDir=$baseDir/../runtime +buildDir=$baseDir/build + +cd $baseDir + +#2. package lib + +tar -zxvf ${buildDir}/supersonic-chat.tar.gz -C ${runtimeDir} + +mv ${runtimeDir}/launchers-chat-* ${runtimeDir}/supersonic-chat + +tar -zxvf ${buildDir}/supersonic-webapp.tar.gz -C ${buildDir} + +mkdir -p ${runtimeDir}/supersonic-chat/webapp + +cp -fr ${buildDir}/supersonic-webapp/* ${runtimeDir}/supersonic-chat/webapp + +rm -fr ${buildDir}/supersonic-webapp + +json=$(cat ${runtimeDir}/supersonic-chat/webapp/supersonic.config.json) +json=$(echo $json | jq '.env="chat"') +echo $json > ${runtimeDir}/supersonic-chat/webapp/supersonic.config.json + +#3. start service +#3.1 start chat service +echo ${runtimeDir} +sh ${runtimeDir}/supersonic-chat/bin/service.sh restart + +#3.2 start llm service +sh ${runtimeDir}/supersonic-chat/llm/bin/service.sh restart + diff --git a/assembly/bin/start-all.sh b/assembly/bin/start-semantic.sh similarity index 68% rename from assembly/bin/start-all.sh rename to assembly/bin/start-semantic.sh index dc7c5abb5..1c070b83b 100755 --- a/assembly/bin/start-all.sh +++ b/assembly/bin/start-semantic.sh @@ -14,23 +14,23 @@ rm -fr ${runtimeDir}/* #2. package lib tar -zxvf ${buildDir}/supersonic-semantic.tar.gz -C ${runtimeDir} -tar -zxvf ${buildDir}/supersonic-chat.tar.gz -C ${runtimeDir} -mv ${runtimeDir}/launchers-chat-* ${runtimeDir}/supersonic-chat mv ${runtimeDir}/launchers-semantic-* ${runtimeDir}/supersonic-semantic tar -zxvf ${buildDir}/supersonic-webapp.tar.gz -C ${buildDir} mkdir -p ${runtimeDir}/supersonic-semantic/webapp -mkdir -p ${runtimeDir}/supersonic-chat/webapp cp -fr ${buildDir}/supersonic-webapp/* ${runtimeDir}/supersonic-semantic/webapp -cp -fr ${buildDir}/supersonic-webapp/* ${runtimeDir}/supersonic-chat/webapp rm -fr ${buildDir}/supersonic-webapp + +json=$(cat ${runtimeDir}/supersonic-semantic/webapp/supersonic.config.json) +json=$(echo $json | jq '.env="semantic"') +echo $json > ${runtimeDir}/supersonic-semantic/webapp/supersonic.config.json + #3. start service sh ${runtimeDir}/supersonic-semantic/bin/service.sh restart -sleep 5 -sh ${runtimeDir}/supersonic-chat/bin/service.sh restart + diff --git a/assembly/bin/start-standalone.sh b/assembly/bin/start-standalone.sh index e0a180eda..80fb3099d 100755 --- a/assembly/bin/start-standalone.sh +++ b/assembly/bin/start-standalone.sh @@ -26,5 +26,7 @@ cp -fr ${buildDir}/supersonic-webapp/* ${runtimeDir}/supersonic-standalone/weba rm -fr ${buildDir}/supersonic-webapp #3. start service +#start standalone service sh ${runtimeDir}/supersonic-standalone/bin/service.sh restart - +#start llm service +sh ${runtimeDir}/supersonic-standalone/llm/bin/service.sh restart \ No newline at end of file diff --git a/assembly/build/build.xml b/assembly/build/build.xml index 7165bcc00..29d0806a6 100644 --- a/assembly/build/build.xml +++ b/assembly/build/build.xml @@ -28,6 +28,12 @@ *.jar + + ${project.basedir}/../../chat/core/src/main/python + llm + 0777 + 0755 + diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java index b245ece49..c925b21bd 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java @@ -2,6 +2,7 @@ package com.tencent.supersonic.auth.authentication.domain.interceptor; import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; +import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword; import com.tencent.supersonic.auth.authentication.application.UserServiceImpl; import com.tencent.supersonic.auth.authentication.domain.utils.UserTokenUtils; @@ -27,11 +28,12 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor userTokenUtils = ContextUtils.getBean(UserTokenUtils.class); s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); if (!authenticationConfig.isEnabled()) { + setFakerUser(request); return true; } if (isInternalRequest(request)) { - String token = userTokenUtils.generateAdminToken(); - reflectSetparam(request, authenticationConfig.getTokenHttpHeaderKey(), token); + setFakerUser(request); + return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); @@ -47,15 +49,25 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor UserWithPassword user = userTokenUtils.getUserWithPassword(request); if (StringUtils.isNotBlank(user.getName())) { - ThreadContext threadContext = ThreadContext.builder() - .token(request.getHeader(authenticationConfig.getTokenHttpHeaderKey())) - .userName(user.getName()) - .build(); - s2ThreadContext.set(threadContext); + setContext(user.getName(), request); return true; } throw new AccessException("authentication failed, please login"); } + private void setFakerUser(HttpServletRequest request) { + String token = userTokenUtils.generateAdminToken(); + reflectSetparam(request, authenticationConfig.getTokenHttpHeaderKey(), token); + setContext(User.getFakeUser().getName(), request); + } + + private void setContext(String userName, HttpServletRequest request) { + ThreadContext threadContext = ThreadContext.builder() + .token(request.getHeader(authenticationConfig.getTokenHttpHeaderKey())) + .userName(userName) + .build(); + s2ThreadContext.set(threadContext); + } + } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java index e524d8189..f3c2566f1 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java @@ -1,8 +1,10 @@ package com.tencent.supersonic.chat.api.component; +import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; +import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; +import com.tencent.supersonic.semantic.api.core.response.*; import com.tencent.supersonic.semantic.api.query.request.QuerySqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; @@ -26,8 +28,24 @@ public interface SemanticLayer { QueryResultWithSchemaResp queryBySql(QuerySqlReq querySqlReq, User user); - DomainSchemaResp getDomainSchemaInfo(Long domain); + DomainSchemaResp getDomainSchemaInfo(Long domain, Boolean cacheEnable); List getDomainSchemaInfo(List ids); + List getDomainListForViewer(); + + List getDomainListForAdmin(); + + PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd); + + PageInfo queryMetricPage(PageMetricReq pageMetricCmd); + +// PageInfo queryMetricPage(PageMetricReq pageMetricCmd); +// +// PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd); +// +// List getDomainListForAdmin(); +// +// List getDomainListForViewer(); + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/ConfigServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/ConfigServiceImpl.java index 63ba2fa20..4a21a7e0f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/ConfigServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/ConfigServiceImpl.java @@ -3,32 +3,25 @@ package com.tencent.supersonic.chat.application; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfig; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBase; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReq; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; -import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ItemVisibilityInfo; -import com.tencent.supersonic.chat.domain.pojo.config.KnowledgeInfo; -import com.tencent.supersonic.chat.domain.repository.ChatConfigRepository; -import com.tencent.supersonic.chat.domain.service.ConfigService; -import com.tencent.supersonic.chat.domain.utils.ChatConfigUtils; +import com.tencent.supersonic.chat.domain.pojo.config.*; import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.DefaultSemanticInternalUtils; -import com.tencent.supersonic.common.util.json.JsonUtil; +import com.tencent.supersonic.common.pojo.SchemaItem; import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; import com.tencent.supersonic.semantic.api.core.response.DomainResp; import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; +import com.tencent.supersonic.chat.domain.repository.ChatConfigRepository; +import com.tencent.supersonic.chat.domain.service.ConfigService; +import com.tencent.supersonic.chat.domain.utils.ChatConfigUtils; +import com.tencent.supersonic.common.util.json.JsonUtil; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; @@ -40,33 +33,31 @@ import org.springframework.util.CollectionUtils; @Service public class ConfigServiceImpl implements ConfigService { - private final ChatConfigRepository chaConfigRepository; + private final ChatConfigRepository chatConfigRepository; private final ChatConfigUtils chatConfigUtils; - private final DefaultSemanticInternalUtils defaultSemanticUtils; + private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - public ConfigServiceImpl(ChatConfigRepository chaConfigRepository, - ChatConfigUtils chatConfigUtils, - @Lazy DefaultSemanticInternalUtils defaultSemanticUtils) { - this.chaConfigRepository = chaConfigRepository; + public ConfigServiceImpl(ChatConfigRepository chatConfigRepository, + ChatConfigUtils chatConfigUtils) { + this.chatConfigRepository = chatConfigRepository; this.chatConfigUtils = chatConfigUtils; - this.defaultSemanticUtils = defaultSemanticUtils; } @Override - public Long addConfig(ChatConfigBase configBaseCmd, User user) { + public Long addConfig(ChatConfigBaseReq configBaseCmd, User user) { log.info("[create domain extend] object:{}", JsonUtil.toString(configBaseCmd, true)); duplicateCheck(configBaseCmd.getDomainId()); permissionCheckLogic(configBaseCmd.getDomainId(), user.getName()); ChatConfig chaConfig = chatConfigUtils.newChatConfig(configBaseCmd, user); - chaConfigRepository.createConfig(chaConfig); - return chaConfig.getDomainId(); + Long id = chatConfigRepository.createConfig(chaConfig); + return id; } private void duplicateCheck(Long domainId) { ChatConfigFilter filter = new ChatConfigFilter(); filter.setDomainId(domainId); - List chaConfigDescList = chaConfigRepository.getChatConfig(filter); + List chaConfigDescList = chatConfigRepository.getChatConfig(filter); if (!CollectionUtils.isEmpty(chaConfigDescList)) { throw new RuntimeException("chat config existed, no need to add repeatedly"); } @@ -74,16 +65,16 @@ public class ConfigServiceImpl implements ConfigService { @Override - public Long editConfig(ChatConfigEditReq configEditCmd, User user) { + public Long editConfig(ChatConfigEditReqReq configEditCmd, User user) { log.info("[edit domain extend] object:{}", JsonUtil.toString(configEditCmd, true)); if (Objects.isNull(configEditCmd) || Objects.isNull(configEditCmd.getId()) && Objects.isNull( configEditCmd.getDomainId())) { throw new RuntimeException("editConfig, id and domainId are not allowed to be empty at the same time"); } permissionCheckLogic(configEditCmd.getDomainId(), user.getName()); - ChatConfig chaConfig = chatConfigUtils.editChaConfig(configEditCmd, user); - chaConfigRepository.updateConfig(chaConfig); - return configEditCmd.getDomainId(); + ChatConfig chaConfig = chatConfigUtils.editChatConfig(configEditCmd, user); + chatConfigRepository.updateConfig(chaConfig); + return configEditCmd.getId(); } @@ -96,98 +87,34 @@ public class ConfigServiceImpl implements ConfigService { } @Override - public List search(ChatConfigFilter filter, User user) { + public List search(ChatConfigFilter filter, User user) { log.info("[search domain extend] object:{}", JsonUtil.toString(filter, true)); - List chaConfigDescList = chaConfigRepository.getChatConfig(filter); + List chaConfigDescList = chatConfigRepository.getChatConfig(filter); return chaConfigDescList; } - public ChatConfigInfo fetchConfigByDomainId(Long domainId) { - return chaConfigRepository.getConfigByDomainId(domainId); - } - - public EntityRichInfo fetchEntityDescByDomainId(Long domainId) { - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - ChatConfigInfo chaConfigDesc = chaConfigRepository.getConfigByDomainId(domainId); - DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo(domainId); - return fetchEntityDescByConfig(chaConfigDesc, domainSchemaDesc); - } - - public EntityRichInfo fetchEntityDescByConfig(ChatConfigInfo chatConfigDesc, DomainSchemaResp domain) { - Long domainId = chatConfigDesc.getDomainId(); - EntityRichInfo entityDesc = new EntityRichInfo(); - if (Objects.isNull(chatConfigDesc) || Objects.isNull(chatConfigDesc.getEntity())) { - log.info("domainId:{}, entityDesc info is null", domainId); - return entityDesc; - } - - entityDesc.setDomainId(domain.getId()); - entityDesc.setDomainBizName(domain.getBizName()); - entityDesc.setDomainName(domain.getName()); - entityDesc.setNames(chatConfigDesc.getEntity().getNames()); - - entityDesc.setEntityIds(chatConfigUtils.generateDimDesc(chatConfigDesc.getEntity().getEntityIds(), domain)); - entityDesc.setEntityInternalDetailDesc( - chatConfigUtils.generateEntityDetailData(chatConfigDesc.getEntity().getDetailData(), domain)); - return entityDesc; + @Override + public ChatConfigResp fetchConfigByDomainId(Long domainId) { + return chatConfigRepository.getConfigByDomainId(domainId); } - public List fetchDefaultMetricDescByDomainId(Long domainId) { - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - ChatConfigInfo chatConfigDesc = chaConfigRepository.getConfigByDomainId(domainId); - DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo(domainId); - return fetchDefaultMetricDescByConfig(chatConfigDesc, domainSchemaDesc); - } - - public List fetchDefaultMetricDescByConfig(ChatConfigInfo chatConfigDesc, DomainSchemaResp domain) { - Long domainId = chatConfigDesc.getDomainId(); - List defaultMetricDescList = new ArrayList<>(); - if (Objects.isNull(chatConfigDesc) || CollectionUtils.isEmpty(chatConfigDesc.getDefaultMetrics())) { - log.info("domainId:{}, defaultMetricDescList info is null", domainId); - return defaultMetricDescList; - } - List metricIds = chatConfigDesc.getDefaultMetrics().stream() - .map(defaultMetricInfo -> defaultMetricInfo.getMetricId()).collect(Collectors.toList()); - Map metricIdAndDescPair = chatConfigUtils.generateMetricIdAndDescPair(metricIds, - domain); - chatConfigDesc.getDefaultMetrics().stream().forEach(defaultMetricInfo -> { - DefaultMetric defaultMetricDesc = new DefaultMetric(); - BeanUtils.copyProperties(defaultMetricInfo, defaultMetricDesc); - if (metricIdAndDescPair.containsKey(defaultMetricInfo.getMetricId())) { - MetricSchemaResp metricDesc = metricIdAndDescPair.get(defaultMetricInfo.getMetricId()); - defaultMetricDesc.setBizName(metricDesc.getBizName()); - defaultMetricDesc.setName(metricDesc.getName()); - } - defaultMetricDescList.add(defaultMetricDesc); - }); - return defaultMetricDescList; - } - - public ItemVisibilityInfo fetchVisibilityDescByDomainId(Long domainId) { - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - ChatConfigInfo chatConfigDesc = chaConfigRepository.getConfigByDomainId(domainId); - DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo(domainId); - return fetchVisibilityDescByConfig(chatConfigDesc, domainSchemaDesc); - } - - private ItemVisibilityInfo fetchVisibilityDescByConfig(ChatConfigInfo chatConfigDesc, - DomainSchemaResp domainSchemaDesc) { + private ItemVisibilityInfo fetchVisibilityDescByConfig(ItemVisibility visibility, + DomainSchemaResp domainSchemaDesc) { ItemVisibilityInfo itemVisibilityDesc = new ItemVisibilityInfo(); - Long domainId = chatConfigDesc.getDomainId(); List dimIdAllList = chatConfigUtils.generateAllDimIdList(domainSchemaDesc); List metricIdAllList = chatConfigUtils.generateAllMetricIdList(domainSchemaDesc); List blackDimIdList = new ArrayList<>(); List blackMetricIdList = new ArrayList<>(); - if (Objects.nonNull(chatConfigDesc.getVisibility())) { - if (!CollectionUtils.isEmpty(chatConfigDesc.getVisibility().getBlackDimIdList())) { - blackDimIdList.addAll(chatConfigDesc.getVisibility().getBlackDimIdList()); + if (Objects.nonNull(visibility)) { + if (!CollectionUtils.isEmpty(visibility.getBlackDimIdList())) { + blackDimIdList.addAll(visibility.getBlackDimIdList()); } - if (!CollectionUtils.isEmpty(chatConfigDesc.getVisibility().getBlackMetricIdList())) { - blackMetricIdList.addAll(chatConfigDesc.getVisibility().getBlackMetricIdList()); + if (!CollectionUtils.isEmpty(visibility.getBlackMetricIdList())) { + blackMetricIdList.addAll(visibility.getBlackMetricIdList()); } } List whiteMetricIdList = metricIdAllList.stream().filter(id -> !blackMetricIdList.contains(id)) @@ -204,31 +131,110 @@ public class ConfigServiceImpl implements ConfigService { } @Override - public ChatConfigRichInfo getConfigRichInfo(Long domainId) { - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - ChatConfigRichInfo chaConfigRichDesc = new ChatConfigRichInfo(); - ChatConfigInfo chatConfigDesc = chaConfigRepository.getConfigByDomainId(domainId); - if (Objects.isNull(chatConfigDesc)) { + public ChatConfigRichResp getConfigRichInfo(Long domainId) { + ChatConfigRichResp chatConfigRichResp = new ChatConfigRichResp(); + ChatConfigResp chatConfigResp = chatConfigRepository.getConfigByDomainId(domainId); + if (Objects.isNull(chatConfigResp)) { log.info("there is no chatConfigDesc for domainId:{}", domainId); - return chaConfigRichDesc; + return chatConfigRichResp; } - BeanUtils.copyProperties(chatConfigDesc, chaConfigRichDesc); + BeanUtils.copyProperties(chatConfigResp, chatConfigRichResp); - DomainSchemaResp domainSchemaInfo = semanticLayer.getDomainSchemaInfo(domainId); - chaConfigRichDesc.setBizName(domainSchemaInfo.getBizName()); - chaConfigRichDesc.setName(domainSchemaInfo.getName()); + SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + DomainSchemaResp domainSchemaInfo = semanticLayer.getDomainSchemaInfo(domainId, false); + chatConfigRichResp.setBizName(domainSchemaInfo.getBizName()); + chatConfigRichResp.setDomainName(domainSchemaInfo.getName()); - chaConfigRichDesc.setKnowledgeInfos( - fillKnowledgeBizName(chaConfigRichDesc.getKnowledgeInfos(), domainSchemaInfo)); - chaConfigRichDesc.setDefaultMetrics(fetchDefaultMetricDescByConfig(chatConfigDesc, domainSchemaInfo)); - chaConfigRichDesc.setVisibility(fetchVisibilityDescByConfig(chatConfigDesc, domainSchemaInfo)); - chaConfigRichDesc.setEntity(fetchEntityDescByConfig(chatConfigDesc, domainSchemaInfo)); + chatConfigRichResp.setChatAggRichConfig(fillChatAggRichConfig(domainSchemaInfo, chatConfigResp)); + chatConfigRichResp.setChatDetailRichConfig(fillChatDetailRichConfig(domainSchemaInfo, chatConfigRichResp, chatConfigResp)); - return chaConfigRichDesc; + return chatConfigRichResp; } + private ChatDetailRichConfig fillChatDetailRichConfig(DomainSchemaResp domainSchemaInfo, ChatConfigRichResp chatConfigRichResp, ChatConfigResp chatConfigResp) { + if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatDetailConfig())) { + return null; + } + ChatDetailRichConfig detailRichConfig = new ChatDetailRichConfig(); + ChatDetailConfig chatDetailConfig = chatConfigResp.getChatDetailConfig(); + + detailRichConfig.setVisibility(fetchVisibilityDescByConfig(chatDetailConfig.getVisibility(), domainSchemaInfo)); + detailRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatDetailConfig.getKnowledgeInfos(), domainSchemaInfo)); + detailRichConfig.setGlobalKnowledgeConfig(chatDetailConfig.getGlobalKnowledgeConfig()); + detailRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatDetailConfig.getChatDefaultConfig(), domainSchemaInfo)); + + detailRichConfig.setEntity(generateRichEntity(chatDetailConfig.getEntity(), domainSchemaInfo)); + return detailRichConfig; + } + + private EntityRichInfo generateRichEntity(Entity entity, DomainSchemaResp domainSchemaInfo) { + EntityRichInfo entityRichInfo = new EntityRichInfo(); + if (Objects.isNull(entity) || Objects.isNull(entity.getEntityId())) { + return entityRichInfo; + } + BeanUtils.copyProperties(entity, entityRichInfo); + Map dimIdAndRespPair = domainSchemaInfo.getDimensions().stream() + .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); + + entityRichInfo.setDimItem(dimIdAndRespPair.get(entity.getEntityId())); + return entityRichInfo; + } + + private ChatAggRichConfig fillChatAggRichConfig(DomainSchemaResp domainSchemaInfo, ChatConfigResp chatConfigResp) { + if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatAggConfig())) { + return null; + } + ChatAggConfig chatAggConfig = chatConfigResp.getChatAggConfig(); + ChatAggRichConfig chatAggRichConfig = new ChatAggRichConfig(); + + chatAggRichConfig.setVisibility(fetchVisibilityDescByConfig(chatAggConfig.getVisibility(), domainSchemaInfo)); + chatAggRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatAggConfig.getKnowledgeInfos(), domainSchemaInfo)); + chatAggRichConfig.setGlobalKnowledgeConfig(chatAggConfig.getGlobalKnowledgeConfig()); + chatAggRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatAggConfig.getChatDefaultConfig(), domainSchemaInfo)); + + return chatAggRichConfig; + } + + private ChatDefaultRichConfig fetchDefaultConfig(ChatDefaultConfig chatDefaultConfig, DomainSchemaResp domainSchemaInfo) { + ChatDefaultRichConfig defaultRichConfig = new ChatDefaultRichConfig(); + if (Objects.isNull(chatDefaultConfig)) { + return defaultRichConfig; + } + BeanUtils.copyProperties(chatDefaultConfig, defaultRichConfig); + Map dimIdAndRespPair = domainSchemaInfo.getDimensions().stream() + .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); + + Map metricIdAndRespPair = domainSchemaInfo.getMetrics().stream() + .collect(Collectors.toMap(MetricSchemaResp::getId, Function.identity())); + + List dimensions = new ArrayList<>(); + List metrics = new ArrayList<>(); + if (!CollectionUtils.isEmpty(chatDefaultConfig.getDimensionIds())) { + chatDefaultConfig.getDimensionIds().stream().forEach(dimId -> { + DimSchemaResp dimSchemaResp = dimIdAndRespPair.get(dimId); + SchemaItem dimSchema = new SchemaItem(); + BeanUtils.copyProperties(dimSchemaResp, dimSchema); + dimensions.add(dimSchema); + }); + } + + if (!CollectionUtils.isEmpty(chatDefaultConfig.getMetricIds())) { + chatDefaultConfig.getMetricIds().stream().forEach(metricId -> { + MetricSchemaResp metricSchemaResp = metricIdAndRespPair.get(metricId); + SchemaItem metricSchema = new SchemaItem(); + BeanUtils.copyProperties(metricSchemaResp, metricSchema); + metrics.add(metricSchema); + }); + } + + defaultRichConfig.setDimensions(dimensions); + defaultRichConfig.setMetrics(metrics); + return defaultRichConfig; + } + + private List fillKnowledgeBizName(List knowledgeInfos, - DomainSchemaResp domainSchemaInfo) { + DomainSchemaResp domainSchemaInfo) { if (CollectionUtils.isEmpty(knowledgeInfos)) { return new ArrayList<>(); } @@ -240,30 +246,21 @@ public class ConfigServiceImpl implements ConfigService { if (Objects.nonNull(dimSchemaResp)) { knowledgeInfo.setBizName(dimSchemaResp.getBizName()); } - if (CollectionUtils.isEmpty(knowledgeInfo.getBlackList())) { - knowledgeInfo.setBlackList(new ArrayList<>()); - } - if (CollectionUtils.isEmpty(knowledgeInfo.getRuleList())) { - knowledgeInfo.setRuleList(new ArrayList<>()); - } - if (CollectionUtils.isEmpty(knowledgeInfo.getWhiteList())) { - knowledgeInfo.setWhiteList(new ArrayList<>()); - } } }); return knowledgeInfos; } @Override - public List getAllChatRichConfig() { - List chatConfigRichInfoList = new ArrayList<>(); - List domainRespList = defaultSemanticUtils.getDomainListForAdmin(); + public List getAllChatRichConfig() { + List chatConfigRichInfoList = new ArrayList<>(); + List domainRespList = semanticLayer.getDomainListForAdmin(); domainRespList.stream().forEach(domainResp -> { - ChatConfigRichInfo chatConfigRichInfo = getConfigRichInfo(domainResp.getId()); + ChatConfigRichResp chatConfigRichInfo = getConfigRichInfo(domainResp.getId()); if (Objects.nonNull(chatConfigRichInfo)) { chatConfigRichInfoList.add(chatConfigRichInfo); } }); return chatConfigRichInfoList; } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java index 935bb9090..41cc10d6a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java @@ -8,15 +8,14 @@ import com.tencent.supersonic.chat.api.pojo.DomainInfo; import com.tencent.supersonic.chat.api.pojo.EntityInfo; import com.tencent.supersonic.chat.api.pojo.Filter; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; +import com.tencent.supersonic.chat.domain.pojo.config.ChatDefaultRichConfig; import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.DefaultSemanticInternalUtils; import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import java.util.ArrayList; @@ -37,7 +36,7 @@ public class DomainEntityService { private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); @Autowired - private DefaultSemanticInternalUtils defaultSemanticUtils; + private ConfigServiceImpl configService; public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, User user) { if (parseInfo != null && parseInfo.getDomainId() > 0) { @@ -77,42 +76,55 @@ public class DomainEntityService { } public EntityInfo getEntityInfo(Long domain) { - ChatConfigRichInfo chaConfigRichDesc = defaultSemanticUtils.getChatConfigRichInfo(domain); - return getEntityInfo(chaConfigRichDesc.getEntity()); + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domain); + if (Objects.isNull(chaConfigRichDesc) || Objects.isNull(chaConfigRichDesc.getChatDetailRichConfig())) { + return new EntityInfo(); + } + return getEntityInfo(chaConfigRichDesc); } - private EntityInfo getEntityInfo(EntityRichInfo entityDesc) { - EntityInfo entityInfo = new EntityInfo(); + private EntityInfo getEntityInfo(ChatConfigRichResp chaConfigRichDesc) { - if (entityDesc != null && Objects.nonNull(entityDesc.getDomainId())) { + EntityInfo entityInfo = new EntityInfo(); + EntityRichInfo entityDesc = chaConfigRichDesc.getChatDetailRichConfig().getEntity(); + if (entityDesc != null && Objects.nonNull(chaConfigRichDesc.getDomainId())) { DomainInfo domainInfo = new DomainInfo(); - domainInfo.setItemId(Integer.valueOf(entityDesc.getDomainId().intValue())); - domainInfo.setName(entityDesc.getDomainName()); + domainInfo.setItemId(Integer.valueOf(chaConfigRichDesc.getDomainId().intValue())); + domainInfo.setName(chaConfigRichDesc.getDomainName()); domainInfo.setWords(entityDesc.getNames()); - domainInfo.setBizName(entityDesc.getDomainBizName()); - if (entityDesc.getEntityIds().size() > 0) { - domainInfo.setPrimaryEntityBizName(entityDesc.getEntityIds().get(0).getBizName()); + domainInfo.setBizName(chaConfigRichDesc.getBizName()); + if (Objects.nonNull(entityDesc.getDimItem())) { + domainInfo.setPrimaryEntityBizName(entityDesc.getDimItem().getBizName()); } + entityInfo.setDomainInfo(domainInfo); List dimensions = new ArrayList<>(); List metrics = new ArrayList<>(); - if (entityDesc.getEntityInternalDetailDesc() != null) { - for (DimSchemaResp dimensionDesc : entityDesc.getEntityInternalDetailDesc().getDimensionList()) { - DataInfo mainEntityDimension = new DataInfo(); - mainEntityDimension.setItemId(dimensionDesc.getId().intValue()); - mainEntityDimension.setName(dimensionDesc.getName()); - mainEntityDimension.setBizName(dimensionDesc.getBizName()); - dimensions.add(mainEntityDimension); + + if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig()) + && Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig())) { + ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig(); + if(!CollectionUtils.isEmpty(chatDefaultConfig.getDimensions())){ + for (SchemaItem dimensionDesc : chatDefaultConfig.getDimensions()) { + DataInfo mainEntityDimension = new DataInfo(); + mainEntityDimension.setItemId(dimensionDesc.getId().intValue()); + mainEntityDimension.setName(dimensionDesc.getName()); + mainEntityDimension.setBizName(dimensionDesc.getBizName()); + dimensions.add(mainEntityDimension); + } + entityInfo.setDimensions(dimensions); } - entityInfo.setDimensions(dimensions); - for (MetricSchemaResp metricDesc : entityDesc.getEntityInternalDetailDesc().getMetricList()) { - DataInfo dataInfo = new DataInfo(); - dataInfo.setName(metricDesc.getName()); - dataInfo.setBizName(metricDesc.getBizName()); - dataInfo.setItemId(metricDesc.getId().intValue()); - metrics.add(dataInfo); + + if(!CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())){ + for (SchemaItem metricDesc : chatDefaultConfig.getMetrics()) { + DataInfo dataInfo = new DataInfo(); + dataInfo.setName(metricDesc.getName()); + dataInfo.setBizName(metricDesc.getBizName()); + dataInfo.setItemId(metricDesc.getId().intValue()); + metrics.add(dataInfo); + } + entityInfo.setMetrics(metrics); } - entityInfo.setMetrics(metrics); } } return entityInfo; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java index 46d2b8a2a..4fdde6e91 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java @@ -14,6 +14,7 @@ import com.tencent.supersonic.chat.domain.service.QueryService; import com.tencent.supersonic.chat.domain.service.ChatService; import com.tencent.supersonic.chat.domain.utils.ComponentFactory; import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; +import com.tencent.supersonic.common.util.json.JsonUtil; import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; import java.util.List; import java.util.stream.Collectors; @@ -50,7 +51,6 @@ public class QueryServiceImpl implements QueryService { log.info("semanticParser processing:[{}]", semanticParser.getClass().getName()); semanticParser.parse(queryCtx, chatCtx); } - if (queryCtx.getCandidateQueries().size() > 0) { log.info("pick before [{}]", queryCtx.getCandidateQueries().stream().collect( Collectors.toList())); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java index 6044b08d0..b88ce07e4 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java @@ -29,7 +29,7 @@ public class RecommendServiceImpl implements RecommendService { } DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo( - Long.valueOf(domainId)); + Long.valueOf(domainId), true); List dimensions = domainSchemaDesc.getDimensions().stream().map(dimSchemaDesc -> { RecommendResponse.Item item = new RecommendResponse.Item(); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/SearchServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/SearchServiceImpl.java index f9361d1fa..47ba6529a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/SearchServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/SearchServiceImpl.java @@ -2,6 +2,8 @@ package com.tencent.supersonic.chat.application; import com.google.common.collect.Lists; import com.hankcs.hanlp.seg.common.Term; +import com.tencent.supersonic.chat.api.pojo.Filter; +import com.tencent.supersonic.chat.api.pojo.QueryFilter; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.request.QueryContextReq; import com.tencent.supersonic.chat.application.knowledge.NatureHelper; @@ -64,8 +66,7 @@ public class SearchServiceImpl implements SearchService { List metricsDb = domainInfosDb.getMetrics(); final Map domainToName = domainInfosDb.getDomainToName(); // 2.detect by segment - List originals = HanlpHelper.getSegment().seg(queryText.toLowerCase()).stream() - .collect(Collectors.toList()); + List originals = HanlpHelper.getTerms(queryText); Map> regTextMap = searchMatchStrategy.match(queryText, originals, queryCtx.getDomainId()); regTextMap.entrySet().stream().forEach(m -> HanlpHelper.transLetterOriginal(m.getValue())); @@ -101,7 +102,7 @@ public class SearchServiceImpl implements SearchService { for (Map.Entry natureToNameEntry : natureToNameMap.entrySet()) { searchDimensionValue(metricsDb, domainToName, domainStat.getMetricDomainCount(), searchResults, - existMetricAndDimension, matchText, natureToNameMap, natureToNameEntry); + existMetricAndDimension, matchText, natureToNameMap, natureToNameEntry, queryCtx.getQueryFilter()); } return searchResults.stream().limit(RESULT_SIZE).collect(Collectors.toList()); } @@ -140,13 +141,14 @@ public class SearchServiceImpl implements SearchService { } private void searchDimensionValue(List metricsDb, - Map domainToName, - long metricDomainCount, - Set searchResults, - boolean existMetricAndDimension, - MatchText matchText, - Map natureToNameMap, - Map.Entry natureToNameEntry) { + Map domainToName, + long metricDomainCount, + Set searchResults, + boolean existMetricAndDimension, + MatchText matchText, + Map natureToNameMap, + Map.Entry natureToNameEntry, + QueryFilter queryFilter) { String nature = natureToNameEntry.getKey(); String wordName = natureToNameEntry.getValue(); @@ -158,6 +160,9 @@ public class SearchServiceImpl implements SearchService { } // If there are no metric/dimension, complete the metric information if (metricDomainCount <= 0 && !existMetricAndDimension) { + if (filterByQueryFilter(matchText.getRegText(), queryFilter)) { + return; + } searchResults.add( new SearchResult(matchText.getRegText() + wordName, wordName, domainToName.get(domain), domain, schemaElementType)); @@ -167,7 +172,6 @@ public class SearchServiceImpl implements SearchService { } List metrics = filerMetricsByDomain(metricsDb, domain).stream().limit(metricSize).collect( Collectors.toList()); - ; for (String metric : metrics) { String subRecommend = matchText.getRegText() + wordName + NatureType.SPACE + metric; searchResults.add( @@ -181,6 +185,19 @@ public class SearchServiceImpl implements SearchService { } } + private boolean filterByQueryFilter(String regText, QueryFilter queryFilter) { + if (queryFilter == null || CollectionUtils.isEmpty(queryFilter.getFilters())) { + return false; + } + List filters = queryFilter.getFilters(); + for (Filter filter : filters) { + if (regText.equalsIgnoreCase(String.valueOf(filter.getValue()))) { + return false; + } + } + return true; + } + protected List filerMetricsByDomain(List metricsDb, Integer domain) { if (CollectionUtils.isEmpty(metricsDb)) { return Lists.newArrayList(); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java index d9b5173b8..f22f1ac2c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java @@ -31,8 +31,7 @@ public class DatabaseSchemaMapper implements SchemaMapper { log.debug("before db mapper,mapInfo:{}", queryContext.getMapInfo()); - List terms = HanlpHelper.getSegment().seg(queryContext.getQueryText().toLowerCase()).stream() - .collect(Collectors.toList()); + List terms = HanlpHelper.getTerms(queryContext.getQueryText()); WordNatureService wordNatureService = ContextUtils.getBean(WordNatureService.class); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java index 56fc6cb02..13f1709b4 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java @@ -30,8 +30,7 @@ public class HanlpSchemaMapper implements SchemaMapper { @Override public void map(QueryContextReq queryContext) { - List terms = HanlpHelper.getSegment().seg(queryContext.getQueryText().toLowerCase()).stream() - .collect(Collectors.toList()); + List terms = HanlpHelper.getTerms(queryContext.getQueryText()); terms.forEach( item -> log.info("word:{},nature:{},frequency:{}", item.word, item.nature.toString(), @@ -56,6 +55,8 @@ public class HanlpSchemaMapper implements SchemaMapper { convertTermsToSchemaMapInfo(matches, queryContext.getMapInfo(), terms); } + + private void convertTermsToSchemaMapInfo(List mapResults, SchemaMapInfo schemaMap, List terms) { if (CollectionUtils.isEmpty(mapResults)) { return; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java index dccf8290b..5d4977a65 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java @@ -4,9 +4,12 @@ import com.google.common.collect.Lists; import com.tencent.supersonic.chat.api.component.SchemaMapper; import com.tencent.supersonic.chat.api.pojo.*; import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.common.constant.Constants; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Slf4j @@ -25,6 +28,7 @@ public class QueryFilterMapper implements SchemaMapper { QueryFilter queryFilter = queryContext.getQueryFilter(); SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); List schemaElementMatches = schemaMapInfo.getMatchedElements(domainId); + clearOtherSchemaElementMatch(domainId, schemaMapInfo); convertFilterToSchemaMapInfo(queryFilter.getFilters(), schemaElementMatches); } @@ -33,6 +37,7 @@ public class QueryFilterMapper implements SchemaMapper { if (CollectionUtils.isEmpty(schemaElementMatches)) { schemaElementMatches = Lists.newArrayList(); } + List words = schemaElementMatches.stream().map(SchemaElementMatch::getWord).collect(Collectors.toList()); for (Filter filter : filters) { SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() .elementType(SchemaElementType.VALUE) @@ -40,11 +45,22 @@ public class QueryFilterMapper implements SchemaMapper { .frequency(FREQUENCY) .word(String.valueOf(filter.getValue())) .similarity(SIMILARITY) - .detectWord(filter.getName()) + .detectWord(Constants.EMPTY) .build(); + if (words.contains(schemaElementMatch.getWord())) { + continue; + } schemaElementMatches.add(schemaElementMatch); } log.info("schemaElementMatches after queryFilerMapper:{}", schemaElementMatches); } + private void clearOtherSchemaElementMatch(Integer domainId, SchemaMapInfo schemaMapInfo) { + for (Map.Entry> entry : schemaMapInfo.getDomainElementMatches().entrySet()) { + if (!entry.getKey().equals(domainId)) { + entry.getValue().clear(); + } + } + } + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java index 32cb52923..b24be50fc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java @@ -2,24 +2,28 @@ package com.tencent.supersonic.chat.application.parser; import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.query.*; +import com.tencent.supersonic.chat.application.query.EntitySemanticQuery; +import com.tencent.supersonic.chat.application.query.MetricSemanticQuery; +import com.tencent.supersonic.chat.application.query.RuleSemanticQuery; +import com.tencent.supersonic.chat.application.query.RuleSemanticQueryManager; import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; -import com.tencent.supersonic.chat.domain.utils.*; -import com.tencent.supersonic.common.pojo.SchemaItem; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; +import com.tencent.supersonic.chat.domain.service.ConfigService; +import com.tencent.supersonic.chat.domain.utils.ComponentFactory; +import com.tencent.supersonic.chat.domain.utils.ContextHelper; +import com.tencent.supersonic.chat.domain.utils.DefaultMetricUtils; +import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; import com.tencent.supersonic.common.util.context.ContextUtils; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; @@ -37,10 +41,15 @@ public class DomainSemanticParser implements SemanticParser { // iterate all schemaElementMatches to resolve semantic query for (Integer domainId : mapInfo.getMatchedDomains()) { List elementMatches = mapInfo.getMatchedElements(domainId); - Map> queryMatches = resolveQuery(elementMatches, queryContext); - for (Map.Entry> match : queryMatches.entrySet()) { + List queries = resolveQuery(elementMatches, queryContext); + for (RuleSemanticQuery query : queries) { + + if (useBlackItem(query, domainId)) { + log.info("useBlackItem, skip query:{}", query); + continue; + } addCandidateQuery(queryContext, chatContext, domainId.longValue(), - domainToName.get(domainId), match.getKey(), match.getValue()); + domainToName.get(domainId), query); } } @@ -50,27 +59,95 @@ public class DomainSemanticParser implements SemanticParser { Integer chatDomainId = Integer.valueOf(chatContext.getParseInfo().getDomainId().intValue()); if (mapInfo.getMatchedDomains().contains(chatDomainId)) { List elementMatches = mapInfo.getMatchedElements(chatDomainId); - detectionContext(chatContext); - Map> queryMatches = tryParseByContext(elementMatches, - chatContext, queryContext); - for (Map.Entry> match : queryMatches.entrySet()) { + + List queries = tryParseByContext(elementMatches, chatContext, queryContext); + for (RuleSemanticQuery query : queries) { addCandidateQuery(queryContext, chatContext, chatDomainId.longValue(), - domainToName.get(chatDomainId), match.getKey(), match.getValue()); + domainToName.get(chatDomainId), query); } } } } } + private boolean useBlackItem(RuleSemanticQuery query, Integer domainId) { + if (Objects.isNull(domainId)) { + return false; + } + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigResp chatConfigResp = configService.fetchConfigByDomainId(domainId.longValue()); + if (Objects.nonNull(chatConfigResp) && Objects.nonNull(query) && Objects.nonNull(query.getParseInfo())) { + List elementMatches = query.getParseInfo().getElementMatches(); + if (!CollectionUtils.isEmpty(elementMatches)) { + return useBlackItemInternal(elementMatches, chatConfigResp, query); + + } + } + return false; + } + + private boolean useBlackItemInternal(List elementMatches, ChatConfigResp chatConfigResp, RuleSemanticQuery query) { + if (Objects.isNull(chatConfigResp)) { + return false; + } + List blackDimIdList = new ArrayList<>(); + List blackMetricIdList = new ArrayList<>(); + if (query instanceof EntitySemanticQuery + && Objects.nonNull(chatConfigResp.getChatDetailConfig()) + && Objects.nonNull(chatConfigResp.getChatDetailConfig().getVisibility())) { + log.info("useBlackItem, handle EntitySemanticQuery blackList logic"); + blackDimIdList = chatConfigResp.getChatDetailConfig().getVisibility().getBlackDimIdList(); + blackMetricIdList = chatConfigResp.getChatDetailConfig().getVisibility().getBlackMetricIdList(); + } + + if (query instanceof MetricSemanticQuery + && Objects.nonNull(chatConfigResp.getChatAggConfig()) + && Objects.nonNull(chatConfigResp.getChatAggConfig().getVisibility())) { + log.info("useBlackItem, handle MetricSemanticQuery blackList logic"); + blackDimIdList = chatConfigResp.getChatAggConfig().getVisibility().getBlackDimIdList(); + blackMetricIdList = chatConfigResp.getChatAggConfig().getVisibility().getBlackMetricIdList(); + } + return useBlackItemWithElementMatches(elementMatches, blackDimIdList, blackMetricIdList); + } + + private boolean useBlackItemWithElementMatches(List elementMatches, List blackDimIdList, List blackMetricIdList) { + + Set dimIds = elementMatches.stream() + .filter(element -> SchemaElementType.VALUE.equals(element.getElementType()) || SchemaElementType.DIMENSION.equals(element.getElementType())) + .map(element -> Long.valueOf(element.getElementID())).collect(Collectors.toSet()); + + Set metricIds = elementMatches.stream() + .filter(element -> SchemaElementType.METRIC.equals(element.getElementType())) + .map(element -> Long.valueOf(element.getElementID())).collect(Collectors.toSet()); + + + return useBlackItemWithIds(dimIds, metricIds, blackDimIdList, blackMetricIdList); + } + + private boolean useBlackItemWithIds(Set dimIds, Set metricIds, List blackDimIdList, List blackMetricIdList) { + + if (!CollectionUtils.isEmpty(blackDimIdList) && !CollectionUtils.isEmpty(dimIds)) { + if (blackDimIdList.stream().anyMatch(dimIds::contains)) { + log.info("useBlackItem, blackDimIdList:{}", blackDimIdList.stream().filter(dimIds::contains).collect(Collectors.toList())); + return true; + } + } + if (!CollectionUtils.isEmpty(blackMetricIdList) && !CollectionUtils.isEmpty(metricIds)) { + if (blackMetricIdList.stream().anyMatch(metricIds::contains)) { + log.info("useBlackItem, blackMetricIdList:{}", blackMetricIdList.stream().filter(metricIds::contains).collect(Collectors.toList())); + return true; + } + } + return false; + } + private void addCandidateQuery(QueryContextReq queryContext, ChatContext chatContext, - Long domainId, String domainName, - RuleSemanticQuery semanticQuery, List elementMatches) { + Long domainId, String domainName, RuleSemanticQuery semanticQuery) { if (semanticQuery != null) { - fillParseInfo(semanticQuery, domainId, domainName, elementMatches); - // inherit from context + DefaultMetricUtils defaultMetricUtils = ContextUtils.getBean(DefaultMetricUtils.class); + defaultMetricUtils.fillParseInfo(semanticQuery, domainId, domainName); inheritContext(semanticQuery, chatContext); - // default metric, date, dimension - injectDefaultMetric(semanticQuery, queryContext, chatContext); + defaultMetricUtils.fillDefaultMetric(semanticQuery.getParseInfo(), queryContext, chatContext); queryContext.getCandidateQueries().add(semanticQuery); } } @@ -84,38 +161,15 @@ public class DomainSemanticParser implements SemanticParser { } } - protected void injectDefaultMetric(RuleSemanticQuery semanticQuery, QueryContextReq queryContext, - ChatContext chatContext) { - DefaultMetricUtils defaultMetricUtils = ContextUtils.getBean(DefaultMetricUtils.class); - defaultMetricUtils.injectDefaultMetric(semanticQuery.getParseInfo(), queryContext, chatContext); - } - /** - * get the chatContext for the tryParseByContext - * - * @param chatContext - */ - protected void detectionContext(ChatContext chatContext) { - if (chatContext.getParseInfo() != null) { - SemanticParseInfo semanticParseInfo = chatContext.getParseInfo(); - if (semanticParseInfo.getQueryMode().equals(EntityDetail.QUERY_MODE)) { - // EntityDetail model will unset some items - semanticParseInfo.setDateInfo(null); - semanticParseInfo.setMetrics(new HashSet<>()); - semanticParseInfo.setDimensions(new HashSet<>()); - } - } - } - - /** - * try to add ChatContext to SchemaElementMatch and look if match QueryMode + * try to add ChatContext to SchemaMatch and look if match QueryMode * * @param elementMatches * @param chatCtx * @return */ - private Map> tryParseByContext(List elementMatches, - ChatContext chatCtx, QueryContextReq queryCtx) { + private List tryParseByContext(List elementMatches, + ChatContext chatCtx, QueryContextReq queryCtx) { if (chatCtx.getParseInfo() != null && chatCtx.getParseInfo().getEntity() > 0) { Long entityCount = elementMatches.stream().filter(i -> SchemaElementType.ENTITY.equals(i.getElementType())) .count(); @@ -125,15 +179,14 @@ public class DomainSemanticParser implements SemanticParser { // try entity parse SchemaElementMatch entityElementMatch = SchemaElementMatch.builder() .elementType(SchemaElementType.ENTITY).build(); - List newSchemaElementMatch = new ArrayList<>(); + List newSchemaMatches = new ArrayList<>(); if (!CollectionUtils.isEmpty(elementMatches)) { - newSchemaElementMatch.addAll(elementMatches); + newSchemaMatches.addAll(elementMatches); } - newSchemaElementMatch.add(entityElementMatch); - Map> queryMatches = doParseByContext(newSchemaElementMatch, - chatCtx, queryCtx); - if (queryMatches.size() > 0) { - return queryMatches; + newSchemaMatches.add(entityElementMatch); + List queries = doParseByContext(newSchemaMatches, chatCtx, queryCtx); + if (queries.size() > 0) { + return queries; } } } @@ -141,8 +194,8 @@ public class DomainSemanticParser implements SemanticParser { } - private Map> doParseByContext(List elementMatches, - ChatContext chatCtx, QueryContextReq queryCtx) { + private List doParseByContext(List elementMatches, + ChatContext chatCtx, QueryContextReq queryContext) { SemanticParseInfo contextSemanticParse = chatCtx.getParseInfo(); if (contextSemanticParse != null) { List newElementMatches = new ArrayList<>(); @@ -162,123 +215,36 @@ public class DomainSemanticParser implements SemanticParser { trySchemaElementTypes.add(new ArrayList<>(Arrays.asList(SchemaElementType.VALUE))); trySchemaElementTypes.add(new ArrayList<>(Arrays.asList(SchemaElementType.DIMENSION))); - for (List schemaElementTypes : trySchemaElementTypes) { + for (List schemaTypes : trySchemaElementTypes) { newElementMatches.clear(); if (!CollectionUtils.isEmpty(elementMatches)) { newElementMatches.addAll(elementMatches); } - ContextHelper.mergeContextSchemaElementMatch(newElementMatches, elementMatches, schemaElementTypes, + ContextHelper.mergeContextSchemaElementMatch(newElementMatches, elementMatches, schemaTypes, contextSemanticParse); - Map> queryMatches = resolveQuery(newElementMatches, - queryCtx); - if (queryMatches.size() > 0) { - return queryMatches; + List queries = resolveQuery(newElementMatches, queryContext); + if (queries.size() > 0) { + return queries; } } } - return new HashMap<>(); + return new ArrayList<>(); } - private Map> resolveQuery(List elementMatches, - QueryContextReq queryCtx) { - Map> matchMap = new HashMap<>(); - + private List resolveQuery(List candidateElementMatches, + QueryContextReq queryContext) { + List matchedQueries = new ArrayList<>(); for (RuleSemanticQuery semanticQuery : RuleSemanticQueryManager.getSemanticQueries()) { - List matches = semanticQuery.match(elementMatches, queryCtx); + List matches = semanticQuery.match(candidateElementMatches, queryContext); if (matches.size() > 0) { log.info("resolve match [{}:{}] ", semanticQuery.getQueryMode(), matches.size()); - matchMap.put(RuleSemanticQueryManager.create(semanticQuery.getQueryMode()), matches); + RuleSemanticQuery query = RuleSemanticQueryManager.create(semanticQuery.getQueryMode()); + query.getParseInfo().getElementMatches().addAll(matches); + matchedQueries.add(query); } } - return matchMap; + return matchedQueries; } - - public void fillParseInfo(SemanticQuery query, Long domainId, String domainName, - List elementMatches) { - SemanticParseInfo parseInfo = query.getParseInfo(); - parseInfo.setDomainId(domainId); - parseInfo.setDomainName(domainName); - parseInfo.setQueryMode(query.getQueryMode()); - parseInfo.getElementMatches().addAll(elementMatches); - - DefaultSemanticInternalUtils defaultSemanticUtils = ContextUtils.getBean(DefaultSemanticInternalUtils.class); - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo(parseInfo.getDomainId()); - ChatConfigRichInfo chaConfigRichDesc = defaultSemanticUtils.getChatConfigRichInfo(parseInfo.getDomainId()); - Map dimensionDescMap = domainSchemaDesc.getDimensions().stream() - .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); - Map metricDescMap = domainSchemaDesc.getMetrics().stream() - .collect(Collectors.toMap(MetricSchemaResp::getId, Function.identity())); - Map> dim2Values = new HashMap<>(); - - for (SchemaElementMatch schemaElementMatch : elementMatches) { - Long elementID = Long.valueOf(schemaElementMatch.getElementID()); - switch (schemaElementMatch.getElementType()) { - case ID: - case VALUE: - if (dimensionDescMap.containsKey(elementID)) { - if (dim2Values.containsKey(elementID)) { - dim2Values.get(elementID).add(schemaElementMatch); - } else { - dim2Values.put(elementID, new ArrayList<>(Arrays.asList(schemaElementMatch))); - } - } - break; - case DIMENSION: - DimSchemaResp dimensionDesc = dimensionDescMap.get(elementID); - if (dimensionDesc != null) { - SchemaItem dimensionParseInfo = new SchemaItem(); - dimensionParseInfo.setBizName(dimensionDesc.getBizName()); - dimensionParseInfo.setName(dimensionDesc.getName()); - dimensionParseInfo.setId(dimensionDesc.getId()); - parseInfo.getDimensions().add(dimensionParseInfo); - } - break; - case METRIC: - MetricSchemaResp metricDesc = metricDescMap.get(elementID); - if (metricDesc != null) { - SchemaItem metricItem = new SchemaItem(); - metricItem.setBizName(metricDesc.getBizName()); - metricItem.setName(metricDesc.getName()); - metricItem.setId(metricDesc.getId()); - metricItem.setCreatedAt(null); - metricItem.setUpdatedAt(null); - parseInfo.getMetrics().add(metricItem); - } - break; - default: - } - } - - if (!dim2Values.isEmpty()) { - for (Map.Entry> entry : dim2Values.entrySet()) { - DimSchemaResp dimensionDesc = dimensionDescMap.get(entry.getKey()); - if (entry.getValue().size() == 1) { - SchemaElementMatch schemaElementMatch = entry.getValue().get(0); - Filter dimensionFilter = new Filter(); - dimensionFilter.setValue(schemaElementMatch.getWord()); - dimensionFilter.setBizName(dimensionDesc.getBizName()); - dimensionFilter.setName(dimensionDesc.getName()); - dimensionFilter.setOperator(FilterOperatorEnum.EQUALS); - dimensionFilter.setElementID(Long.valueOf(schemaElementMatch.getElementID())); - parseInfo.getDimensionFilters().add(dimensionFilter); - ContextHelper.setEntityId(entry.getKey(), schemaElementMatch.getWord(), chaConfigRichDesc, - parseInfo); - } else { - Filter dimensionFilter = new Filter(); - List vals = new ArrayList<>(); - entry.getValue().stream().forEach(i -> vals.add(i.getWord())); - dimensionFilter.setValue(vals); - dimensionFilter.setBizName(dimensionDesc.getBizName()); - dimensionFilter.setName(dimensionDesc.getName()); - dimensionFilter.setOperator(FilterOperatorEnum.IN); - dimensionFilter.setElementID(entry.getKey()); - parseInfo.getDimensionFilters().add(dimensionFilter); - } - } - } - } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java index ebb633a1d..b3aa00471 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java @@ -20,6 +20,7 @@ import com.tencent.supersonic.chat.domain.utils.SemanticSatisfactionChecker; import com.tencent.supersonic.common.nlp.ItemDO; import com.tencent.supersonic.common.util.context.ContextUtils; import com.tencent.supersonic.common.util.json.JsonUtil; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,6 +29,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.apache.calcite.sql.parser.SqlParseException; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.http.HttpEntity; @@ -40,90 +42,100 @@ import org.springframework.web.client.RestTemplate; @Slf4j public class LLMSemanticParser implements SemanticParser { + private DslToSemanticInfo dslToSemanticInfo = new DslToSemanticInfo(); + @Override public void parse(QueryContextReq queryContext, ChatContext chatCtx) { + String queryText = queryContext.getQueryText(); + if (SemanticSatisfactionChecker.check(queryContext)) { - log.info("There is no need parse by llm , queryText:{}", queryContext.getQueryText()); + log.info("There is no need parse by llm , queryText:{}", queryText); return; } - Integer domainId = getDomainId(queryContext, chatCtx); - LLMResp llmResp = requestLLM(queryContext, domainId); - if (Objects.isNull(llmResp)) { + try { + Integer domainId = getDomainId(queryContext, chatCtx); + LLMResp llmResp = requestLLM(queryContext, domainId); + if (Objects.isNull(llmResp)) { + return; + } + LLMSemanticQuery semanticQuery = new LLMSemanticQuery(); + SemanticParseInfo parseInfo = semanticQuery.getParseInfo(); + String sql = convertToSql(llmResp, parseInfo, domainId); + + parseInfo.setInfo(sql); + parseInfo.setDomainId(Long.valueOf(domainId)); + parseInfo.setBonus(queryText.length() * 1.0); + parseInfo.setQueryMode(LLMSemanticQuery.QUERY_MODE); + queryContext.getCandidateQueries().add(semanticQuery); return; + } catch (Exception e) { + log.error("llm parse error , skip the parser. error:", e); } - LLMSemanticQuery semanticQuery = new LLMSemanticQuery(); - SemanticParseInfo parseInfo = semanticQuery.getParseInfo(); - String sql = convertToSql(llmResp, parseInfo); - parseInfo.setDomainId(Long.valueOf(domainId)); - parseInfo.setBonus(queryContext.getQueryText().length() * 1.0); - parseInfo.setQueryMode(LLMSemanticQuery.QUERY_MODE); - parseInfo.setInfo(sql); - queryContext.getCandidateQueries().add(semanticQuery); - return; } - protected String convertToSql(LLMResp llmResp, SemanticParseInfo parseInfo) { - return DslToSemanticInfo.convert(parseInfo, llmResp); + protected String convertToSql(LLMResp llmResp, SemanticParseInfo parseInfo, Integer domainId) + throws SqlParseException { + return dslToSemanticInfo.convert(parseInfo, llmResp, domainId); } protected LLMResp requestLLM(QueryContextReq queryContext, Integer domainId) { - try { - final LLMConfig llmConfig = ContextUtils.getBean(LLMConfig.class); + final LLMConfig llmConfig = ContextUtils.getBean(LLMConfig.class); - DomainInfos domainInfos = ContextUtils.getBean(WordNatureService.class).getCache().getUnchecked(""); - - Map domainIdToName = domainInfos.getDomains().stream() - .collect(Collectors.toMap(ItemDO::getDomain, a -> a.getName(), (k1, k2) -> k1)); - - Map itemIdToName = domainInfos.getDimensions().stream() - .filter(entry -> domainId.equals(entry.getDomain())) - .collect(Collectors.toMap(ItemDO::getItemId, ItemDO::getName, (value1, value2) -> value2)); - - String domainName = domainIdToName.get(domainId); - LLMReq llmReq = new LLMReq(); - llmReq.setQueryText(queryContext.getQueryText()); - - List matchedElements = queryContext.getMapInfo().getMatchedElements(domainId); - - List fieldNameList = matchedElements.stream() - .filter(schemaElementMatch -> - SchemaElementType.METRIC.equals(schemaElementMatch.getElementType()) || - SchemaElementType.DIMENSION.equals(schemaElementMatch.getElementType()) || - SchemaElementType.VALUE.equals(schemaElementMatch.getElementType())) - .map(schemaElementMatch -> { - if (!SchemaElementType.VALUE.equals(schemaElementMatch.getElementType())) { - return schemaElementMatch.getWord(); - } - return itemIdToName.get(schemaElementMatch.getElementID()); - }) - .filter(name -> StringUtils.isNotEmpty(name) && !name.contains("%")) - .collect(Collectors.toList()); - - LLMSchema llmSchema = new LLMSchema(); - llmSchema.setDomainName(domainName); - llmSchema.setFieldNameList(fieldNameList); - llmReq.setSchema(llmSchema); - - log.info("domainId:{},llmReq:{}", domainId, llmReq); - String questUrl = llmConfig.getUrl() + llmConfig.getQueryToSqlPath(); - - RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(JsonUtil.toString(llmReq), headers); - - log.info("requestLLM request:{},entity:{}", questUrl, entity); - ResponseEntity responseEntity = restTemplate.exchange(questUrl, HttpMethod.POST, entity, - LLMResp.class); - - log.info("requestLLM result:{}", responseEntity); - return responseEntity.getBody(); - } catch (Exception e) { - log.error("requestLLM error", e); + if (StringUtils.isEmpty(llmConfig.getUrl())) { + log.warn("llmConfig url is null, skip llm parser"); + return null; } - return null; + + DomainInfos domainInfos = ContextUtils.getBean(WordNatureService.class).getCache().getUnchecked(""); + + Map domainIdToName = domainInfos.getDomains().stream() + .collect(Collectors.toMap(ItemDO::getDomain, a -> a.getName(), (k1, k2) -> k1)); + + Map itemIdToName = domainInfos.getDimensions().stream() + .filter(entry -> domainId.equals(entry.getDomain())) + .collect(Collectors.toMap(ItemDO::getItemId, ItemDO::getName, (value1, value2) -> value2)); + + String domainName = domainIdToName.get(domainId); + LLMReq llmReq = new LLMReq(); + llmReq.setQueryText(queryContext.getQueryText()); + + List matchedElements = queryContext.getMapInfo().getMatchedElements(domainId); + + Set fieldNameList = matchedElements.stream() + .filter(schemaElementMatch -> + SchemaElementType.METRIC.equals(schemaElementMatch.getElementType()) || + SchemaElementType.DIMENSION.equals(schemaElementMatch.getElementType()) || + SchemaElementType.VALUE.equals(schemaElementMatch.getElementType())) + .map(schemaElementMatch -> { + if (!SchemaElementType.VALUE.equals(schemaElementMatch.getElementType())) { + return schemaElementMatch.getWord(); + } + return itemIdToName.get(schemaElementMatch.getElementID()); + }) + .filter(name -> StringUtils.isNotEmpty(name) && !name.contains("%")) + .collect(Collectors.toSet()); + + LLMSchema llmSchema = new LLMSchema(); + llmSchema.setDomainName(domainName); + llmSchema.setFieldNameList(new ArrayList<>(fieldNameList)); + llmReq.setSchema(llmSchema); + + log.info("requestLLM request, domainId:{},llmReq:{}", domainId, llmReq); + String questUrl = llmConfig.getUrl() + llmConfig.getQueryToSqlPath(); + + RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>(JsonUtil.toString(llmReq), headers); + + ResponseEntity responseEntity = restTemplate.exchange(questUrl, HttpMethod.POST, entity, + LLMResp.class); + + log.info("requestLLM response, questUrl:{} \n entity:{} \n body:{}", questUrl, entity, + responseEntity.getBody()); + return responseEntity.getBody(); } protected Integer getDomainId(QueryContextReq queryContext, ChatContext chatCtx) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java index e63abf831..4190c7012 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java @@ -66,19 +66,18 @@ public class TimeSemanticParser implements SemanticParser { DateConf info = new DateConf(); String zhPeriod = m.group("zhPeriod"); int days; - info.setPeriod(Constants.DAY); switch (zhPeriod) { case "周": days = 7; - //info.setPeriod(Constants.WEEK); + info.setPeriod(Constants.WEEK); break; case "月": days = 30; - //info.setPeriod(Constants.MONTH); + info.setPeriod(Constants.MONTH); break; case "年": days = 365; - //info.setPeriod(Constants.YEAR); + info.setPeriod(Constants.YEAR); break; default: days = 1; @@ -92,7 +91,7 @@ public class TimeSemanticParser implements SemanticParser { } info.setText(text); info.setStartDate(LocalDate.now().minusDays(days).toString()); - info.setUnit(days); + info.setUnit(num); //queryContext.getParseInfo().setDateInfo(info); for (SemanticQuery query : queryContext.getCandidateQueries()) { if (query instanceof MetricSemanticQuery) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java index 1bf46041f..aadc64412 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java @@ -1,31 +1,33 @@ package com.tencent.supersonic.chat.application.query; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.*; +import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.*; import static com.tencent.supersonic.common.constant.Constants.DAY; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; +import com.tencent.supersonic.chat.domain.pojo.config.ChatDefaultRichConfig; import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; +import com.tencent.supersonic.chat.domain.service.ConfigService; import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import com.tencent.supersonic.chat.domain.utils.DefaultSemanticInternalUtils; import com.tencent.supersonic.common.constant.Constants; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Order; import com.tencent.supersonic.common.pojo.SchemaItem; import com.tencent.supersonic.common.util.context.ContextUtils; import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; + import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Objects; import java.util.Set; + import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; + @Slf4j @Component @@ -34,11 +36,14 @@ public class EntityListFilter extends EntitySemanticQuery { public static String QUERY_MODE = "ENTITY_LIST_FILTER"; private static Long entityListLimit = 200L; + public EntityListFilter() { super(); - queryMatcher.addOption(VALUE, REQUIRED, AT_LEAST, 1); + queryMatcher.addOption(VALUE, REQUIRED, AT_LEAST, 1) + .addOption(ENTITY, REQUIRED, AT_LEAST, 1); } + @Override public String getQueryMode() { return QUERY_MODE; @@ -67,33 +72,32 @@ public class EntityListFilter extends EntitySemanticQuery { private void addEntityDetailAndOrderByMetric(SemanticParseInfo semanticParseInfo) { if (semanticParseInfo.getDomainId() > 0L) { - DefaultSemanticInternalUtils defaultSemanticUtils = ContextUtils.getBean( - DefaultSemanticInternalUtils.class); - ChatConfigRichInfo chaConfigRichDesc = defaultSemanticUtils.getChatConfigRichInfo( + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo( semanticParseInfo.getDomainId()); - if (chaConfigRichDesc != null) { - //SemanticParseInfo semanticParseInfo = queryContext.getParseInfo(); + if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null + && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { +// SemanticParseInfo semanticParseInfo = queryContext.getParseInfo(); +// EntityRichInfo entity = chaConfigRichDesc.getChatDetailRichConfig().getEntity(); Set dimensions = new LinkedHashSet(); - Set primaryDimensions = this.addPrimaryDimension(chaConfigRichDesc.getEntity(), dimensions); +// Set primaryDimensions = this.addPrimaryDimension(entity, dimensions); Set metrics = new LinkedHashSet(); - if (chaConfigRichDesc.getEntity() != null - && chaConfigRichDesc.getEntity().getEntityInternalDetailDesc() != null) { - chaConfigRichDesc.getEntity().getEntityInternalDetailDesc().getMetricList().stream() - .forEach((m) -> metrics.add(this.getMetric(m))); - chaConfigRichDesc.getEntity().getEntityInternalDetailDesc().getDimensionList().stream() - .filter((m) -> !primaryDimensions.contains(m.getBizName())) - .forEach((m) -> dimensions.add(this.getDimension(m))); + Set orders = new LinkedHashSet(); + ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig(); + if (chatDefaultConfig != null) { + chatDefaultConfig.getMetrics().stream() + .forEach(metric -> { + metrics.add(metric); + orders.add(new Order(metric.getBizName(), Constants.DESC_UPPER)); + }); + chatDefaultConfig.getDimensions().stream() +// .filter((m) -> !primaryDimensions.contains(m.getBizName())) + .forEach(dimension -> dimensions.add(dimension)); + } semanticParseInfo.setDimensions(dimensions); semanticParseInfo.setMetrics(metrics); - Set orders = new LinkedHashSet(); - if (chaConfigRichDesc.getEntity() != null - && chaConfigRichDesc.getEntity().getEntityInternalDetailDesc() != null) { - chaConfigRichDesc.getEntity().getEntityInternalDetailDesc().getMetricList().stream() - .forEach((metric) -> orders.add(new Order(metric.getBizName(), Constants.DESC_UPPER))); - } - semanticParseInfo.setOrders(orders); } } @@ -102,35 +106,18 @@ public class EntityListFilter extends EntitySemanticQuery { private Set addPrimaryDimension(EntityRichInfo entity, Set dimensions) { Set primaryDimensions = new HashSet(); - if (!Objects.isNull(entity) && !CollectionUtils.isEmpty(entity.getEntityIds())) { - entity.getEntityIds().stream().forEach((dimSchemaDesc) -> { - SchemaItem dimension = new SchemaItem(); - BeanUtils.copyProperties(dimSchemaDesc, dimension); - dimensions.add(dimension); - primaryDimensions.add(dimSchemaDesc.getBizName()); - }); + DimSchemaResp dimItem = entity.getDimItem(); + if (Objects.nonNull(entity) && Objects.nonNull(dimItem)) { + SchemaItem dimension = new SchemaItem(); + BeanUtils.copyProperties(dimItem, dimension); + dimensions.add(dimension); + primaryDimensions.add(dimItem.getBizName()); return primaryDimensions; } else { return primaryDimensions; } } - private SchemaItem getMetric(MetricSchemaResp metricSchemaDesc) { - SchemaItem queryMeta = new SchemaItem(); - queryMeta.setId(metricSchemaDesc.getId()); - queryMeta.setBizName(metricSchemaDesc.getBizName()); - queryMeta.setName(metricSchemaDesc.getName()); - return queryMeta; - } - - private SchemaItem getDimension(DimSchemaResp dimSchemaDesc) { - SchemaItem queryMeta = new SchemaItem(); - queryMeta.setId(dimSchemaDesc.getId()); - queryMeta.setBizName(dimSchemaDesc.getBizName()); - queryMeta.setName(dimSchemaDesc.getName()); - return queryMeta; - } - private void dealNativeQuery(SemanticParseInfo semanticParseInfo, boolean isNativeQuery) { if (Objects.nonNull(semanticParseInfo)) { semanticParseInfo.setNativeQuery(isNativeQuery); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java index 4f7f9769c..aba98b7a5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java @@ -1,6 +1,6 @@ package com.tencent.supersonic.chat.application.query; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.METRIC; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java index 3a215dd18..927b4e2c9 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java @@ -16,6 +16,7 @@ import com.tencent.supersonic.chat.domain.utils.ContextHelper; import com.tencent.supersonic.common.pojo.SchemaItem; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; @@ -95,7 +96,7 @@ public class MetricCompare extends MetricSemanticQuery { if (toAdd.isPresent()) { if (FilterOperatorEnum.EQUALS.equals(toAdd.get().getOperator()) || FilterOperatorEnum.IN.equals( toAdd.get().getOperator())) { - List vals = new ArrayList<>(); + Set vals = new HashSet<>(); if (toAdd.get().getOperator().equals(FilterOperatorEnum.IN)) { vals.addAll((List) (toAdd.get().getValue())); } else { @@ -106,7 +107,7 @@ public class MetricCompare extends MetricSemanticQuery { } else { vals.add(filter.getValue()); } - toAdd.get().setValue(vals); + toAdd.get().setValue(new ArrayList<>(vals)); toAdd.get().setOperator(FilterOperatorEnum.IN); continue; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatcher.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatcher.java index 53ecea73b..109982ebf 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatcher.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatcher.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.chat.application.query; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption; import com.tencent.supersonic.common.enums.AggregateTypeEnum; @@ -12,10 +11,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; - -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; import lombok.Data; import lombok.ToString; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java index 6583ad91e..93888dd12 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java @@ -1,3 +1,4 @@ + package com.tencent.supersonic.chat.application.query; import com.tencent.supersonic.auth.api.authentication.pojo.User; @@ -24,7 +25,6 @@ import java.util.*; public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { protected SemanticParseInfo parseInfo = new SemanticParseInfo(); - protected List schemaElementMatches = new ArrayList<>(); protected QueryMatcher queryMatcher = new QueryMatcher(); protected SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); @@ -32,7 +32,8 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { RuleSemanticQueryManager.register(this); } - public List match(List candidateElementMatches, QueryContextReq queryCtx) { + public List match(List candidateElementMatches, + QueryContextReq queryCtx) { return queryMatcher.match(candidateElementMatches); } @@ -57,6 +58,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { QueryResultWithSchemaResp queryResult = semanticLayer.queryByStruct( SchemaInfoConverter.convertTo(parseInfo), user); + if (queryResult != null) { queryResponse.setQueryAuthorization(queryResult.getQueryAuthorization()); } @@ -84,4 +86,4 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { public void setParseInfo(SemanticParseInfo parseInfo) { this.parseInfo = parseInfo; } -} +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/config/LLMConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/config/LLMConfig.java index 2a2310036..fc22c872d 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/config/LLMConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/config/LLMConfig.java @@ -16,8 +16,4 @@ public class LLMConfig { @Value("${query2sql.path:query2sql}") private String queryToSqlPath; - - @Value("${query2sql.endpoint:}") - private String endpoint; - } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatConfigDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatConfigDO.java index f342414c1..e8d700a20 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatConfigDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatConfigDO.java @@ -15,29 +15,11 @@ public class ChatConfigDO { private Long id; private Long domainId; - /** - * default metrics information about the domain - */ - private String defaultMetrics; - /** - * invisible dimensions/metrics - */ - private String visibility; + private String chatDetailConfig; - /** - * the entity info about the domain - */ - private String entity; + private String chatAggConfig; - /** - * information about dictionary about the domain - */ - private String knowledgeInfo; - - /** - * available status - */ private Integer status; /** diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggConfig.java new file mode 100644 index 000000000..329dc910f --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggConfig.java @@ -0,0 +1,24 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + +import lombok.Data; + +import java.util.List; + +@Data +public class ChatAggConfig { + + /** + * invisible dimensions/metrics + */ + private ItemVisibility visibility; + + /** + * information about dictionary about the domain + */ + private List knowledgeInfos; + + private KnowledgeAdvancedConfig globalKnowledgeConfig; + + private ChatDefaultConfig chatDefaultConfig; + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggRichConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggRichConfig.java new file mode 100644 index 000000000..66b91be47 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggRichConfig.java @@ -0,0 +1,24 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + +import lombok.Data; + +import java.util.List; + +@Data +public class ChatAggRichConfig { + + /** + * invisible dimensions/metrics + */ + private ItemVisibilityInfo visibility; + + /** + * information about dictionary about the domain + */ + private List knowledgeInfos; + + private KnowledgeAdvancedConfig globalKnowledgeConfig; + + private ChatDefaultRichConfig chatDefaultConfig; + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfig.java index 394abf72d..e26fb41f6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfig.java @@ -16,25 +16,16 @@ public class ChatConfig { private Long id; private Long domainId; - /** - * default metrics information about the domain - */ - private List defaultMetrics; /** - * invisible dimensions/metrics + * the chatDetailConfig about the domain */ - private ItemVisibility visibility; + private ChatDetailConfig chatDetailConfig; /** - * the entity info about the domain + * the chatAggConfig about the domain */ - private Entity entity; - - /** - * information about dictionary about the domain - */ - private List knowledgeInfos; + private ChatAggConfig chatAggConfig; /** * available status diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBaseReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBaseReq.java new file mode 100644 index 000000000..4f0b1b1e3 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBaseReq.java @@ -0,0 +1,34 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + +import com.tencent.supersonic.common.enums.StatusEnum; + +import java.util.List; + +import lombok.Data; +import lombok.ToString; + +/** + * extended information command about domain + */ +@Data +@ToString +public class ChatConfigBaseReq { + + private Long domainId; + + /** + * the chatDetailConfig about the domain + */ + private ChatDetailConfig chatDetailConfig; + + /** + * the chatAggConfig about the domain + */ + private ChatAggConfig chatAggConfig; + + /** + * available status + */ + private StatusEnum status; + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReqReq.java similarity index 63% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReq.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReqReq.java index 85a47af27..6557385c4 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReq.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReqReq.java @@ -4,7 +4,7 @@ import lombok.Data; @Data -public class ChatConfigEditReq extends ChatConfigBase { +public class ChatConfigEditReqReq extends ChatConfigBaseReq { private Long id; } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigInfo.java deleted file mode 100644 index 556c224f6..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigInfo.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.config; - -import com.tencent.supersonic.common.enums.StatusEnum; -import java.util.Date; -import java.util.List; -import lombok.Data; - -@Data -public class ChatConfigInfo { - - private Long id; - - private Long domainId; - - /** - * default metrics information about the domain - */ - private List defaultMetrics; - - /** - * invisible dimensions/metrics - */ - private ItemVisibility visibility; - - /** - * the entity info about the domain - */ - private Entity entity; - - /** - * information about dictionary about the domain - */ - private List knowledgeInfos; - - /** - * available status - */ - private StatusEnum statusEnum; - - private String createdBy; - private String updatedBy; - private Date createdAt; - private Date updatedAt; -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigResp.java new file mode 100644 index 000000000..acd1c40a5 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigResp.java @@ -0,0 +1,27 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + +import com.tencent.supersonic.common.enums.StatusEnum; +import java.util.Date; +import lombok.Data; + +@Data +public class ChatConfigResp { + + private Long id; + + private Long domainId; + + private ChatDetailConfig chatDetailConfig; + + private ChatAggConfig chatAggConfig; + + /** + * available status + */ + private StatusEnum statusEnum; + + private String createdBy; + private String updatedBy; + private Date createdAt; + private Date updatedAt; +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichInfo.java deleted file mode 100644 index bb72fcf1d..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichInfo.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.config; - -import com.tencent.supersonic.common.enums.StatusEnum; -import java.util.Date; -import java.util.List; -import lombok.Data; - -@Data -public class ChatConfigRichInfo { - - private Long id; - - private Long domainId; - - private String name; - private String bizName; - - /** - * default metrics information about the domain - */ - private List defaultMetrics; - - /** - * invisible dimensions/metrics - */ - private ItemVisibilityInfo visibility; - - /** - * the entity info about the domain - */ - private EntityRichInfo entity; - - /** - * information about dictionary about the domain - */ - private List knowledgeInfos; - - /** - * available status - */ - private StatusEnum statusEnum; - - private String createdBy; - private String updatedBy; - private Date createdAt; - private Date updatedAt; -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichResp.java new file mode 100644 index 000000000..84f271e23 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichResp.java @@ -0,0 +1,31 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + +import com.tencent.supersonic.common.enums.StatusEnum; +import java.util.Date; +import java.util.List; +import lombok.Data; + +@Data +public class ChatConfigRichResp { + + private Long id; + + private Long domainId; + + private String domainName; + private String bizName; + + private ChatAggRichConfig chatAggRichConfig; + + private ChatDetailRichConfig chatDetailRichConfig; + + /** + * available status + */ + private StatusEnum statusEnum; + + private String createdBy; + private String updatedBy; + private Date createdAt; + private Date updatedAt; +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultConfig.java new file mode 100644 index 000000000..f25601e3a --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultConfig.java @@ -0,0 +1,27 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + + +import com.tencent.supersonic.common.constant.Constants; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class ChatDefaultConfig { + + private List dimensionIds = new ArrayList<>(); + private List metricIds = new ArrayList<>(); + + /** + * default time span unit + */ + private Integer unit = 1; + + /** + * default time type: day + * DAY, WEEK, MONTH, YEAR + */ + private String period = Constants.DAY; + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultRichConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultRichConfig.java new file mode 100644 index 000000000..079ab0c92 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultRichConfig.java @@ -0,0 +1,27 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + + +import com.tencent.supersonic.common.constant.Constants; +import com.tencent.supersonic.common.pojo.SchemaItem; +import lombok.Data; + +import java.util.List; + +@Data +public class ChatDefaultRichConfig { + + private List dimensions; + private List metrics; + + /** + * default time span unit + */ + private Integer unit = 1; + + /** + * default time type: day + * DAY, WEEK, MONTH, YEAR + */ + private String period = Constants.DAY; + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBase.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailConfig.java similarity index 50% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBase.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailConfig.java index 2841cd802..a85a1f85d 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBase.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailConfig.java @@ -1,41 +1,29 @@ package com.tencent.supersonic.chat.domain.pojo.config; -import com.tencent.supersonic.common.enums.StatusEnum; -import java.util.List; import lombok.Data; -import lombok.ToString; -/** - * extended information command about domain - */ +import java.util.List; + @Data -@ToString -public class ChatConfigBase { - - private Long domainId; - /** - * default metrics information about the domain - */ - private List defaultMetrics; +public class ChatDetailConfig { /** * invisible dimensions/metrics */ private ItemVisibility visibility; - /** - * the entity info about the domain - */ - private Entity entity; - /** * information about dictionary about the domain */ private List knowledgeInfos; + private KnowledgeAdvancedConfig globalKnowledgeConfig; + + private ChatDefaultConfig chatDefaultConfig; + /** - * available status + * the entity info about the domain */ - private StatusEnum status; + private Entity entity; } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailRichConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailRichConfig.java new file mode 100644 index 000000000..35263cdd1 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailRichConfig.java @@ -0,0 +1,30 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + +import lombok.Data; + +import java.util.List; + +@Data +public class ChatDetailRichConfig { + + /** + * invisible dimensions/metrics + */ + private ItemVisibilityInfo visibility; + + /** + * the entity info about the domain + */ + private EntityRichInfo entity; + + /** + * information about dictionary about the domain + */ + private List knowledgeInfos; + + private KnowledgeAdvancedConfig globalKnowledgeConfig; + + private ChatDefaultRichConfig chatDefaultConfig; + + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Dim4Dict.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Dim4Dict.java index 2bbb3f3d8..de36c3994 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Dim4Dict.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Dim4Dict.java @@ -3,11 +3,13 @@ package com.tencent.supersonic.chat.domain.pojo.config; import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.ToString; @Data @AllArgsConstructor @ToString +@NoArgsConstructor public class Dim4Dict { private Long dimId; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Entity.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Entity.java index 58a0afee3..d5ca4508a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Entity.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Entity.java @@ -18,16 +18,12 @@ public class Entity { /** * uniquely identifies an entity */ - private List entityIds; + private Long entityId; /** * entity name list */ private List names; - /** - * query entity default information - */ - private EntityDetailData detailData; } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java index f409d4456..4cbf8cc60 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java @@ -7,14 +7,14 @@ import lombok.Data; @Data public class EntityRichInfo { - private Long domainId; - private String domainName; - private String domainBizName; +// private Long domainId; +// private String domainName; +// private String domainBizName; + /** + * entity alias + */ private List names; - private List entityIds; - - private EntityInternalDetail entityInternalDetailDesc; - + private DimSchemaResp dimItem; } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibility.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibility.java index 94941003a..b6bd242a6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibility.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibility.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.chat.domain.pojo.config; +import java.util.ArrayList; import java.util.List; import lombok.Data; import lombok.ToString; @@ -12,10 +13,10 @@ public class ItemVisibility { /** * invisible dimensions */ - private List blackDimIdList; + private List blackDimIdList = new ArrayList<>(); /** * invisible metrics */ - private List blackMetricIdList; + private List blackMetricIdList = new ArrayList<>(); } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeAdvancedConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeAdvancedConfig.java new file mode 100644 index 000000000..931ed7de3 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeAdvancedConfig.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.chat.domain.pojo.config; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * advanced knowledge config + */ +@Data +public class KnowledgeAdvancedConfig { + + private List blackList = new ArrayList<>(); + private List whiteList = new ArrayList<>(); + private List ruleList = new ArrayList<>(); +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeInfo.java index 5ccd0c1dd..9481228d5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeInfo.java @@ -27,9 +27,12 @@ public class KnowledgeInfo { @NotNull private TypeEnums type = TypeEnums.DIMENSION; - private List blackList; - private List whiteList; - private List ruleList; - private Boolean isDictInfo; + private Boolean searchEnable = false; + + /** + * advanced knowledge config for single item + */ + private KnowledgeAdvancedConfig knowledgeAdvancedConfig; + } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatConfigRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatConfigRepository.java index f683e5ea4..8a7e83e6c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatConfigRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatConfigRepository.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.chat.domain.repository; import com.tencent.supersonic.chat.domain.pojo.config.ChatConfig; import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; import java.util.List; @@ -13,7 +13,7 @@ public interface ChatConfigRepository { Long updateConfig(ChatConfig chaConfig); - List getChatConfig(ChatConfigFilter filter); + List getChatConfig(ChatConfigFilter filter); - ChatConfigInfo getConfigByDomainId(Long domainId); + ChatConfigResp getConfigByDomainId(Long domainId); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java index 4a313fea8..1b1a14c66 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java @@ -2,22 +2,25 @@ package com.tencent.supersonic.chat.domain.service; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBase; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReq; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBaseReq; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReqReq; import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; + import java.util.List; public interface ConfigService { - Long addConfig(ChatConfigBase extendBaseCmd, User user); + Long addConfig(ChatConfigBaseReq extendBaseCmd, User user); - Long editConfig(ChatConfigEditReq extendEditCmd, User user); + Long editConfig(ChatConfigEditReqReq extendEditCmd, User user); - List search(ChatConfigFilter filter, User user); + List search(ChatConfigFilter filter, User user); - ChatConfigRichInfo getConfigRichInfo(Long domainId); + ChatConfigRichResp getConfigRichInfo(Long domainId); - List getAllChatRichConfig(); + ChatConfigResp fetchConfigByDomainId(Long domainId); + + List getAllChatRichConfig(); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ChatConfigUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ChatConfigUtils.java index f79114003..e52274def 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ChatConfigUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ChatConfigUtils.java @@ -3,20 +3,11 @@ package com.tencent.supersonic.chat.domain.utils; import static com.tencent.supersonic.common.constant.Constants.ADMIN_LOWER; import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.domain.pojo.config.*; import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; import com.tencent.supersonic.chat.domain.dataobject.ChatConfigDO; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfig; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBase; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReq; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetricInfo; -import com.tencent.supersonic.chat.domain.pojo.config.Entity; -import com.tencent.supersonic.chat.domain.pojo.config.EntityDetailData; -import com.tencent.supersonic.chat.domain.pojo.config.EntityInternalDetail; -import com.tencent.supersonic.chat.domain.pojo.config.ItemVisibility; -import com.tencent.supersonic.chat.domain.pojo.config.KnowledgeInfo; import com.tencent.supersonic.common.enums.StatusEnum; import com.tencent.supersonic.common.util.RecordInfo; import com.tencent.supersonic.common.util.json.JsonUtil; @@ -39,31 +30,28 @@ import org.springframework.util.CollectionUtils; @Slf4j public class ChatConfigUtils { - public ChatConfig newChatConfig(ChatConfigBase extendBaseCmd, User user) { - ChatConfig chaConfig = new ChatConfig(); - - BeanUtils.copyProperties(extendBaseCmd, chaConfig); - + public ChatConfig newChatConfig(ChatConfigBaseReq extendBaseCmd, User user) { + ChatConfig chatConfig = new ChatConfig(); + BeanUtils.copyProperties(extendBaseCmd, chatConfig); RecordInfo recordInfo = new RecordInfo(); String creator = (Objects.isNull(user) || Strings.isEmpty(user.getName())) ? ADMIN_LOWER : user.getName(); recordInfo.createdBy(creator); - chaConfig.setRecordInfo(recordInfo); - chaConfig.setStatus(StatusEnum.ONLINE); - return chaConfig; + chatConfig.setRecordInfo(recordInfo); + chatConfig.setStatus(StatusEnum.ONLINE); + return chatConfig; } - public ChatConfig editChaConfig(ChatConfigEditReq extendEditCmd, User facadeUser) { - ChatConfig chaConfig = new ChatConfig(); - - BeanUtils.copyProperties(extendEditCmd, chaConfig); + public ChatConfig editChatConfig(ChatConfigEditReqReq extendEditCmd, User facadeUser) { + ChatConfig chatConfig = new ChatConfig(); + BeanUtils.copyProperties(extendEditCmd, chatConfig); RecordInfo recordInfo = new RecordInfo(); String user = (Objects.isNull(facadeUser) || Strings.isEmpty(facadeUser.getName())) ? ADMIN_LOWER : facadeUser.getName(); recordInfo.updatedBy(user); - chaConfig.setRecordInfo(recordInfo); - return chaConfig; + chatConfig.setRecordInfo(recordInfo); + return chatConfig; } @@ -126,45 +114,76 @@ public class ChatConfigUtils { return new ArrayList<>(metricIdAndDescPair.keySet()); } - public ChatConfigDO chatConfig2DO(ChatConfig chaConfig) { - ChatConfigDO chaConfigDO = new ChatConfigDO(); - BeanUtils.copyProperties(chaConfig, chaConfigDO); + public ChatConfigDO chatConfig2DO(ChatConfig chatConfig) { + ChatConfigDO chatConfigDO = new ChatConfigDO(); + BeanUtils.copyProperties(chatConfig, chatConfigDO); - chaConfigDO.setDefaultMetrics(JsonUtil.toString(chaConfig.getDefaultMetrics())); - chaConfigDO.setVisibility(JsonUtil.toString(chaConfig.getVisibility())); - chaConfigDO.setEntity(JsonUtil.toString(chaConfig.getEntity())); - chaConfigDO.setKnowledgeInfo(JsonUtil.toString(chaConfig.getKnowledgeInfos())); + chatConfigDO.setChatAggConfig(JsonUtil.toString(chatConfig.getChatAggConfig())); + chatConfigDO.setChatDetailConfig(JsonUtil.toString(chatConfig.getChatDetailConfig())); - if (Objects.isNull(chaConfig.getStatus())) { - chaConfigDO.setStatus(null); + if (Objects.isNull(chatConfig.getStatus())) { + chatConfigDO.setStatus(null); } else { - chaConfigDO.setStatus(chaConfig.getStatus().getCode()); + chatConfigDO.setStatus(chatConfig.getStatus().getCode()); } - chaConfigDO.setCreatedBy(chaConfig.getRecordInfo().getCreatedBy()); - chaConfigDO.setCreatedAt(chaConfig.getRecordInfo().getCreatedAt()); - chaConfigDO.setUpdatedBy(chaConfig.getRecordInfo().getUpdatedBy()); - chaConfigDO.setUpdatedAt(chaConfig.getRecordInfo().getUpdatedAt()); + chatConfigDO.setCreatedBy(chatConfig.getRecordInfo().getCreatedBy()); + chatConfigDO.setCreatedAt(chatConfig.getRecordInfo().getCreatedAt()); + chatConfigDO.setUpdatedBy(chatConfig.getRecordInfo().getUpdatedBy()); + chatConfigDO.setUpdatedAt(chatConfig.getRecordInfo().getUpdatedAt()); - return chaConfigDO; + return chatConfigDO; } - public ChatConfigInfo chatConfigDO2Descriptor(ChatConfigDO chaConfigDO) { - ChatConfigInfo chaConfigDescriptor = new ChatConfigInfo(); - BeanUtils.copyProperties(chaConfigDO, chaConfigDescriptor); + public ChatConfigResp chatConfigDO2Descriptor(Long domainId, ChatConfigDO chatConfigDO) { + ChatConfigResp chatConfigDescriptor = new ChatConfigResp(); - chaConfigDescriptor.setDefaultMetrics( - JsonUtil.toList(chaConfigDO.getDefaultMetrics(), DefaultMetricInfo.class)); - chaConfigDescriptor.setVisibility(JsonUtil.toObject(chaConfigDO.getVisibility(), ItemVisibility.class)); - chaConfigDescriptor.setEntity(JsonUtil.toObject(chaConfigDO.getEntity(), Entity.class)); - chaConfigDescriptor.setKnowledgeInfos(JsonUtil.toList(chaConfigDO.getKnowledgeInfo(), KnowledgeInfo.class)); - chaConfigDescriptor.setStatusEnum(StatusEnum.of(chaConfigDO.getStatus())); + if (Objects.isNull(chatConfigDO)) { + // deal empty chatConfigDO + return generateEmptyChatConfigResp(domainId); + } - chaConfigDescriptor.setCreatedBy(chaConfigDO.getCreatedBy()); - chaConfigDescriptor.setCreatedAt(chaConfigDO.getCreatedAt()); - chaConfigDescriptor.setUpdatedBy(chaConfigDO.getUpdatedBy()); - chaConfigDescriptor.setUpdatedAt(chaConfigDO.getUpdatedAt()); + BeanUtils.copyProperties(chatConfigDO, chatConfigDescriptor); - return chaConfigDescriptor; + chatConfigDescriptor.setChatDetailConfig(JsonUtil.toObject(chatConfigDO.getChatDetailConfig(), ChatDetailConfig.class)); + chatConfigDescriptor.setChatAggConfig(JsonUtil.toObject(chatConfigDO.getChatAggConfig(), ChatAggConfig.class)); + chatConfigDescriptor.setStatusEnum(StatusEnum.of(chatConfigDO.getStatus())); + + chatConfigDescriptor.setCreatedBy(chatConfigDO.getCreatedBy()); + chatConfigDescriptor.setCreatedAt(chatConfigDO.getCreatedAt()); + chatConfigDescriptor.setUpdatedBy(chatConfigDO.getUpdatedBy()); + chatConfigDescriptor.setUpdatedAt(chatConfigDO.getUpdatedAt()); + + + if (Strings.isEmpty(chatConfigDO.getChatAggConfig())) { + chatConfigDescriptor.setChatAggConfig(generateEmptyChatAggConfigResp()); + } + + if (Strings.isEmpty(chatConfigDO.getChatDetailConfig())) { + chatConfigDescriptor.setChatDetailConfig(generateEmptyChatDetailConfigResp()); + } + return chatConfigDescriptor; + } + + private ChatConfigResp generateEmptyChatConfigResp(Long domainId) { + ChatConfigResp chatConfigResp = new ChatConfigResp(); + chatConfigResp.setDomainId(domainId); + chatConfigResp.setChatDetailConfig(generateEmptyChatDetailConfigResp()); + chatConfigResp.setChatAggConfig(generateEmptyChatAggConfigResp()); + return chatConfigResp; + } + + private ChatDetailConfig generateEmptyChatDetailConfigResp() { + ChatDetailConfig chatDetailConfig = new ChatDetailConfig(); + ItemVisibility visibility = new ItemVisibility(); + chatDetailConfig.setVisibility(visibility); + return chatDetailConfig; + } + + private ChatAggConfig generateEmptyChatAggConfigResp() { + ChatAggConfig chatAggConfig = new ChatAggConfig(); + ItemVisibility visibility = new ItemVisibility(); + chatAggConfig.setVisibility(visibility); + return chatAggConfig; } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java index 2d647c245..bc5190667 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java @@ -1,24 +1,24 @@ package com.tencent.supersonic.chat.domain.utils; +import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.Filter; import com.tencent.supersonic.chat.api.pojo.QueryMatchInfo; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; import com.tencent.supersonic.common.pojo.SchemaItem; -import java.util.Set; -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; - +import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; +import java.util.Set; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; public class ContextHelper { @@ -137,17 +137,18 @@ public class ContextHelper { return difference; } - public static void setEntityId(Long dimensionId, String value, ChatConfigRichInfo chaConfigRichDesc, - SemanticParseInfo semanticParseInfo) { - if (chaConfigRichDesc != null && chaConfigRichDesc.getEntity() != null) { - Optional dimensionDesc = chaConfigRichDesc.getEntity().getEntityIds().stream() - .filter(i -> i.getId().equals(dimensionId)).findFirst(); - if (dimensionDesc.isPresent() && StringUtils.isNumeric(value)) { + public static void setEntityId(Long dimensionId, String value, ChatConfigRichResp chaConfigRichDesc, + SemanticParseInfo semanticParseInfo) { + if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null + && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { + DimSchemaResp dimSchemaResp = chaConfigRichDesc.getChatDetailRichConfig().getEntity().getDimItem(); + if (Objects.nonNull(dimSchemaResp) && StringUtils.isNumeric(value)) { semanticParseInfo.setEntity(Long.valueOf(value)); } } } + public static boolean hasEntityId(ChatContext chatCtx) { if (chatCtx != null && chatCtx.getParseInfo() != null) { return chatCtx.getParseInfo().getEntity() > 0; @@ -198,9 +199,17 @@ public class ContextHelper { for (Filter chatFilter : contextSemanticParse.getDimensionFilters()) { if (!isInSchemaElementMatchList(elementMatches, SchemaElementType.VALUE, chatFilter.getValue().toString())) { - toSchemaElementMatch.add( - getSchemaElementMatchByContext(chatFilter.getElementID().intValue(), - chatFilter.getValue().toString(), SchemaElementType.VALUE)); + List values = new ArrayList<>(); + if (chatFilter.getOperator().equals(FilterOperatorEnum.IN)) { + values.addAll((List) chatFilter.getValue()); + } else { + values.add(chatFilter.getValue().toString()); + } + for (String value : values) { + toSchemaElementMatch.add( + getSchemaElementMatchByContext(chatFilter.getElementID().intValue(), + value, SchemaElementType.VALUE)); + } } } } @@ -224,8 +233,7 @@ public class ContextHelper { return false; } Long num = elementMatches.stream() - .filter(element -> element != null && element.getWord() != null && element.getWord() - .equalsIgnoreCase(word) && element.getElementType().equals(schemaElementType)).count(); + .filter(element -> element != null && element.getElementType().equals(schemaElementType)).count(); return num > 0; } @@ -247,6 +255,7 @@ public class ContextHelper { .elementID(id) .elementType(schemaElementType) .word(word) + .detectWord(word) .similarity(0.5) .build(); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java index 24d6d8530..7146d95fe 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java @@ -2,34 +2,33 @@ package com.tencent.supersonic.chat.domain.utils; import static java.time.LocalDate.now; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.*; import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.chat.application.ConfigServiceImpl; import com.tencent.supersonic.chat.application.parser.DomainResolver; -import com.tencent.supersonic.chat.application.query.EntityDetail; -import com.tencent.supersonic.chat.application.query.EntityListFilter; -import com.tencent.supersonic.chat.application.query.EntityListTopN; -import com.tencent.supersonic.chat.application.query.EntityMetricFilter; -import com.tencent.supersonic.chat.application.query.MetricDomain; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; +import com.tencent.supersonic.chat.application.query.*; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; +import com.tencent.supersonic.chat.domain.pojo.config.ChatDefaultRichConfig; import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; +import com.tencent.supersonic.common.constant.Constants; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.SchemaItem; import com.tencent.supersonic.common.util.context.ContextUtils; import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; +import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -37,64 +36,81 @@ import org.springframework.util.CollectionUtils; @Component public class DefaultMetricUtils { + @Autowired + private ConfigServiceImpl configService; + /** * supplementary default metric date dimension */ - public void injectDefaultMetric(SemanticParseInfo semanticParseInfo, QueryContextReq queryContext, - ChatContext chatContext) { + public void fillDefaultMetric(SemanticParseInfo semanticParseInfo, QueryContextReq queryContext, + ChatContext chatContext) { String queryMode = semanticParseInfo.getQueryMode(); - ChatConfigRichInfo chaConfigRichDesc = null; if (StringUtils.isNotEmpty(queryMode)) { + Map semanticQuery = RuleSemanticQueryManager.getSemanticQueries().stream().collect(Collectors.toMap(RuleSemanticQuery::getQueryMode, Function.identity())); + RuleSemanticQuery ruleSemanticQuery = semanticQuery.get(queryMode); if (semanticParseInfo == null) { return; } - if (!EntityListFilter.QUERY_MODE.equals(queryMode)) { - boolean isFillThemeDefaultMetricLogic = false; - boolean isAddEntityDetailDimensionMetric = false; - Integer domainId = queryContext.getDomainId().intValue(); - List matchedElements = queryContext.getMapInfo().getMatchedElements(domainId); +// if (!EntityListFilter.QUERY_MODE.equals(queryMode)) { + boolean isFillAggDefaultMetricLogic = false; + boolean isFillDetailDimensionMetric = false; + Integer domainId = queryContext.getDomainId().intValue(); + ChatDefaultRichConfig chatDefaultConfig = null; + Boolean isDetailMode = false; + List matchedElements = queryContext.getMapInfo().getMatchedElements(domainId); + ChatConfigRichResp chaConfigRichDesc = getChatConfigRichInfo(semanticParseInfo.getDomainId()); + if (Objects.isNull(chaConfigRichDesc)) { + return; + } + if (ruleSemanticQuery instanceof MetricSemanticQuery) { if (!CollectionUtils.isEmpty(matchedElements)) { long metricCount = matchedElements.stream() .filter(schemaElementMatch -> schemaElementMatch.getElementType() .equals(SchemaElementType.METRIC)).count(); + if (metricCount <= 0) { if (chatContext.getParseInfo() == null || chatContext.getParseInfo().getMetrics() == null || chatContext.getParseInfo().getMetrics().size() <= 0) { - log.info("fillThemeDefaultMetricLogic"); - isFillThemeDefaultMetricLogic = true; + + log.info("isFillAggDefaultMetricLogic is true"); + isFillAggDefaultMetricLogic = true; + } } - } else { - log.info("fillThemeDefaultMetricLogic for empty matchedElements "); - isFillThemeDefaultMetricLogic = true; } - if (EntityDetail.QUERY_MODE.equals(queryMode) || EntityMetricFilter.QUERY_MODE.equals(queryMode)) { - isAddEntityDetailDimensionMetric = true; - dealNativeQuery(semanticParseInfo, queryContext, true); + if (Objects.nonNull(chaConfigRichDesc.getChatAggRichConfig())) { + chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); } - if (isFillThemeDefaultMetricLogic) { - if (chaConfigRichDesc == null) { - chaConfigRichDesc = getChatConfigRichInfo(semanticParseInfo.getDomainId()); - } - fillThemeDefaultMetricLogic(semanticParseInfo, chaConfigRichDesc, queryContext); + } else if (ruleSemanticQuery instanceof EntitySemanticQuery) { + log.info("fillThemeDefaultMetricLogic for empty matchedElements "); + isFillDetailDimensionMetric = true; + dealNativeQuery(semanticParseInfo, queryContext, true); + isDetailMode = true; + if (Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig())) { + chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig(); } - if (isAddEntityDetailDimensionMetric) { - if (chaConfigRichDesc == null) { - chaConfigRichDesc = getChatConfigRichInfo(semanticParseInfo.getDomainId()); - } - addEntityDetailDimensionMetric(semanticParseInfo, chaConfigRichDesc, queryContext, chatContext); - } - fillDateDomain(semanticParseInfo, chatContext, chaConfigRichDesc, queryContext); } + + + if (isFillAggDefaultMetricLogic) { + fillDefaultMetricAggLogic(semanticParseInfo, chaConfigRichDesc, queryContext); + } + + if (isFillDetailDimensionMetric) { + addEntityDetailDimensionMetric(semanticParseInfo, chaConfigRichDesc, queryContext, chatContext); + } + + fillDateDomain(semanticParseInfo, chatContext, chaConfigRichDesc, chatDefaultConfig, isDetailMode); +// } defaultQueryMode(semanticParseInfo, queryContext, chatContext); addEntityTopDimension(semanticParseInfo, chaConfigRichDesc); } } public void dealNativeQuery(SemanticParseInfo semanticParseInfo, QueryContextReq queryContext, - boolean isNativeQuery) { + boolean isNativeQuery) { if (Objects.nonNull(queryContext) && Objects.nonNull(semanticParseInfo)) { semanticParseInfo.setNativeQuery(isNativeQuery); } @@ -102,22 +118,18 @@ public class DefaultMetricUtils { public Set addPrimaryDimension(EntityRichInfo entity, List dimensions) { Set primaryDimensions = new HashSet<>(); - if (Objects.isNull(entity) || CollectionUtils.isEmpty(entity.getEntityIds())) { + if (Objects.isNull(entity) || Objects.isNull(entity.getDimItem())) { return primaryDimensions; } - entity.getEntityIds().stream().forEach(dimSchemaDesc -> { - SchemaItem dimension = new SchemaItem(); - //BeanUtils.copyProperties(dimSchemaDesc, dimension); - dimension.setName(dimSchemaDesc.getName()); - dimension.setBizName(dimSchemaDesc.getBizName()); - dimension.setId(dimSchemaDesc.getId()); - dimensions.add(dimension); - primaryDimensions.add(dimSchemaDesc.getBizName()); - }); + DimSchemaResp dimItem = entity.getDimItem(); + SchemaItem dimension = new SchemaItem(); + BeanUtils.copyProperties(dimItem, dimension); + dimensions.add(dimension); + primaryDimensions.add(dimItem.getBizName()); return primaryDimensions; } - public void addEntityTopDimension(SemanticParseInfo semanticParseInfo, ChatConfigRichInfo chaConfigRichDesc) { + public void addEntityTopDimension(SemanticParseInfo semanticParseInfo, ChatConfigRichResp chaConfigRichDesc) { if (!semanticParseInfo.getQueryMode().equals(EntityListTopN.QUERY_MODE) || !semanticParseInfo.getDimensions() .isEmpty()) { return; @@ -127,44 +139,56 @@ public class DefaultMetricUtils { if (chaConfigRichDesc == null) { chaConfigRichDesc = getChatConfigRichInfo(domainId); } - if (chaConfigRichDesc != null && chaConfigRichDesc.getEntity() != null) { + if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null + && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { List dimensions = new ArrayList<>(); - addPrimaryDimension(chaConfigRichDesc.getEntity(), dimensions); + addPrimaryDimension(chaConfigRichDesc.getChatDetailRichConfig().getEntity(), dimensions); semanticParseInfo.setDimensions(new HashSet<>(dimensions)); semanticParseInfo.setLimit(1L); } } } - public void addEntityDetailDimensionMetric(SemanticParseInfo semanticParseInfo, - ChatConfigRichInfo chaConfigRichDesc, QueryContextReq queryContext, - ChatContext chatCtx) { + public void addEntityDetailDimensionMetric(SemanticParseInfo semanticParseInfo, ChatConfigRichResp chaConfigRichDesc, QueryContextReq queryContext, + ChatContext chatCtx) { if (semanticParseInfo.getDomainId() > 0) { Long domainId = semanticParseInfo.getDomainId(); - if (chaConfigRichDesc != null) { - if (chaConfigRichDesc.getEntity() == null - || chaConfigRichDesc.getEntity().getEntityInternalDetailDesc() == null) { + if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null) { + if (chaConfigRichDesc.getChatDetailRichConfig().getEntity() == null + || chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig() == null) { return; } List schemaElementMatches = queryContext.getMapInfo() .getMatchedElements(domainId.intValue()); - if (CollectionUtils.isEmpty(schemaElementMatches) || schemaElementMatches.stream() - .filter(s -> SchemaElementType.DIMENSION.equals(s.getElementType())).count() <= 0) { + if (CollectionUtils.isEmpty(schemaElementMatches) + || schemaElementMatches.stream().filter(s -> SchemaElementType.DIMENSION.equals(s.getElementType())).count() <= 0) { log.info("addEntityDetailDimensionMetric catch"); - Set dimensions = new LinkedHashSet(); - chaConfigRichDesc.getEntity().getEntityInternalDetailDesc().getDimensionList().stream() - .forEach(m -> dimensions.add(getDimension(m))); - semanticParseInfo.setDimensions(dimensions); + if (CollectionUtils.isEmpty(semanticParseInfo.getDimensions())) { + Set dimensions = new LinkedHashSet(); + List dimensionsConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig().getDimensions(); + if (!CollectionUtils.isEmpty(dimensionsConfig)) { + dimensionsConfig.stream().forEach(m -> dimensions.add(m)); + } + semanticParseInfo.setDimensions(dimensions); + } + if (CollectionUtils.isEmpty(semanticParseInfo.getMetrics())) { + Set metrics = new LinkedHashSet(); + List metricsConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig().getMetrics(); + if (!CollectionUtils.isEmpty(metricsConfig)) { + metricsConfig.stream().forEach(m -> metrics.add(m)); + } + semanticParseInfo.setMetrics(metrics); + } } } } } public void defaultQueryMode(SemanticParseInfo semanticParseInfo, QueryContextReq queryContext, - ChatContext chatCtx) { + ChatContext chatCtx) { SchemaMapInfo schemaMap = queryContext.getMapInfo(); if (StringUtils.isEmpty(semanticParseInfo.getQueryMode())) { if (chatCtx.getParseInfo() != null && chatCtx.getParseInfo().getDomainId() > 0) { @@ -216,9 +240,94 @@ public class DefaultMetricUtils { } } + public void fillParseInfo(SemanticQuery query, Long domainId, String domainName) { + SemanticParseInfo parseInfo = query.getParseInfo(); + parseInfo.setDomainId(domainId); + parseInfo.setDomainName(domainName); + parseInfo.setQueryMode(query.getQueryMode()); - public void fillDateDomain(SemanticParseInfo parseInfo, ChatContext chatCtx, ChatConfigRichInfo chaConfigRichDesc, - QueryContextReq queryContext) { + + SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + + DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo(parseInfo.getDomainId(), true); + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(parseInfo.getDomainId()); + Map dimensionDescMap = domainSchemaDesc.getDimensions().stream() + .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); + Map metricDescMap = domainSchemaDesc.getMetrics().stream() + .collect(Collectors.toMap(MetricSchemaResp::getId, Function.identity())); + Map> dim2Values = new HashMap<>(); + + List elementMatches = query.getParseInfo().getElementMatches(); + for (SchemaElementMatch schemaMatch : elementMatches) { + Long elementID = Long.valueOf(schemaMatch.getElementID()); + switch (schemaMatch.getElementType()) { + case ID: + case VALUE: + if (dimensionDescMap.containsKey(elementID)) { + if (dim2Values.containsKey(elementID)) { + dim2Values.get(elementID).add(schemaMatch); + } else { + dim2Values.put(elementID, new ArrayList<>(Arrays.asList(schemaMatch))); + } + } + break; + case DIMENSION: + DimSchemaResp dimensionDesc = dimensionDescMap.get(elementID); + if (dimensionDesc != null) { + SchemaItem dimensionParseInfo = new SchemaItem(); + dimensionParseInfo.setBizName(dimensionDesc.getBizName()); + dimensionParseInfo.setName(dimensionDesc.getName()); + dimensionParseInfo.setId(dimensionDesc.getId()); + parseInfo.getDimensions().add(dimensionParseInfo); + } + break; + case METRIC: + MetricSchemaResp metricDesc = metricDescMap.get(elementID); + if (metricDesc != null) { + SchemaItem metricItem = new SchemaItem(); + metricItem.setBizName(metricDesc.getBizName()); + metricItem.setName(metricDesc.getName()); + metricItem.setId(metricDesc.getId()); + metricItem.setCreatedAt(null); + metricItem.setUpdatedAt(null); + parseInfo.getMetrics().add(metricItem); + } + break; + default: + } + } + + if (!dim2Values.isEmpty()) { + for (Map.Entry> entry : dim2Values.entrySet()) { + DimSchemaResp dimensionDesc = dimensionDescMap.get(entry.getKey()); + if (entry.getValue().size() == 1) { + SchemaElementMatch schemaMatch = entry.getValue().get(0); + Filter dimensionFilter = new Filter(); + dimensionFilter.setValue(schemaMatch.getWord()); + dimensionFilter.setBizName(dimensionDesc.getBizName()); + dimensionFilter.setName(dimensionDesc.getName()); + dimensionFilter.setOperator(FilterOperatorEnum.EQUALS); + dimensionFilter.setElementID(Long.valueOf(schemaMatch.getElementID())); + parseInfo.getDimensionFilters().add(dimensionFilter); + ContextHelper.setEntityId(entry.getKey(), schemaMatch.getWord(), chaConfigRichDesc, + parseInfo); + } else { + Filter dimensionFilter = new Filter(); + List vals = new ArrayList<>(); + entry.getValue().stream().forEach(i -> vals.add(i.getWord())); + dimensionFilter.setValue(vals); + dimensionFilter.setBizName(dimensionDesc.getBizName()); + dimensionFilter.setName(dimensionDesc.getName()); + dimensionFilter.setOperator(FilterOperatorEnum.IN); + dimensionFilter.setElementID(entry.getKey()); + parseInfo.getDimensionFilters().add(dimensionFilter); + } + } + } + } + + public void fillDateDomain(SemanticParseInfo parseInfo, ChatContext chatCtx, ChatConfigRichResp chaConfigRichDesc, + ChatDefaultRichConfig chatDefaultConfig, Boolean isDetailMode) { //SemanticParseInfo parseInfo = queryContext.getParseInfo(); if (parseInfo == null || parseInfo.getDateInfo() == null) { @@ -232,16 +341,18 @@ public class DefaultMetricUtils { isUpdateTime = true; } if (isUpdateTime && parseInfo != null && parseInfo.getDomainId() > 0) { - fillThemeDefaultTime(parseInfo.getDomainId(), chaConfigRichDesc, parseInfo); + + fillThemeDefaultTime(chaConfigRichDesc, parseInfo, chatDefaultConfig, isDetailMode); } } } - public void fillThemeDefaultMetricLogic(SemanticParseInfo semanticParseInfo, ChatConfigRichInfo chaConfigRichDesc, - QueryContextReq queryContext) { + public void fillDefaultMetricAggLogic(SemanticParseInfo semanticParseInfo, ChatConfigRichResp chaConfigRichDesc, QueryContextReq queryContext) { //SemanticParseInfo semanticParseInfo = queryContext.getParseInfo(); - if (Objects.isNull(chaConfigRichDesc) || CollectionUtils.isEmpty(chaConfigRichDesc.getDefaultMetrics())) { + if (Objects.isNull(chaConfigRichDesc) || Objects.isNull(chaConfigRichDesc.getChatAggRichConfig()) + || Objects.isNull(chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig()) + || CollectionUtils.isEmpty(chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig().getMetrics())) { log.info("there is no defaultMetricIds info"); return; } @@ -258,9 +369,9 @@ public class DefaultMetricUtils { .filter(e -> e.getElementType().equals(SchemaElementType.DIMENSION)).count(); if (metricNum <= 0 && dimensionNum <= 0) { Set metrics = new LinkedHashSet(); - chaConfigRichDesc.getDefaultMetrics().stream().forEach(metric -> { + chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig().getMetrics().stream().forEach(metric -> { SchemaItem metricTmp = new SchemaItem(); - metricTmp.setId(metric.getMetricId()); + metricTmp.setId(metric.getId()); metricTmp.setBizName(metric.getBizName()); metrics.add(metricTmp); }); @@ -269,18 +380,17 @@ public class DefaultMetricUtils { if (Objects.isNull(semanticParseInfo.getDateInfo()) || Objects.isNull( semanticParseInfo.getDateInfo().getDateMode())) { - DefaultMetric defaultMetricInfo = chaConfigRichDesc.getDefaultMetrics().get(0); + ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); DateConf dateInfo = new DateConf(); dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setUnit(defaultMetricInfo.getUnit()); - dateInfo.setPeriod(defaultMetricInfo.getPeriod()); + dateInfo.setUnit(chatDefaultConfig.getUnit()); + dateInfo.setPeriod(chatDefaultConfig.getPeriod()); semanticParseInfo.setDateInfo(dateInfo); } } - public void fillThemeDefaultTime(Long domain, ChatConfigRichInfo chaConfigRichDesc, - SemanticParseInfo semanticParseInfo) { + public void fillThemeDefaultTime(ChatConfigRichResp chaConfigRichDesc, SemanticParseInfo semanticParseInfo, ChatDefaultRichConfig chatDefaultConfig, Boolean isDetailMode) { if (!Objects.isNull(semanticParseInfo.getDateInfo()) && !Objects.isNull( semanticParseInfo.getDateInfo().getDateMode())) { return; @@ -288,22 +398,26 @@ public class DefaultMetricUtils { if (chaConfigRichDesc == null) { chaConfigRichDesc = getChatConfigRichInfo(semanticParseInfo.getDomainId()); } - if (!Objects.isNull(chaConfigRichDesc) && !CollectionUtils.isEmpty(chaConfigRichDesc.getDefaultMetrics())) { - DefaultMetric defaultMetricInfo = chaConfigRichDesc.getDefaultMetrics().get(0); + if (!Objects.isNull(chaConfigRichDesc) && Objects.nonNull(chatDefaultConfig) && !CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())) { DateConf dateInfo = new DateConf(); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setUnit(defaultMetricInfo.getUnit()); - dateInfo.setStartDate(now().minusDays(defaultMetricInfo.getUnit()).toString()); - dateInfo.setEndDate(now().minusDays(1).toString()); - dateInfo.setPeriod(defaultMetricInfo.getPeriod()); + if (isDetailMode) { + dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); + dateInfo.setUnit(1); + dateInfo.setPeriod(Constants.DAY); + } else { + dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); + dateInfo.setUnit(chatDefaultConfig.getUnit()); + dateInfo.setPeriod(chatDefaultConfig.getPeriod()); + } + + semanticParseInfo.setDateInfo(dateInfo); log.info("fillThemeDefaultTime"); } } - public ChatConfigRichInfo getChatConfigRichInfo(Long domain) { - DefaultSemanticInternalUtils defaultSemanticUtils = ContextUtils.getBean(DefaultSemanticInternalUtils.class); - ChatConfigRichInfo chaConfigRichDesc = defaultSemanticUtils.getChatConfigRichInfo(domain); + public ChatConfigRichResp getChatConfigRichInfo(Long domain) { + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domain); return chaConfigRichDesc; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultSemanticInternalUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultSemanticInternalUtils.java deleted file mode 100644 index aa163dffc..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultSemanticInternalUtils.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.tencent.supersonic.chat.domain.utils; - -import static com.tencent.supersonic.common.constant.Constants.LIST_LOWER; -import static com.tencent.supersonic.common.constant.Constants.PAGESIZE_LOWER; -import static com.tencent.supersonic.common.constant.Constants.TOTAL_LOWER; - -import com.github.pagehelper.PageInfo; -import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; -import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.core.response.DimensionResp; -import com.tencent.supersonic.semantic.api.core.response.DomainResp; -import com.tencent.supersonic.semantic.api.core.response.MetricResp; -import com.tencent.supersonic.chat.application.ConfigServiceImpl; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; -import com.tencent.supersonic.common.result.ResultData; -import com.tencent.supersonic.common.result.ReturnCode; -import com.tencent.supersonic.common.util.context.S2ThreadContext; -import com.tencent.supersonic.common.util.context.ThreadContext; -import com.tencent.supersonic.common.util.json.JsonUtil; - -import java.net.URI; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Objects; - -import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.util.Strings; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - -@Component -@Slf4j -public class DefaultSemanticInternalUtils { - - @Value("${semantic.url.prefix:http://localhost:8081}") - private String semanticUrl; - - @Value("${fetchDomainList.path:/api/semantic/schema/dimension/page}") - private String fetchDimensionPagePath; - - @Value("${fetchDomainList.path:/api/semantic/schema/metric/page}") - private String fetchMetricPagePath; - - @Value("${fetchDomainList.path:/api/semantic/schema/domain/list}") - private String fetchDomainListPath; - - - @Autowired - private RestTemplate restTemplate; - - @Autowired - private ConfigServiceImpl chaConfigService; - - @Autowired - private S2ThreadContext s2ThreadContext; - - @Autowired - private AuthenticationConfig authenticationConfig; - - - public ChatConfigRichInfo getChatConfigRichInfo(Long domain) { - return chaConfigService.getConfigRichInfo(domain); - } - - - public PageInfo queryMetricPage(PageMetricReq pageMetricCmd, User user) { - String body = JsonUtil.toString(pageMetricCmd); - Object dimensionListObject = fetchHttpResult(semanticUrl + fetchMetricPagePath, body, HttpMethod.POST); - LinkedHashMap map = (LinkedHashMap) dimensionListObject; - PageInfo metricDescObjectPageInfo = generatePageInfo(map); - PageInfo metricDescPageInfo = new PageInfo<>(); - BeanUtils.copyProperties(metricDescObjectPageInfo, metricDescPageInfo); - metricDescPageInfo.setList(metricDescPageInfo.getList()); - return metricDescPageInfo; - } - - public PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd, User user) { - String body = JsonUtil.toString(pageDimensionCmd); - Object dimensionListObject = fetchHttpResult(semanticUrl + fetchDimensionPagePath, body, HttpMethod.POST); - LinkedHashMap map = (LinkedHashMap) dimensionListObject; - PageInfo dimensionDescObjectPageInfo = generatePageInfo(map); - PageInfo dimensionDescPageInfo = new PageInfo<>(); - BeanUtils.copyProperties(dimensionDescObjectPageInfo, dimensionDescPageInfo); - dimensionDescPageInfo.setList(dimensionDescPageInfo.getList()); - return dimensionDescPageInfo; - } - - private PageInfo generatePageInfo(LinkedHashMap map) { - PageInfo pageInfo = new PageInfo<>(); - pageInfo.setList((List) map.get(LIST_LOWER)); - Integer total = (Integer) map.get(TOTAL_LOWER); - pageInfo.setTotal(total); - Integer pageSize = (Integer) map.get(PAGESIZE_LOWER); - pageInfo.setPageSize(pageSize); - pageInfo.setPages((int) Math.ceil((double) total / pageSize)); - return pageInfo; - } - - - public Object fetchHttpResult(String url, String bodyJson, HttpMethod httpMethod) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - fillToken(headers); - URI requestUrl = UriComponentsBuilder.fromHttpUrl(url).build().encode().toUri(); - ParameterizedTypeReference> responseTypeRef = - new ParameterizedTypeReference>() { - }; - HttpEntity entity = new HttpEntity<>(JsonUtil.toString(bodyJson), headers); - try { - ResponseEntity> responseEntity = restTemplate.exchange(requestUrl, - httpMethod, entity, responseTypeRef); - ResultData responseBody = responseEntity.getBody(); - log.debug("ApiResponse responseBody:{}", responseBody); - if (ReturnCode.SUCCESS.getCode() == responseBody.getCode()) { - Object data = responseBody.getData(); - return data; - } - } catch (Exception e) { - throw new RuntimeException("fetchDomainSchema interface error", e); - } - throw new RuntimeException("fetchDomainSchema interface error"); - } - - public void fillToken(HttpHeaders headers) { - ThreadContext threadContext = s2ThreadContext.get(); - if (Objects.nonNull(threadContext) && Strings.isNotEmpty(threadContext.getToken())) { - if (Objects.nonNull(authenticationConfig) && Strings.isNotEmpty( - authenticationConfig.getTokenHttpHeaderKey())) { - headers.set(authenticationConfig.getTokenHttpHeaderKey(), threadContext.getToken()); - } - } else { - log.debug("threadContext is null:{}", Objects.isNull(threadContext)); - } - } - - public List getDomainListForAdmin() { - Object domainDescListObject = fetchHttpResult(semanticUrl + fetchDomainListPath, null, HttpMethod.GET); - List domainDescList = JsonUtil.toList(JsonUtil.toString(domainDescListObject), DomainResp.class); - return domainDescList; - } -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictMetaUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictMetaUtils.java index 919a7b14e..122103051 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictMetaUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictMetaUtils.java @@ -4,14 +4,12 @@ import static com.tencent.supersonic.common.constant.Constants.DAY; import static com.tencent.supersonic.common.constant.Constants.UNDERLINE; import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.application.ConfigServiceImpl; +import com.tencent.supersonic.chat.domain.pojo.config.*; +import com.tencent.supersonic.common.pojo.SchemaItem; import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; import com.tencent.supersonic.chat.domain.dataobject.DimValueDO; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; -import com.tencent.supersonic.chat.domain.pojo.config.Dim4Dict; -import com.tencent.supersonic.chat.domain.pojo.config.ItemVisibilityInfo; -import com.tencent.supersonic.chat.domain.pojo.config.KnowledgeInfo; import com.tencent.supersonic.knowledge.domain.pojo.DictUpdateMode; import com.tencent.supersonic.knowledge.domain.pojo.DimValue2DictCommand; @@ -25,6 +23,8 @@ import java.util.Set; import java.util.stream.Collectors; import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -32,13 +32,15 @@ import org.springframework.util.CollectionUtils; @Component public class DictMetaUtils { - private final DefaultSemanticInternalUtils defaultSemanticUtils; + @Autowired + private ConfigServiceImpl configService; + @Value("${model.internal.metric.suffix:internal_cnt}") private String internalMetricNameSuffix; private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - public DictMetaUtils(DefaultSemanticInternalUtils defaultSemanticUtils) { - this.defaultSemanticUtils = defaultSemanticUtils; + public DictMetaUtils() { + } @@ -128,46 +130,66 @@ public class DictMetaUtils { } private void fillDimValueDOList(List dimValueDOList, Long domainId, - Map dimIdAndDescPair) { - ChatConfigRichInfo chaConfigRichDesc = defaultSemanticUtils.getChatConfigRichInfo(domainId); - if (Objects.nonNull(chaConfigRichDesc)) { + Map dimIdAndDescPair) { + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domainId); + if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(chaConfigRichDesc.getChatAggRichConfig())) { - List defaultMetricDescList = chaConfigRichDesc.getDefaultMetrics(); + ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); + List knowledgeAggInfo = chaConfigRichDesc.getChatAggRichConfig().getKnowledgeInfos(); - List knowledgeInfos = chaConfigRichDesc.getKnowledgeInfos(); - if (!CollectionUtils.isEmpty(knowledgeInfos)) { - List dimensions = new ArrayList<>(); - knowledgeInfos.stream() - .filter(knowledgeInfo -> knowledgeInfo.getIsDictInfo() - && isVisibleDim(knowledgeInfo, chaConfigRichDesc.getVisibility())) - .forEach(knowledgeInfo -> { - if (dimIdAndDescPair.containsKey(knowledgeInfo.getItemId())) { - DimSchemaResp dimensionDesc = dimIdAndDescPair.get(knowledgeInfo.getItemId()); + List knowledgeDetailInfo = chaConfigRichDesc.getChatDetailRichConfig().getKnowledgeInfos(); - //default cnt - if (CollectionUtils.isEmpty(defaultMetricDescList)) { - String datasourceBizName = dimensionDesc.getDatasourceBizName(); - if (Strings.isNotEmpty(datasourceBizName)) { - String internalMetricName = - datasourceBizName + UNDERLINE + internalMetricNameSuffix; - defaultMetricDescList.add(new DefaultMetric(internalMetricName, 2, DAY)); - } + fillKnowledgeDimValue(knowledgeDetailInfo, chatDefaultConfig, dimValueDOList, dimIdAndDescPair, domainId); + fillKnowledgeDimValue(knowledgeAggInfo, chatDefaultConfig, dimValueDOList, dimIdAndDescPair, domainId); + + + } + } + + private void fillKnowledgeDimValue(List knowledgeInfos, ChatDefaultRichConfig chatDefaultConfig, + List dimValueDOList, Map dimIdAndDescPair, Long domainId) { + if (!CollectionUtils.isEmpty(knowledgeInfos)) { + List dimensions = new ArrayList<>(); + List defaultMetricDescList = new ArrayList<>(); + knowledgeInfos.stream() + .filter(knowledgeInfo -> knowledgeInfo.getSearchEnable() && !CollectionUtils.isEmpty(dimIdAndDescPair) + && dimIdAndDescPair.containsKey(knowledgeInfo.getItemId())) + .forEach(knowledgeInfo -> { + if (dimIdAndDescPair.containsKey(knowledgeInfo.getItemId())) { + DimSchemaResp dimensionDesc = dimIdAndDescPair.get(knowledgeInfo.getItemId()); + + //default cnt + if (Objects.isNull(chatDefaultConfig) || CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())) { + String datasourceBizName = dimensionDesc.getDatasourceBizName(); + if (Strings.isNotEmpty(datasourceBizName)) { + String internalMetricName = + datasourceBizName + UNDERLINE + internalMetricNameSuffix; + defaultMetricDescList.add(new DefaultMetric(internalMetricName, 2, DAY)); } + } else { + SchemaItem schemaItem = chatDefaultConfig.getMetrics().get(0); + defaultMetricDescList.add(new DefaultMetric(schemaItem.getBizName(), chatDefaultConfig.getUnit(), chatDefaultConfig.getPeriod())); - String bizName = dimensionDesc.getBizName(); - dimensions.add(new Dim4Dict(knowledgeInfo.getItemId(), bizName, - knowledgeInfo.getBlackList(), knowledgeInfo.getWhiteList(), - knowledgeInfo.getRuleList())); } - }); - if (!CollectionUtils.isEmpty(dimensions)) { - DimValueDO dimValueDO = new DimValueDO() - .setDomainId(domainId) - .setDefaultMetricIds(defaultMetricDescList) - .setDimensions(dimensions); - dimValueDOList.add(dimValueDO); - } + String bizName = dimensionDesc.getBizName(); + Dim4Dict dim4Dict = new Dim4Dict(); + dim4Dict.setDimId(knowledgeInfo.getItemId()); + dim4Dict.setBizName(bizName); + if(Objects.nonNull(knowledgeInfo.getKnowledgeAdvancedConfig())){ + KnowledgeAdvancedConfig knowledgeAdvancedConfig = knowledgeInfo.getKnowledgeAdvancedConfig(); + BeanUtils.copyProperties(knowledgeAdvancedConfig, dim4Dict); + } + dimensions.add(dim4Dict); + } + }); + + if (!CollectionUtils.isEmpty(dimensions)) { + DimValueDO dimValueDO = new DimValueDO() + .setDomainId(domainId) + .setDefaultMetricIds(defaultMetricDescList) + .setDimensions(dimensions); + dimValueDOList.add(dimValueDO); } } } @@ -178,4 +200,4 @@ public class DictMetaUtils { } return !itemVisibilityDesc.getBlackDimIdList().contains(knowledgeInfo.getItemId()); } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfo.java index ee35e2864..339cc608c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfo.java @@ -17,35 +17,36 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.calcite.sql.parser.SqlParseException; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@Slf4j public class DslToSemanticInfo { - public static final String SUB_TABLE = " ( select * from t_{0} where {1} >= ''{2}'' and {1} <= ''{3}'' ) as t_sub_{0}"; - private static final Logger LOG = LoggerFactory.getLogger(DslToSemanticInfo.class); + protected static final String SUB_TABLE = " ( select * from t_{0} where {1} >= ''{2}'' and {1} <= ''{3}'' ) as t_sub_{0}"; - public static String convert(SemanticParseInfo parseInfo, LLMResp llmResp) { + public String convert(SemanticParseInfo parseInfo, LLMResp llmResp, Integer domainId) throws SqlParseException { String sqlOutput = llmResp.getSqlOutput(); String domainName = llmResp.getDomainName(); - DomainInfos domainInfos = ContextUtils.getBean(WordNatureService.class).getCache().getUnchecked(""); + // 1. extra deal with,such as add alias. + sqlOutput = extraConvert(sqlOutput, domainId); SqlParserInfo sqlParseInfo = SqlParseUtils.getSqlParseInfo(sqlOutput); + String tableName = sqlParseInfo.getTableName(); + List allFields = sqlParseInfo.getAllFields(); + if (StringUtils.isEmpty(domainName)) { domainName = tableName; } - List allFields = sqlParseInfo.getAllFields(); - Map domainNameToId = domainInfos.getDomains().stream() - .collect(Collectors.toMap(ItemDO::getName, a -> a.getDomain(), (k1, k2) -> k1)); - - Integer domainId = domainNameToId.get(domainName); - LOG.info("sqlParseInfo:{} ,domainName:{},domainId:{}", sqlParseInfo, domainName, domainId); + // 2. replace the llm dsl, such as replace fieldName and tableName. + log.info("sqlParseInfo:{} ,domainName:{},domainId:{}", sqlParseInfo, domainName, domainId); + DomainInfos domainInfos = ContextUtils.getBean(WordNatureService.class).getCache().getUnchecked(""); List fieldList = domainInfos.getMetrics(); fieldList.addAll(domainInfos.getDimensions()); Map fieldToBizName = getMapInfo(domainId, fieldList); @@ -56,6 +57,7 @@ public class DslToSemanticInfo { sqlOutput = sqlOutput.replaceAll(fieldName, fieldBizName); } } + //3. deal with dayNo. DateConf dateInfo = new DateConf(); if (Objects.nonNull(parseInfo) && Objects.nonNull(parseInfo.getDateInfo())) { dateInfo = parseInfo.getDateInfo(); @@ -72,15 +74,18 @@ public class DslToSemanticInfo { TimeDimensionEnum timeDimension = TimeDimensionEnum.valueOf(period); String dayField = timeDimension.getName(); - // add dayno String subTable = MessageFormat.format(SUB_TABLE, domainId, dayField, startDate, endDate); String querySql = sqlOutput.replaceAll(tableName, subTable); - LOG.info("querySql:{},sqlOutput:{},dateInfo:{}", querySql, sqlOutput, dateInfo); + log.info("querySql:{},sqlOutput:{},dateInfo:{}", querySql, sqlOutput, dateInfo); return querySql; } - private static Map getMapInfo(Integer domainId, List metrics) { + protected String extraConvert(String sqlOutput, Integer domainId) throws SqlParseException { + return SqlParseUtils.addAliasToSql(sqlOutput); + } + + protected Map getMapInfo(Integer domainId, List metrics) { return metrics.stream().filter(entry -> entry.getDomain().equals(domainId)) .collect(Collectors.toMap(ItemDO::getName, a -> a.getBizName(), (k1, k2) -> k1)); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatConfigRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatConfigRepositoryImpl.java index 4bb9ac28d..3fd2a1e2d 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatConfigRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatConfigRepositoryImpl.java @@ -1,16 +1,16 @@ package com.tencent.supersonic.chat.infrastructure.repository; import com.tencent.supersonic.chat.domain.dataobject.ChatConfigDO; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfig; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilterInternal; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; +import com.tencent.supersonic.chat.domain.pojo.config.*; import com.tencent.supersonic.chat.domain.repository.ChatConfigRepository; import com.tencent.supersonic.chat.domain.utils.ChatConfigUtils; import com.tencent.supersonic.chat.infrastructure.mapper.ChatConfigMapper; + import java.util.ArrayList; import java.util.List; import java.util.Objects; + +import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @@ -24,7 +24,7 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { private final ChatConfigMapper chatConfigMapper; public ChatConfigRepositoryImpl(ChatConfigUtils chatConfigUtils, - ChatConfigMapper chatConfigMapper) { + ChatConfigMapper chatConfigMapper) { this.chatConfigUtils = chatConfigUtils; this.chatConfigMapper = chatConfigMapper; } @@ -32,8 +32,8 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { @Override public Long createConfig(ChatConfig chaConfig) { ChatConfigDO chaConfigDO = chatConfigUtils.chatConfig2DO(chaConfig); - - return chatConfigMapper.addConfig(chaConfigDO); + chatConfigMapper.addConfig(chaConfigDO); + return chaConfigDO.getId(); } @Override @@ -45,26 +45,23 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { } @Override - public List getChatConfig(ChatConfigFilter filter) { - List chaConfigDescriptorList = new ArrayList<>(); + public List getChatConfig(ChatConfigFilter filter) { + List chaConfigDescriptorList = new ArrayList<>(); ChatConfigFilterInternal filterInternal = new ChatConfigFilterInternal(); BeanUtils.copyProperties(filter, filterInternal); filterInternal.setStatus(filter.getStatus().getCode()); List chaConfigDOList = chatConfigMapper.search(filterInternal); if (!CollectionUtils.isEmpty(chaConfigDOList)) { chaConfigDOList.stream().forEach(chaConfigDO -> - chaConfigDescriptorList.add(chatConfigUtils.chatConfigDO2Descriptor(chaConfigDO))); + chaConfigDescriptorList.add(chatConfigUtils.chatConfigDO2Descriptor(chaConfigDO.getDomainId(), chaConfigDO))); } return chaConfigDescriptorList; } @Override - public ChatConfigInfo getConfigByDomainId(Long domainId) { + public ChatConfigResp getConfigByDomainId(Long domainId) { ChatConfigDO chaConfigPO = chatConfigMapper.fetchConfigByDomainId(domainId); - if (Objects.isNull(chaConfigPO)) { - return new ChatConfigInfo(); - } - return chatConfigUtils.chatConfigDO2Descriptor(chaConfigPO); + return chatConfigUtils.chatConfigDO2Descriptor(domainId, chaConfigPO); } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/DefaultSemanticConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/DefaultSemanticConfig.java index af86760a3..aa0715e05 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/DefaultSemanticConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/DefaultSemanticConfig.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.chat.infrastructure.semantic; import com.tencent.supersonic.chat.application.ConfigServiceImpl; -import com.tencent.supersonic.chat.domain.utils.DefaultSemanticInternalUtils; import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -24,12 +23,21 @@ public class DefaultSemanticConfig { @Value("${fetchDomainSchemaPath.path:/api/semantic/schema}") private String fetchDomainSchemaPath; - @Autowired - private DefaultSemanticInternalUtils defaultSemanticInternalUtils; + @Value("${fetchDomainList.path:/api/semantic/schema/dimension/page}") + private String fetchDimensionPagePath; + + @Value("${fetchDomainList.path:/api/semantic/schema/metric/page}") + private String fetchMetricPagePath; + + @Value("${fetchDomainList.path:/api/semantic/schema/domain/list}") + private String fetchDomainListPath; + + @Value("${fetchDomainList.path:/api/semantic/schema/domain/view/list}") + private String fetchDomainViewListPath; @Autowired private RestTemplate restTemplate; @Autowired - private ConfigServiceImpl chaConfigService; + private ConfigServiceImpl configService; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java index dc7322450..a3938e7e8 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java @@ -1,20 +1,27 @@ package com.tencent.supersonic.chat.infrastructure.semantic; +import com.github.pagehelper.PageInfo; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; +import com.tencent.supersonic.chat.domain.pojo.config.ChatAggConfig; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; +import com.tencent.supersonic.chat.domain.pojo.config.ChatDetailConfig; import com.tencent.supersonic.chat.domain.pojo.config.ItemVisibility; import com.tencent.supersonic.common.util.context.ContextUtils; +import com.tencent.supersonic.common.util.context.S2ThreadContext; +import com.tencent.supersonic.common.util.context.ThreadContext; import com.tencent.supersonic.common.util.json.JsonUtil; import com.tencent.supersonic.semantic.api.core.request.DomainSchemaFilterReq; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; +import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; +import com.tencent.supersonic.semantic.api.core.response.*; import com.tencent.supersonic.semantic.api.query.request.QuerySqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import com.tencent.supersonic.semantic.core.domain.DimensionService; +import com.tencent.supersonic.semantic.core.domain.DomainService; +import com.tencent.supersonic.semantic.core.domain.MetricService; import com.tencent.supersonic.semantic.query.domain.SchemaService; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -30,8 +37,21 @@ public class LocalSemanticLayerImpl implements SemanticLayer { private static final Cache> domainSchemaCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); + private SchemaService schemaService; + private S2ThreadContext s2ThreadContext; + + private DomainService domainService; + + private DimensionService dimensionService; + + private MetricService metricService; + +// public LocalSemanticLayerImpl(DomainService domainService){ +// this.domainService=domainService; +// } + @Override public QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user) { deletionDuplicated(queryStructReq); @@ -60,6 +80,7 @@ public class LocalSemanticLayerImpl implements SemanticLayer { return null; } + public List fetchDomainSchemaAll(List ids) { DomainSchemaFilterReq filter = new DomainSchemaFilterReq(); @@ -71,23 +92,23 @@ public class LocalSemanticLayerImpl implements SemanticLayer { @SneakyThrows - public List fetchDomainSchema(List ids) { -// return domainSchemaCache.get(String.valueOf(ids), () -> { -// List data = fetchDomainSchemaAll(ids); -// fillEntityNameAndFilterBlackElement(data); -// return data; -// }); - + public List fetchDomainSchema(List ids, Boolean cacheEnable) { + if (cacheEnable) { + return domainSchemaCache.get(String.valueOf(ids), () -> { + List data = fetchDomainSchemaAll(ids); + fillEntityNameAndFilterBlackElement(data); + return data; + }); + } List data = fetchDomainSchemaAll(ids); fillEntityNameAndFilterBlackElement(data); return data; } - @Override - public DomainSchemaResp getDomainSchemaInfo(Long domain) { + public DomainSchemaResp getDomainSchemaInfo(Long domain, Boolean cacheEnable) { List ids = new ArrayList<>(); ids.add(domain); - List domainSchemaResps = fetchDomainSchema(ids); + List domainSchemaResps = fetchDomainSchema(ids, cacheEnable); if (!CollectionUtils.isEmpty(domainSchemaResps)) { Optional domainSchemaResp = domainSchemaResps.stream() .filter(d -> d.getId().equals(domain)).findFirst(); @@ -101,21 +122,21 @@ public class LocalSemanticLayerImpl implements SemanticLayer { @Override public List getDomainSchemaInfo(List ids) { - return fetchDomainSchema(ids); + return fetchDomainSchema(ids, true); } public DomainSchemaResp fillEntityNameAndFilterBlackElement(DomainSchemaResp domainSchemaResp) { if (Objects.isNull(domainSchemaResp) || Objects.isNull(domainSchemaResp.getId())) { return domainSchemaResp; } - ChatConfigInfo chaConfigInfo = getConfigBaseInfo(domainSchemaResp.getId()); + ChatConfigResp chatConfigResp = getConfigBaseInfo(domainSchemaResp.getId()); // fill entity names - fillEntityNamesInfo(domainSchemaResp, chaConfigInfo); + fillEntityNamesInfo(domainSchemaResp, chatConfigResp); // filter black element - filterBlackDim(domainSchemaResp, chaConfigInfo); - filterBlackMetric(domainSchemaResp, chaConfigInfo); + filterBlackDim(domainSchemaResp, chatConfigResp); + filterBlackMetric(domainSchemaResp, chatConfigResp); return domainSchemaResp; } @@ -126,9 +147,9 @@ public class LocalSemanticLayerImpl implements SemanticLayer { } } - private void filterBlackMetric(DomainSchemaResp domainSchemaResp, ChatConfigInfo chaConfigInfo) { - ItemVisibility visibility = chaConfigInfo.getVisibility(); - if (Objects.nonNull(chaConfigInfo) && Objects.nonNull(visibility) + private void filterBlackMetric(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigResp) { + ItemVisibility visibility = generateFinalVisibility(chatConfigResp); + if (Objects.nonNull(chatConfigResp) && Objects.nonNull(visibility) && !CollectionUtils.isEmpty(visibility.getBlackMetricIdList()) && !CollectionUtils.isEmpty(domainSchemaResp.getMetrics())) { List metric4Chat = domainSchemaResp.getMetrics().stream() @@ -138,9 +159,32 @@ public class LocalSemanticLayerImpl implements SemanticLayer { } } - private void filterBlackDim(DomainSchemaResp domainSchemaResp, ChatConfigInfo chatConfigInfo) { - ItemVisibility visibility = chatConfigInfo.getVisibility(); - if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(visibility) + private ItemVisibility generateFinalVisibility(ChatConfigResp chatConfigInfo) { + ItemVisibility visibility = new ItemVisibility(); + + ChatAggConfig chatAggConfig = chatConfigInfo.getChatAggConfig(); + ChatDetailConfig chatDetailConfig = chatConfigInfo.getChatDetailConfig(); + + // both black is exist + if (Objects.nonNull(chatAggConfig) && Objects.nonNull(chatAggConfig.getVisibility()) + && Objects.nonNull(chatDetailConfig) && Objects.nonNull(chatDetailConfig.getVisibility())) { + List blackDimIdList = new ArrayList<>(); + blackDimIdList.addAll(chatAggConfig.getVisibility().getBlackDimIdList()); + blackDimIdList.retainAll(chatDetailConfig.getVisibility().getBlackDimIdList()); + List blackMetricIdList = new ArrayList<>(); + + blackMetricIdList.addAll(chatAggConfig.getVisibility().getBlackMetricIdList()); + blackMetricIdList.retainAll(chatDetailConfig.getVisibility().getBlackMetricIdList()); + + visibility.setBlackDimIdList(blackDimIdList); + visibility.setBlackMetricIdList(blackMetricIdList); + } + return visibility; + } + + private void filterBlackDim(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigResp) { + ItemVisibility visibility = generateFinalVisibility(chatConfigResp); + if (Objects.nonNull(chatConfigResp) && Objects.nonNull(visibility) && !CollectionUtils.isEmpty(visibility.getBlackDimIdList()) && !CollectionUtils.isEmpty(domainSchemaResp.getDimensions())) { List dim4Chat = domainSchemaResp.getDimensions().stream() @@ -150,10 +194,11 @@ public class LocalSemanticLayerImpl implements SemanticLayer { } } - private void fillEntityNamesInfo(DomainSchemaResp domainSchemaResp, ChatConfigInfo chatConfigInfo) { - if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(chatConfigInfo.getEntity()) - && !CollectionUtils.isEmpty(chatConfigInfo.getEntity().getNames())) { - domainSchemaResp.setEntityNames(chatConfigInfo.getEntity().getNames()); + private void fillEntityNamesInfo(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigResp) { + if (Objects.nonNull(chatConfigResp) && Objects.nonNull(chatConfigResp.getChatDetailConfig()) + && Objects.nonNull(chatConfigResp.getChatDetailConfig().getEntity()) + && !CollectionUtils.isEmpty(chatConfigResp.getChatDetailConfig().getEntity().getNames())) { + domainSchemaResp.setEntityNames(chatConfigResp.getChatDetailConfig().getEntity().getNames()); } } @@ -173,9 +218,37 @@ public class LocalSemanticLayerImpl implements SemanticLayer { } } - public ChatConfigInfo getConfigBaseInfo(Long domain) { + public ChatConfigResp getConfigBaseInfo(Long domain) { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - return defaultSemanticConfig.getChaConfigService().fetchConfigByDomainId(domain); + return defaultSemanticConfig.getConfigService().fetchConfigByDomainId(domain); + } + + @Override + public List getDomainListForViewer() { + s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); + ThreadContext threadContext = s2ThreadContext.get(); + domainService = ContextUtils.getBean(DomainService.class); + return domainService.getDomainListForViewer(threadContext.getUserName()); + } + + @Override + public List getDomainListForAdmin() { + domainService = ContextUtils.getBean(DomainService.class); + s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); + ThreadContext threadContext = s2ThreadContext.get(); + return domainService.getDomainListForAdmin(threadContext.getUserName()); + } + + @Override + public PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd) { + dimensionService = ContextUtils.getBean(DimensionService.class); + return dimensionService.queryDimension(pageDimensionCmd); + } + + @Override + public PageInfo queryMetricPage(PageMetricReq pageMetricCmd) { + metricService = ContextUtils.getBean(MetricService.class); + return metricService.queryMetric(pageMetricCmd); } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java index c7b0a687c..084138e76 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java @@ -1,39 +1,40 @@ package com.tencent.supersonic.chat.infrastructure.semantic; -import static com.tencent.supersonic.common.constant.Constants.TRUE_LOWER; - import com.alibaba.fastjson.JSON; +import com.github.pagehelper.PageInfo; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.gson.Gson; +import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; import com.tencent.supersonic.auth.api.authentication.constant.UserConstants; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.application.ConfigServiceImpl; +import com.tencent.supersonic.chat.domain.pojo.config.*; import com.tencent.supersonic.common.util.context.ContextUtils; +import com.tencent.supersonic.common.util.context.S2ThreadContext; +import com.tencent.supersonic.common.util.context.ThreadContext; +import com.tencent.supersonic.common.util.json.JsonUtil; import com.tencent.supersonic.semantic.api.core.request.DomainSchemaFilterReq; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; +import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; +import com.tencent.supersonic.semantic.api.core.response.*; import com.tencent.supersonic.semantic.api.query.request.QuerySqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ItemVisibility; -import com.tencent.supersonic.chat.domain.utils.DefaultSemanticInternalUtils; import com.tencent.supersonic.common.exception.CommonException; import com.tencent.supersonic.common.result.ResultData; import com.tencent.supersonic.common.result.ReturnCode; + import java.net.URI; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; + import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -41,11 +42,27 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import static com.tencent.supersonic.common.constant.Constants.*; +import static com.tencent.supersonic.common.constant.Constants.PAGESIZE_LOWER; + @Slf4j public class RemoteSemanticLayerImpl implements SemanticLayer { + + private RestTemplate restTemplate; + + @Autowired + private ConfigServiceImpl configService; + + @Autowired + private S2ThreadContext s2ThreadContext; + + @Autowired + private AuthenticationConfig authenticationConfig; + private static final Cache> domainSchemaCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); private ParameterizedTypeReference> structTypeRef = @@ -70,11 +87,9 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } public QueryResultWithSchemaResp searchByRestTemplate(String url, String jsonReq) { - DefaultSemanticInternalUtils defaultSemanticInternalUtils = ContextUtils.getBean( - DefaultSemanticInternalUtils.class); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - defaultSemanticInternalUtils.fillToken(headers); + fillToken(headers); URI requestUrl = UriComponentsBuilder.fromHttpUrl(url).build().encode().toUri(); HttpEntity entity = new HttpEntity<>(jsonReq, headers); log.info("url:{},searchByRestTemplate:{}", url, entity.getBody()); @@ -102,12 +117,10 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } public List fetchDomainSchemaAll(List ids) { - DefaultSemanticInternalUtils defaultSemanticInternalUtils = ContextUtils.getBean( - DefaultSemanticInternalUtils.class); HttpHeaders headers = new HttpHeaders(); headers.set(UserConstants.INTERNAL, TRUE_LOWER); headers.setContentType(MediaType.APPLICATION_JSON); - defaultSemanticInternalUtils.fillToken(headers); + fillToken(headers); DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); URI requestUrl = UriComponentsBuilder.fromHttpUrl( @@ -139,19 +152,24 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { @SneakyThrows - public List fetchDomainSchema(List ids) { - return domainSchemaCache.get(String.valueOf(ids), () -> { - List data = fetchDomainSchemaAll(ids); - fillEntityNameAndFilterBlackElement(data); - return data; - }); + public List fetchDomainSchema(List ids, Boolean cacheEnable) { + if (cacheEnable) { + return domainSchemaCache.get(String.valueOf(ids), () -> { + List data = fetchDomainSchemaAll(ids); + fillEntityNameAndFilterBlackElement(data); + return data; + }); + } + List data = fetchDomainSchemaAll(ids); + fillEntityNameAndFilterBlackElement(data); + return data; } @Override - public DomainSchemaResp getDomainSchemaInfo(Long domain) { + public DomainSchemaResp getDomainSchemaInfo(Long domain, Boolean cacheEnable) { List ids = new ArrayList<>(); ids.add(domain); - List domainSchemaResps = fetchDomainSchema(ids); + List domainSchemaResps = fetchDomainSchema(ids, cacheEnable); if (!CollectionUtils.isEmpty(domainSchemaResps)) { Optional domainSchemaResp = domainSchemaResps.stream() .filter(d -> d.getId().equals(domain)).findFirst(); @@ -165,21 +183,21 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { @Override public List getDomainSchemaInfo(List ids) { - return fetchDomainSchema(ids); + return fetchDomainSchema(ids, true); } public DomainSchemaResp fillEntityNameAndFilterBlackElement(DomainSchemaResp domainSchemaResp) { if (Objects.isNull(domainSchemaResp) || Objects.isNull(domainSchemaResp.getId())) { return domainSchemaResp; } - ChatConfigInfo chaConfigInfo = getConfigBaseInfo(domainSchemaResp.getId()); - + ChatConfigResp chaConfigInfo = getConfigBaseInfo(domainSchemaResp.getId()); // fill entity names fillEntityNamesInfo(domainSchemaResp, chaConfigInfo); // filter black element filterBlackDim(domainSchemaResp, chaConfigInfo); filterBlackMetric(domainSchemaResp, chaConfigInfo); + return domainSchemaResp; } @@ -190,8 +208,9 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } } - private void filterBlackMetric(DomainSchemaResp domainSchemaResp, ChatConfigInfo chaConfigInfo) { - ItemVisibility visibility = chaConfigInfo.getVisibility(); + private void filterBlackMetric(DomainSchemaResp domainSchemaResp, ChatConfigResp chaConfigInfo) { + + ItemVisibility visibility = generateFinalVisibility(chaConfigInfo); if (Objects.nonNull(chaConfigInfo) && Objects.nonNull(visibility) && !CollectionUtils.isEmpty(visibility.getBlackMetricIdList()) && !CollectionUtils.isEmpty(domainSchemaResp.getMetrics())) { @@ -202,8 +221,31 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } } - private void filterBlackDim(DomainSchemaResp domainSchemaResp, ChatConfigInfo chatConfigInfo) { - ItemVisibility visibility = chatConfigInfo.getVisibility(); + private ItemVisibility generateFinalVisibility(ChatConfigResp chatConfigInfo) { + ItemVisibility visibility = new ItemVisibility(); + + ChatAggConfig chatAggConfig = chatConfigInfo.getChatAggConfig(); + ChatDetailConfig chatDetailConfig = chatConfigInfo.getChatDetailConfig(); + + // both black is exist + if (Objects.nonNull(chatAggConfig) && Objects.nonNull(chatAggConfig.getVisibility()) + && Objects.nonNull(chatDetailConfig) && Objects.nonNull(chatDetailConfig.getVisibility())) { + List blackDimIdList = new ArrayList<>(); + blackDimIdList.addAll(chatAggConfig.getVisibility().getBlackDimIdList()); + blackDimIdList.retainAll(chatDetailConfig.getVisibility().getBlackDimIdList()); + List blackMetricIdList = new ArrayList<>(); + + blackMetricIdList.addAll(chatAggConfig.getVisibility().getBlackMetricIdList()); + blackMetricIdList.retainAll(chatDetailConfig.getVisibility().getBlackMetricIdList()); + + visibility.setBlackDimIdList(blackDimIdList); + visibility.setBlackMetricIdList(blackMetricIdList); + } + return visibility; + } + + private void filterBlackDim(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigInfo) { + ItemVisibility visibility = generateFinalVisibility(chatConfigInfo); if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(visibility) && !CollectionUtils.isEmpty(visibility.getBlackDimIdList()) && !CollectionUtils.isEmpty(domainSchemaResp.getDimensions())) { @@ -214,10 +256,11 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } } - private void fillEntityNamesInfo(DomainSchemaResp domainSchemaResp, ChatConfigInfo chatConfigInfo) { - if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(chatConfigInfo.getEntity()) - && !CollectionUtils.isEmpty(chatConfigInfo.getEntity().getNames())) { - domainSchemaResp.setEntityNames(chatConfigInfo.getEntity().getNames()); + private void fillEntityNamesInfo(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigInfo) { + if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(chatConfigInfo.getChatDetailConfig()) + && Objects.nonNull(chatConfigInfo.getChatDetailConfig().getEntity()) + && !CollectionUtils.isEmpty(chatConfigInfo.getChatDetailConfig().getEntity().getNames())) { + domainSchemaResp.setEntityNames(chatConfigInfo.getChatDetailConfig().getEntity().getNames()); } } @@ -237,9 +280,102 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } } - public ChatConfigInfo getConfigBaseInfo(Long domain) { + public ChatConfigResp getConfigBaseInfo(Long domain) { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - return defaultSemanticConfig.getChaConfigService().fetchConfigByDomainId(domain); + return defaultSemanticConfig.getConfigService().fetchConfigByDomainId(domain); + } + + @Override + public List getDomainListForViewer() { + DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); + Object domainDescListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainViewListPath(), null, HttpMethod.GET); + List domainDescList = JsonUtil.toList(JsonUtil.toString(domainDescListObject), DomainResp.class); + return domainDescList; + } + + @Override + public List getDomainListForAdmin() { + DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); + Object domainDescListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainListPath(), null, HttpMethod.GET); + List domainDescList = JsonUtil.toList(JsonUtil.toString(domainDescListObject), DomainResp.class); + return domainDescList; + } + + public Object fetchHttpResult(String url, String bodyJson, HttpMethod httpMethod) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + fillToken(headers); + URI requestUrl = UriComponentsBuilder.fromHttpUrl(url).build().encode().toUri(); + ParameterizedTypeReference> responseTypeRef = + new ParameterizedTypeReference>() { + }; + HttpEntity entity = new HttpEntity<>(JsonUtil.toString(bodyJson), headers); + try { + restTemplate = ContextUtils.getBean(RestTemplate.class); + ResponseEntity> responseEntity = restTemplate.exchange(requestUrl, + httpMethod, entity, responseTypeRef); + ResultData responseBody = responseEntity.getBody(); + log.debug("ApiResponse responseBody:{}", responseBody); + if (ReturnCode.SUCCESS.getCode() == responseBody.getCode()) { + Object data = responseBody.getData(); + return data; + } + } catch (Exception e) { + throw new RuntimeException("fetchDomainSchema interface error", e); + } + throw new RuntimeException("fetchDomainSchema interface error"); + } + + public void fillToken(HttpHeaders headers) { + s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); + authenticationConfig = ContextUtils.getBean(AuthenticationConfig.class); + ThreadContext threadContext = s2ThreadContext.get(); + if (Objects.nonNull(threadContext) && Strings.isNotEmpty(threadContext.getToken())) { + if (Objects.nonNull(authenticationConfig) && Strings.isNotEmpty( + authenticationConfig.getTokenHttpHeaderKey())) { + headers.set(authenticationConfig.getTokenHttpHeaderKey(), threadContext.getToken()); + } + } else { + log.debug("threadContext is null:{}", Objects.isNull(threadContext)); + } + } + + @Override + public PageInfo queryMetricPage(PageMetricReq pageMetricCmd) { + String body = JsonUtil.toString(pageMetricCmd); + DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); + log.info("url:{}", defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath()); + Object dimensionListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath(), body, HttpMethod.POST); + LinkedHashMap map = (LinkedHashMap) dimensionListObject; + PageInfo metricDescObjectPageInfo = generatePageInfo(map); + PageInfo metricDescPageInfo = new PageInfo<>(); + BeanUtils.copyProperties(metricDescObjectPageInfo, metricDescPageInfo); + metricDescPageInfo.setList(metricDescPageInfo.getList()); + return metricDescPageInfo; + } + + @Override + public PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd) { + String body = JsonUtil.toString(pageDimensionCmd); + DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); + Object dimensionListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDimensionPagePath(), body, HttpMethod.POST); + LinkedHashMap map = (LinkedHashMap) dimensionListObject; + PageInfo dimensionDescObjectPageInfo = generatePageInfo(map); + PageInfo dimensionDescPageInfo = new PageInfo<>(); + BeanUtils.copyProperties(dimensionDescObjectPageInfo, dimensionDescPageInfo); + dimensionDescPageInfo.setList(dimensionDescPageInfo.getList()); + return dimensionDescPageInfo; + } + + private PageInfo generatePageInfo(LinkedHashMap map) { + PageInfo pageInfo = new PageInfo<>(); + pageInfo.setList((List) map.get(LIST_LOWER)); + Integer total = (Integer) map.get(TOTAL_LOWER); + pageInfo.setTotal(total); + Integer pageSize = (Integer) map.get(PAGESIZE_LOWER); + pageInfo.setPageSize(pageSize); + pageInfo.setPages((int) Math.ceil((double) total / pageSize)); + return pageInfo; } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java index a3e568857..07658f701 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java @@ -3,18 +3,19 @@ package com.tencent.supersonic.chat.rest; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.domain.utils.ComponentFactory; import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; import com.tencent.supersonic.semantic.api.core.response.DimensionResp; import com.tencent.supersonic.semantic.api.core.response.DomainResp; import com.tencent.supersonic.semantic.api.core.response.MetricResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBase; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReq; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBaseReq; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReqReq; import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; import com.tencent.supersonic.chat.domain.service.ConfigService; -import com.tencent.supersonic.chat.domain.utils.DefaultSemanticInternalUtils; import java.util.List; import javax.servlet.http.HttpServletRequest; @@ -37,43 +38,43 @@ public class ChatConfigController { @Autowired private ConfigService configService; - @Autowired - private DefaultSemanticInternalUtils defaultSemanticUtils; + + private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); @PostMapping - public Long addChatConfig(@RequestBody ChatConfigBase extendBaseCmd, - HttpServletRequest request, - HttpServletResponse response) { + public Long addChatConfig(@RequestBody ChatConfigBaseReq extendBaseCmd, + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return configService.addConfig(extendBaseCmd, user); } @PutMapping - public Long editDomainExtend(@RequestBody ChatConfigEditReq extendEditCmd, - HttpServletRequest request, - HttpServletResponse response) { + public Long editDomainExtend(@RequestBody ChatConfigEditReqReq extendEditCmd, + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return configService.editConfig(extendEditCmd, user); } @PostMapping("/search") - public List search(@RequestBody ChatConfigFilter filter, - HttpServletRequest request, - HttpServletResponse response) { + public List search(@RequestBody ChatConfigFilter filter, + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return configService.search(filter, user); } @GetMapping("/richDesc/{domainId}") - public ChatConfigRichInfo getDomainExtendRichInfo(@PathVariable("domainId") Long domainId) { + public ChatConfigRichResp getDomainExtendRichInfo(@PathVariable("domainId") Long domainId) { return configService.getConfigRichInfo(domainId); } @GetMapping("/richDesc/all") - public List getAllChatRichConfig() { + public List getAllChatRichConfig() { return configService.getAllChatRichConfig(); } @@ -85,23 +86,29 @@ public class ChatConfigController { */ @GetMapping("/domainList") public List getDomainList() { - return defaultSemanticUtils.getDomainListForAdmin(); + + return semanticLayer.getDomainListForAdmin(); + //return defaultSemanticUtils.getDomainListForAdmin(); + } + + @GetMapping("/domainList/view") + public List getDomainListForViewer() { + return semanticLayer.getDomainListForViewer(); + //return defaultSemanticUtils.getDomainListForViewer(); } @PostMapping("/dimension/page") public PageInfo queryDimension(@RequestBody PageDimensionReq pageDimensionCmd, HttpServletRequest request, HttpServletResponse response) { - User user = UserHolder.findUser(request, response); - return defaultSemanticUtils.queryDimensionPage(pageDimensionCmd, user); + return semanticLayer.queryDimensionPage(pageDimensionCmd); } @PostMapping("/metric/page") public PageInfo queryMetric(@RequestBody PageMetricReq pageMetrricCmd, HttpServletRequest request, HttpServletResponse response) { - User user = UserHolder.findUser(request, response); - return defaultSemanticUtils.queryMetricPage(pageMetrricCmd, user); + return semanticLayer.queryMetricPage(pageMetrricCmd); } diff --git a/chat/core/src/main/python/bin/env.sh b/chat/core/src/main/python/bin/env.sh new file mode 100644 index 000000000..271d50b30 --- /dev/null +++ b/chat/core/src/main/python/bin/env.sh @@ -0,0 +1,10 @@ +# python path +export python_path="/usr/local/bin/python3.9" +# pip path +export pip_path="/usr/local/bin/pip3.9" +# host +export llm_host="127.0.0.1" +# port +export llm_port=9092 +# start name +export start_name=api_service \ No newline at end of file diff --git a/chat/core/src/main/python/bin/install.sh b/chat/core/src/main/python/bin/install.sh new file mode 100755 index 000000000..df8800a19 --- /dev/null +++ b/chat/core/src/main/python/bin/install.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +binDir=$(cd "$(dirname "$0")"; pwd) +baseDir=$(readlink -f $binDir/../) +echo $binDir + +source ${binDir}/env.sh + +${pip_path} install -r $baseDir/requirements.txt + +if ${python_path} -c "import langchain,fastapi,chromadb,tiktoken,uvicorn" >/dev/null 2>&1 +then + echo "install ok, will pass" +else + if [ $? -eq 0 ]; then + echo "install ok" + else + echo "install fail ,pls check your install error log. cmd is : " + echo ${pip_path} install -r $baseDir/requirements.txt + exit 1 + fi +fi \ No newline at end of file diff --git a/chat/core/src/main/python/bin/run.sh b/chat/core/src/main/python/bin/run.sh new file mode 100755 index 000000000..8ed1a9d90 --- /dev/null +++ b/chat/core/src/main/python/bin/run.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +llm_host=$1 +llm_port=$2 + +binDir=$(cd "$(dirname "$0")"; pwd) +baseDir=$(readlink -f $binDir/../) + +source ${baseDir}/bin/env.sh + +if [ "${llm_host}" = "" ] || [ "${llm_port}" = "" ] +then + echo "llm_host llm_port is not set" + exit 1 +fi + + +if [ "${python_path}" = "" ] || [ "${pip_path}" = "" ] +then + echo "please set env value python_path , pip_path to python, pip path by export cmd " + exit 1 +fi + +chmod +x $binDir/install.sh +$binDir/install.sh +if [ $? -ne 0 ]; then + exit 1 +fi + +cd $baseDir/llm +nohup ${python_path} -m uvicorn ${start_name}:app --port ${llm_port} --host ${llm_host} > $baseDir/llm.log 2>&1 & \ No newline at end of file diff --git a/chat/core/src/main/python/bin/service.sh b/chat/core/src/main/python/bin/service.sh new file mode 100755 index 000000000..bd3ae8e0a --- /dev/null +++ b/chat/core/src/main/python/bin/service.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +binDir=$(cd "$(dirname "$0")"; pwd) +baseDir=$(readlink -f $binDir/../) +source ${baseDir}/bin/env.sh + +command=$1 + +function start() +{ + pid=$(ps aux |grep ${start_name} | grep -v grep ) + if [[ "$pid" == "" ]]; then + $baseDir/bin/run.sh && echo "Process started." + return 0 + else + echo "Process (PID = $pid) is running." + return 1 + fi +} + +function stop() +{ + pid=$(ps aux | grep ${start_name} | grep -v grep | awk '{print $2}') + if [[ "$pid" == "" ]]; then + echo "Process is not running !" + return 1 + else + kill -9 $pid + echo "Process (PID = $pid) is killed !" + return 0 + fi +} + +case "$command" in + start) + echo -e "Starting ${start_name}" + start + ;; + stop) + echo -e "Stopping ${start_name}" + stop + ;; + restart) + echo -e "Resetting ${start_name}E" + stop + start + ;; + *) + echo "Use command {start|stop|status|restart} to run." + exit 1 +esac + +exit 0 diff --git a/chat/core/src/main/python/llm/api_service.py b/chat/core/src/main/python/llm/api_service.py new file mode 100644 index 000000000..ebe131084 --- /dev/null +++ b/chat/core/src/main/python/llm/api_service.py @@ -0,0 +1,33 @@ +# -*- coding:utf-8 -*- +import os +import logging +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from typing import Any, Mapping + +from fastapi import FastAPI, HTTPException + +from sql.run import query2sql + +app = FastAPI() + + +@app.post("/query2sql/") +async def din_query2sql(query_body: Mapping[str, Any]): + if 'queryText' not in query_body: + raise HTTPException(status_code=400, + detail="query_text is not in query_body") + else: + query_text = query_body['queryText'] + + if 'schema' not in query_body: + raise HTTPException(status_code=400, detail="schema is not in query_body") + else: + schema = query_body['schema'] + + resp = query2sql(query_text=query_text, schema=schema) + + return resp diff --git a/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py b/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py new file mode 100644 index 000000000..ec71dea89 --- /dev/null +++ b/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py @@ -0,0 +1,147 @@ +examplars = [ + { + "table_name": "内容库产品", + "fields_list": """["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长"]""", + "question": "比较jerryjzhang和lexluo在内容库的访问次数", + "analysis": """让我们一步一步地思考。在问题“比较jerryjzhang和lexluo在内容库的访问次数“中,我们被问: +“比较jerryjzhang和lexluo”,所以我们需要column=[用户名] +”内容库的访问次数“,所以我们需要column=[访问次数] +基于table和columns,可能的cell values 是 = ['jerryjzhang', 'lexluo']。""", + "schema_links": """["用户名", "访问次数", "'jerryjzhang'", "'lexluo'"]""", + "sql": """select 用户名, 访问次数 from 内容库产品 where 用户名 in ('jerryjzhang', 'lexluo')""" + }, + { + "table_name": "内容库产品", + "fields_list": """["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长"]""", + "question": "内容库近12个月访问人数 按部门", + "analysis": """让我们一步一步地思考。在问题“内容库近12个月访问人数 按部门“中,我们被问: +“内容库近12个月访问人数”,所以我们需要column=[访问人数] +”按部门“,所以我们需要column=[部门] +基于table和columns,可能的cell values 是 = []。""", + "schema_links": """["访问人数", "部门"]""", + "sql": """select 部门, sum(访问人数) from 内容库产品 where 部门 group by 部门""" + }, + { + "table_name": "内容库产品", + "fields_list": """["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长"]""", + "question": "内容库内容合作部、生态业务部的访问时长", + "analysis": """让我们一步一步地思考。在问题“内容库内容合作部、生态业务部的访问时长“中,我们被问: +“访问时长”,所以我们需要column=[访问时长] +”内容库内容合作部、生态业务部“,所以我们需要column=[部门] +基于table和columns,可能的cell values 是 = ['内容合作部', '生态业务部']。""", + "schema_links": """["访问时长", "部门", "'内容合作部'", "'生态业务部'"]""", + "sql": """select 部门, 访问时长 from 内容库产品 where 部门 in ('内容合作部', '生态业务部')""" + }, + { + "table_name": "优选", + "fields_list": """['优选版权归属系', '付费模式', '结算播放份额', '付费用户结算播放份额']""", + "question": "近3天阔景系TME结算播放份额", + "analysis": """让我们一步一步地思考。在问题“近3天阔景系TME结算播放份额“中,我们被问: +“TME结算播放份额”,所以我们需要column=[结算播放份额] +”阔景系“,所以我们需要column=[优选版权归属系] +基于table和columns,可能的cell values 是 = ['阔景系']。""", + "schema_links": """["结算播放份额", "优选版权归属系", "'阔景系'"]""", + "sql": """select 优选版权归属系, 结算播放份额 from 优选 where 优选版权归属系 in ('阔景系')""" + }, + { + "table_name": "歌曲库", + "fields_list": """['是否音乐人歌曲', 'Q音歌曲ID', 'Q音歌曲MID', '歌曲名', '歌曲版本', '歌曲类型', '翻唱类型', 'TME歌曲ID', '是否优选窄口径歌曲', '是否优选宽口径歌曲', '结算播放量', '运营播放量', '付费用户结算播放量', '历史累计结算播放量', '运营搜播量', '结算搜播量', '运营完播量', '运营推播量', '近7日复播率', '日均搜播量']""", + "question": "对比近3天翻唱版和纯音乐的歌曲播放量", + "analysis": """让我们一步一步地思考。在问题“对比近3天翻唱版和纯音乐的歌曲播放量“中,我们被问: +“歌曲播放量”,所以我们需要column=[结算播放量] +”翻唱版和纯音乐的歌曲“,所以我们需要column=[歌曲类型] +基于table和columns,可能的cell values 是 = ['翻唱版', '纯音乐']。""", + "schema_links": """["结算播放量", "歌曲类型", "'翻唱版'", "'纯音乐'"]""", + "sql": """select 歌曲类型, 结算播放量 from 歌曲库 where 歌曲类型 in ('翻唱版', '纯音乐')""" + }, + { + "table_name": "艺人库", + "fields_list": """['上下架状态', '歌手名', '歌手等级', '歌手类型', '歌手来源', 'TME音乐人等级', '活跃区域', '年龄', '歌手才能', '歌手风格', '粉丝数', '抖音粉丝数', '网易粉丝数', '微博粉丝数', '网易歌曲数', '在架歌曲数', '网易分享数', '独占歌曲数', '网易在架歌曲评论数', '有播放量歌曲数']""", + "question": "对比一下陈卓璇、孟美岐、赖美云的粉丝数", + "analysis": """让我们一步一步地思考。在问题“对比一下陈卓璇、孟美岐、赖美云的粉丝数“中,我们被问: +“粉丝数”,所以我们需要column=[粉丝数] +”陈卓璇、孟美岐、赖美云“,所以我们需要column=[歌手名] +基于table和columns,可能的cell values 是 = ['陈卓璇', '孟美岐', '赖美云']。""", + "schema_links": """["粉丝数", "歌手名", "'陈卓璇'", "'孟美岐'", "'赖美云'"]""", + "sql": """select 歌手名, 粉丝数 from 艺人库 where 歌手名 in ('陈卓璇', '孟美岐', '赖美云')""" + }, + { + "table_name": "歌曲库", + "fields_list": """['歌曲名', '歌曲版本', '歌曲类型', 'TME歌曲ID', '是否优选窄口径歌曲', '是否优选宽口径歌曲', '是否音乐人歌曲', '网易歌曲ID', 'Q音歌曲ID', 'Q音歌曲MID', '结算播放量', '运营播放量', '分享量', '收藏量', '运营搜播量', '结算搜播量', '拉新用户数', '拉活用户数', '分享率', '结算播放份额']""", + "question": "播放量大于1万的歌曲有多少", + "analysis": """让我们一步一步地思考。在问题“播放量大于1万的歌曲有多少“中,我们被问: +“歌曲有多少”,所以我们需要column=[歌曲名] +”播放量大于1万的“,所以我们需要column=[结算播放量] +基于table和columns,可能的cell values 是 = [10000]。""", + "schema_links": """["歌曲名", "结算播放量", 10000]""", + "sql": """select 歌曲名 from 歌曲库 where 结算播放量 > 10000""" + }, + { + "table_name": "内容库产品", + "fields_list": """['用户名', '部门', '模块', '访问时长', '访问次数', '访问人数']""", + "question": "内容库访问时长小于1小时,且来自内容合作部的用户是哪些", + "analysis": """让我们一步一步地思考。在问题“内容库访问时长小于1小时,且来自内容合作部的用户是哪些“中,我们被问: +“用户是哪些”,所以我们需要column=[用户名] +”内容合作部的“,所以我们需要column=[部门] +”访问时长小于1小时“,所以我们需要column=[访问时长] +基于table和columns,可能的cell values 是 = ['内容合作部', 1]。""", + "schema_links": """["用户名", "部门", "访问时长", "'内容合作部'", 1]""", + "sql": """select 用户名 from 内容库产品 where 部门 = '内容合作部' and 访问时长 < 1""" + }, + { + "table_name": "内容库产品", + "fields_list": """['用户名', '部门', '模块', '访问次数', '访问人数', '访问时长']""", + "question": "内容库pv最高的用户有哪些", + "analysis": """让我们一步一步地思考。在问题“内容库pv最高的用户有哪些“中,我们被问: +“用户有哪些”,所以我们需要column=[用户名] +”pv最高的“,所以我们需要column=[访问次数] +基于table和columns,可能的cell values 是 = []。""", + "schema_links": """["用户名", "访问次数"]""", + "sql": """select 用户名 from 内容库产品 order by 访问次数 desc limit 10""" + }, + { + "table_name": "艺人库", + "fields_list": """['播放量层级', '播放量单调性', '播放量方差', '播放量突增类型', '播放量集中度', '歌手名', '歌手等级', '歌手类型', '歌手来源', 'TME音乐人等级', '结算播放量', '运营播放量', '历史累计结算播放量', '有播放量歌曲数', '历史累计运营播放量', '付费用户结算播放量', '结算播放量占比', '运营播放份额', '免费用户结算播放占比', '完播量']""", + "question": "近90天袁娅维播放量平均值是多少", + "analysis": """让我们一步一步地思考。在问题“近90天袁娅维播放量平均值是多少“中,我们被问: +“播放量平均值是多少”,所以我们需要column=[结算播放量] +”袁娅维“,所以我们需要column=[歌手名] +基于table和columns,可能的cell values 是 = ['袁娅维']。""", + "schema_links": """["结算播放量", "歌手名", "'袁娅维'"]""", + "sql": """select avg(结算播放量) from 艺人库 where 歌手名 = '袁娅维'""" + }, + { + "table_name": "艺人库", + "fields_list": """['播放量层级', '播放量单调性', '播放量方差', '播放量突增类型', '播放量集中度', '歌手名', '歌手等级', '歌手类型', '歌手来源', 'TME音乐人等级', '结算播放量', '历史累计结算播放量', '付费用户结算播放量', '结算播放量占比', '免费用户结算播放占比', '付费用户结算播放占比', '付费用户结算播放占比', '运营播放量', '有播放量歌曲数', '历史累计运营播放量']""", + "question": "周深近7天结算播放量总和是多少", + "analysis": """让我们一步一步地思考。在问题“周深近7天结算播放量总和是多少“中,我们被问: +“结算播放量总和是多少”,所以我们需要column=[结算播放量] +”周深“,所以我们需要column=[歌手名] +基于table和columns,可能的cell values 是 = ['周深']。""", + "schema_links": """["结算播放量", "歌手名", "'周深'"]""", + "sql": """select sum(结算播放量) from 艺人库 where 歌手名 = '周深'""" + }, + { + "table_name": "内容库产品", + "fields_list": """['部门', '模块', '用户名', '访问次数', '访问人数', '访问时长']""", + "question": "内容库访问次数大于1k的部门是哪些", + "analysis": """让我们一步一步地思考。在问题“内容库访问次数大于1k的部门是哪些“中,我们被问: +“部门是哪些”,所以我们需要column=[部门] +”访问次数大于1k的“,所以我们需要column=[访问次数] +基于table和columns,可能的cell values 是 = [1000]。""", + "schema_links": """["部门", "访问次数", 1000]""", + "sql": """select 部门 from 内容库产品 where 访问次数 > 1000""" + }, + { + "table_name": "歌曲库", + "fields_list": """['歌曲名', '歌手名' , '歌曲版本', '歌曲类型', 'TME歌曲ID', '是否优选窄口径歌曲', '是否优选宽口径歌曲', '是否音乐人歌曲', '网易歌曲ID', 'Q音歌曲ID', 'Q音歌曲MID', '结算播放量', '运营播放量', '分享量', '收藏量', '运营搜播量', '结算搜播量', '拉新用户数', '拉活用户数', '分享率', '结算播放份额']""", + "question": "陈奕迅唱的所有的播放量大于20k的孤勇者有哪些", + "analysis": """让我们一步一步地思考。在问题“陈奕迅唱的所有的播放量大于20k的孤勇者有哪些“中,我们被问: +“孤勇者有哪些”,所以我们需要column=[歌曲名] +”播放量大于20k的“,所以我们需要column=[结算播放量] +”陈奕迅唱的“,所以我们需要column=[歌手名] +基于table和columns,可能的cell values 是 = [20000, '陈奕迅']。""", + "schema_links": """["歌曲名", "结算播放量", "歌手名", 20000, "'陈奕迅'"]""", + "sql": """select 歌曲名 from 歌曲库 where 结算播放量 > 20000 and 歌手名 = '陈奕迅'""" + } +] diff --git a/chat/core/src/main/python/llm/sql/output_parser.py b/chat/core/src/main/python/llm/sql/output_parser.py new file mode 100644 index 000000000..64df5ba1f --- /dev/null +++ b/chat/core/src/main/python/llm/sql/output_parser.py @@ -0,0 +1,15 @@ +# -*- coding:utf-8 -*- +import re + + +def schema_link_parse(schema_link_output): + try: + schema_link_output = schema_link_output.strip() + pattern = r'Schema_links:(.*)' + schema_link_output = re.findall(pattern, schema_link_output, re.DOTALL)[ + 0].strip() + except Exception as e: + print(e) + schema_link_output = None + + return schema_link_output diff --git a/chat/core/src/main/python/llm/sql/prompt_maker.py b/chat/core/src/main/python/llm/sql/prompt_maker.py new file mode 100644 index 000000000..54de5478c --- /dev/null +++ b/chat/core/src/main/python/llm/sql/prompt_maker.py @@ -0,0 +1,88 @@ +# -*- coding:utf-8 -*- +from typing import Any, List, Mapping, Optional, Union +import requests +import logging +import json +import os +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from langchain.prompts import PromptTemplate +from langchain.prompts.few_shot import FewShotPromptTemplate +from langchain.llms import OpenAI + +from few_shot_example.sql_exampler import examplars +from output_parser import schema_link_parse + + +def schema_linking_prompt_maker(user_query: str, domain_name: str, + fields_list: List[str], + few_shots_example: str): + instruction = "# 根据数据库的表结构,找出为每个问题生成SQL查询语句的schema_links\n" + + schema_linking_prompt = "Table {table_name}, columns = {fields_list}\n问题:{user_query}\n分析: 让我们一步一步地思考。".format( + table_name=domain_name, + fields_list=fields_list, + user_query=user_query) + + return instruction + few_shots_example + schema_linking_prompt + + +def schema_linking_exampler(user_query: str, + domain_name: str, + fields_list: List[str] +) -> str: + example_prompt_template = PromptTemplate( + input_variables=["table_name", "fields_list", "question", "analysis", + "schema_links"], + template="Table {table_name}, columns = {fields_list}\n问题:{question}\n分析:{analysis} 所以Schema_links是:\nSchema_links:{schema_links}") + + instruction = "# 根据数据库的表结构,找出为每个问题生成SQL查询语句的schema_links" + + schema_linking_prompt = "Table {table_name}, columns = {fields_list}\n问题:{question}\n分析: 让我们一步一步地思考。" + + schema_linking_example_prompt_template = FewShotPromptTemplate( + examples=examplars, + example_prompt=example_prompt_template, + example_separator="\n\n", + prefix=instruction, + input_variables=["table_name", "fields_list", "question"], + suffix=schema_linking_prompt + ) + + schema_linking_example_prompt = schema_linking_example_prompt_template.format( + table_name=domain_name, + fields_list=fields_list, + question=user_query) + + return schema_linking_example_prompt + + +def sql_exampler(user_query: str, + domain_name: str, + schema_link_str: str +) -> str: + instruction = "# 根据schema_links为每个问题生成SQL查询语句" + + sql_example_prompt_template = PromptTemplate( + input_variables=["question", "table_name", "schema_links", "sql"], + template="问题:{question}\nTable {table_name}\nSchema_links:{schema_links}\nSQL:{sql}") + + sql_prompt = "问题:{question}\nTable {table_name}\nSchema_links:{schema_links}\nSQL:" + + sql_example_prompt_template = FewShotPromptTemplate( + examples=examplars, + example_prompt=sql_example_prompt_template, + example_separator="\n\n", + prefix=instruction, + input_variables=["question", "table_name", "schema_links"], + suffix=sql_prompt + ) + + sql_example_prompt = sql_example_prompt_template.format(question=user_query, + table_name=domain_name, + schema_links=schema_link_str) + + return sql_example_prompt diff --git a/chat/core/src/main/python/llm/sql/run.py b/chat/core/src/main/python/llm/sql/run.py new file mode 100644 index 000000000..278fa099c --- /dev/null +++ b/chat/core/src/main/python/llm/sql/run.py @@ -0,0 +1,48 @@ +# -*- coding:utf-8 -*- + +from typing import List, Union +import logging +import json +import os +import sys +from langchain.llms import OpenAI + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from sql.prompt_maker import schema_linking_exampler, schema_link_parse, \ + sql_exampler + +MODEL_NAME = "gpt-3.5-turbo-16k" +OPENAI_API_KEY = "YOUR_API_KEY" +TEMPERATURE = 0.0 + +llm = OpenAI(openai_api_key=OPENAI_API_KEY, model_name=MODEL_NAME, + temperature=TEMPERATURE) + + +def query2sql(query_text: str, schema: dict): + print("schema: ", schema) + + domain_name = schema['domainName'] + fields_list = schema['fieldNameList'] + + schema_linking_prompt = schema_linking_exampler(query_text, domain_name, + fields_list) + schema_link_output = llm(schema_linking_prompt) + schema_link_str = schema_link_parse(schema_link_output) + + sql_prompt = sql_exampler(query_text, domain_name, schema_link_str) + sql_output = llm(sql_prompt) + + resp = dict() + resp['query'] = query_text + resp['domain'] = domain_name + resp['fields'] = fields_list + + resp['schemaLinkingOutput'] = schema_link_output + resp['schemaLinkStr'] = schema_link_str + + resp['sqlOutput'] = sql_output + + return resp diff --git a/chat/core/src/main/python/requirements.txt b/chat/core/src/main/python/requirements.txt new file mode 100644 index 000000000..44750f464 --- /dev/null +++ b/chat/core/src/main/python/requirements.txt @@ -0,0 +1,8 @@ +langchain==0.0.207 +openai==0.27.4 +fastapi==0.95.1 +chromadb==0.3.21 +tiktoken==0.3.3 +uvicorn[standard]==0.21.1 + + diff --git a/chat/core/src/main/resources/mapper/ChatConfigMapper.xml b/chat/core/src/main/resources/mapper/ChatConfigMapper.xml index 599e0343d..64e43a3c6 100644 --- a/chat/core/src/main/resources/mapper/ChatConfigMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatConfigMapper.xml @@ -9,10 +9,8 @@ type="com.tencent.supersonic.chat.domain.dataobject.ChatConfigDO"> - - - - + + @@ -25,11 +23,11 @@ useGeneratedKeys="true" keyProperty="id"> insert into s2_chat_config ( - domain_id, `default_metrics`, visibility, entity_info, dictionary_info, status, created_by, updated_by, created_at, updated_at + domain_id, `chat_detail_config`, chat_agg_config, status, created_by, updated_by, created_at, updated_at ) values ( - #{domainId}, #{defaultMetrics}, #{visibility}, #{entity}, #{knowledgeInfo}, #{status}, #{createdBy}, #{updatedBy}, #{createdAt}, #{updatedAt} + #{domainId}, #{chatDetailConfig}, #{chatAggConfig}, #{status}, #{createdBy}, #{updatedBy}, #{createdAt}, #{updatedAt} ) @@ -38,18 +36,11 @@ update s2_chat_config `updated_at` = #{updatedAt} , - - - `default_metrics` = #{defaultMetrics} , + + `chat_detail_config` = #{chatDetailConfig} , - - visibility = #{visibility} , - - - entity_info = #{entity} , - - - `dictionary_info` = #{knowledgeInfo} , + + chat_agg_config = #{chatAggConfig} , status = #{status} , @@ -90,7 +81,8 @@ select * from s2_chat_config where domain_id = #{domainId} - order by status + and status != 3 + order by updated_at desc limit 1 diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfoTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfoTest.java deleted file mode 100644 index ce2b98da4..000000000 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfoTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tencent.supersonic.chat.domain.utils; - -import com.tencent.supersonic.semantic.api.core.enums.TimeDimensionEnum; -import java.text.MessageFormat; -import org.junit.Assert; -import org.junit.jupiter.api.Test; - -/** - * @author lex luo - * @date 2023/6/29 16:05 - */ -class DslToSemanticInfoTest { - - @Test - void search() { - - Integer domainId = 1; - String dayField = TimeDimensionEnum.DAY.getName(); - String startDate = "2023-04-01"; - String endDate = "2023-06-01"; - - String format = MessageFormat.format(DslToSemanticInfo.SUB_TABLE, domainId, dayField, startDate, endDate); - - Assert.assertEquals(format, - " ( select * from t_1 where sys_imp_date >= '2023-04-01' and sys_imp_date <= '2023-06-01' ) as t_sub_1"); - - } -} \ No newline at end of file diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java index cd8404f12..81b75e7be 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java @@ -13,8 +13,8 @@ import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; import com.tencent.supersonic.semantic.api.core.response.MetricResp; import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; import com.tencent.supersonic.chat.application.ConfigServiceImpl; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichInfo; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; +import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetricInfo; import com.tencent.supersonic.chat.domain.pojo.config.EntityInternalDetail; @@ -47,17 +47,17 @@ public class MockBeansConfiguration { public static void buildHttpSemanticServiceImpl(SemanticLayer httpSemanticLayer, List dimensionDescs, List metricDescs) { - ChatConfigRichInfo chaConfigRichDesc = new ChatConfigRichInfo(); + ChatConfigRichResp chaConfigRichDesc = new ChatConfigRichResp(); DefaultMetric defaultMetricDesc = new DefaultMetric(); defaultMetricDesc.setUnit(3); defaultMetricDesc.setPeriod(Constants.DAY); - chaConfigRichDesc.setDefaultMetrics(new ArrayList<>(Arrays.asList(defaultMetricDesc))); +// chaConfigRichDesc.setDefaultMetrics(new ArrayList<>(Arrays.asList(defaultMetricDesc))); EntityRichInfo entityDesc = new EntityRichInfo(); List dimensionDescs1 = new ArrayList<>(); DimSchemaResp dimensionDesc = new DimSchemaResp(); dimensionDesc.setId(162L); dimensionDescs1.add(dimensionDesc); - entityDesc.setEntityIds(dimensionDescs1); +// entityDesc.setEntityIds(dimensionDescs1); DimSchemaResp dimensionDesc2 = new DimSchemaResp(); dimensionDesc2.setId(163L); @@ -71,14 +71,14 @@ public class MockBeansConfiguration { metricDesc.setBizName("js_play_cnt"); metricDesc.setName("结算播放量"); entityInternalDetailDesc.setMetricList(new ArrayList<>(Arrays.asList(metricDesc))); - entityDesc.setEntityInternalDetailDesc(entityInternalDetailDesc); +// entityDesc.setEntityInternalDetailDesc(entityInternalDetailDesc); - chaConfigRichDesc.setEntity(entityDesc); +// chaConfigRichDesc.setEntity(entityDesc); // when(httpSemanticLayer.getChatConfigRichInfo(anyLong())).thenReturn(chaConfigRichDesc); DomainSchemaResp domainSchemaDesc = new DomainSchemaResp(); domainSchemaDesc.setDimensions(dimensionDescs); domainSchemaDesc.setMetrics(metricDescs); - when(httpSemanticLayer.getDomainSchemaInfo(anyLong())).thenReturn(domainSchemaDesc); +// when(httpSemanticLayer.getDomainSchemaInfo(anyLong())).thenReturn(domainSchemaDesc); DomainInfos domainInfos = new DomainInfos(); when(SchemaInfoConverter.convert(httpSemanticLayer.getDomainSchemaInfo(anyList()))).thenReturn(domainInfos); @@ -92,8 +92,8 @@ public class MockBeansConfiguration { List defaultMetricInfos = new ArrayList<>(); defaultMetricInfos.add(defaultMetricInfo); - ChatConfigInfo chaConfigDesc = new ChatConfigInfo(); - chaConfigDesc.setDefaultMetrics(defaultMetricInfos); + ChatConfigResp chaConfigDesc = new ChatConfigResp(); +// chaConfigDesc.setDefaultMetrics(defaultMetricInfos); when(configService.fetchConfigByDomainId(anyLong())).thenReturn(chaConfigDesc); } diff --git a/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/WordBasedSegment.java b/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/WordBasedSegment.java index 47204ec23..49571493a 100644 --- a/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/WordBasedSegment.java +++ b/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/WordBasedSegment.java @@ -14,8 +14,12 @@ import com.hankcs.hanlp.seg.common.Term; import com.hankcs.hanlp.seg.common.Vertex; import com.hankcs.hanlp.seg.common.WordNet; import com.hankcs.hanlp.utility.TextUtility; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; -import java.util.*; public abstract class WordBasedSegment extends Segment { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HanlpHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HanlpHelper.java index f5962d852..156c6977e 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HanlpHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HanlpHelper.java @@ -6,12 +6,15 @@ import com.hankcs.hanlp.HanLP; import com.hankcs.hanlp.dictionary.CoreDictionary; import com.hankcs.hanlp.dictionary.DynamicCustomDictionary; import com.hankcs.hanlp.seg.Segment; +import com.hankcs.hanlp.seg.common.Term; import com.tencent.supersonic.common.nlp.MapResult; +import com.tencent.supersonic.common.nlp.NatureType; import com.tencent.supersonic.common.nlp.WordNature; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; @@ -173,5 +176,10 @@ public class HanlpHelper { } } + public static List getTerms(String text) { + return getSegment().seg(text.toLowerCase()).stream() + .filter(term -> term.getNature().startsWith(NatureType.NATURE_SPILT)) + .collect(Collectors.toList()); + } } diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/ConfigMode.java b/common/src/main/java/com/tencent/supersonic/common/enums/ConfigMode.java new file mode 100644 index 000000000..f1ccf7d4f --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/enums/ConfigMode.java @@ -0,0 +1,28 @@ +package com.tencent.supersonic.common.enums; + +public enum ConfigMode { + + + DETAIL("DETAIL"), + AGG("AGG"), + UNKNOWN("UNKNOWN"); + + private String mode; + + ConfigMode(String mode) { + this.mode = mode; + } + + public String getMode() { + return mode; + } + + public static ConfigMode of(String agg) { + for (ConfigMode configMode : ConfigMode.values()) { + if (configMode.getMode().equalsIgnoreCase(agg)) { + return configMode; + } + } + return ConfigMode.UNKNOWN; + } +} diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java index 5248983d4..9ebae3e5f 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java @@ -15,7 +15,7 @@ public class DateConf { private static final long serialVersionUID = 3074129990945004340L; - private DateMode dateMode; + private DateMode dateMode = DateMode.RECENT_UNITS; /** * like 2021-10-22, dateMode=1 diff --git a/common/src/main/java/com/tencent/supersonic/common/util/calcite/S2MysqlSqlDialect.java b/common/src/main/java/com/tencent/supersonic/common/util/calcite/S2MysqlSqlDialect.java new file mode 100644 index 000000000..4dab36e70 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/calcite/S2MysqlSqlDialect.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.common.util.calcite; + +import org.apache.calcite.sql.dialect.MysqlSqlDialect; + +public class S2MysqlSqlDialect extends MysqlSqlDialect { + + public S2MysqlSqlDialect(Context context) { + super(context); + } + + @Override + public void quoteStringLiteral(StringBuilder buf, String charsetName, String val) { + buf.append(this.literalQuoteString); + buf.append(val.replace(this.literalEndQuoteString, this.literalEscapedQuote)); + buf.append(this.literalEndQuoteString); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java index a926d928c..46393e517 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java @@ -1,16 +1,24 @@ package com.tencent.supersonic.common.util.calcite; +import java.util.HashSet; import java.util.List; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import org.apache.calcite.sql.SqlBasicCall; +import org.apache.calcite.sql.SqlDialect; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOrderBy; import org.apache.calcite.sql.SqlSelect; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.parser.SqlParser; +import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.sql.util.SqlString; +import org.apache.commons.collections.CollectionUtils; /** * sql parse utils @@ -28,11 +36,14 @@ public class SqlParseUtils { SqlParser parser = SqlParser.create(sql); SqlNode sqlNode = parser.parseQuery(); SqlParserInfo sqlParserInfo = new SqlParserInfo(); + handlerSQL(sqlNode, sqlParserInfo); - List collect = sqlParserInfo.getAllFields().stream().distinct().collect(Collectors.toList()); + sqlParserInfo.setAllFields(sqlParserInfo.getAllFields().stream().distinct().collect(Collectors.toList())); + + sqlParserInfo.setSelectFields( + sqlParserInfo.getSelectFields().stream().distinct().collect(Collectors.toList())); - sqlParserInfo.setAllFields(collect); return sqlParserInfo; } catch (SqlParseException e) { throw new RuntimeException("getSqlParseInfo", e); @@ -69,7 +80,8 @@ public class SqlParseUtils { SqlNode query = sqlOrderBy.query; handlerSQL(query, sqlParserInfo); SqlNodeList orderList = sqlOrderBy.orderList; - handlerField(orderList, sqlParserInfo); + Set orderFields = handlerField(orderList); + sqlParserInfo.getAllFields().addAll(orderFields); } /** @@ -82,22 +94,26 @@ public class SqlParseUtils { SqlSelect sqlSelect = (SqlSelect) select; SqlNodeList selectList = sqlSelect.getSelectList(); + List allFields = sqlParserInfo.getAllFields(); + selectList.getList().forEach(list -> { - handlerField(list, sqlParserInfo); + Set selectFields = handlerField(list); + sqlParserInfo.getSelectFields().addAll(selectFields); + allFields.addAll(selectFields); }); String tableName = handlerFrom(sqlSelect.getFrom()); sqlParserInfo.setTableName(tableName); if (sqlSelect.hasWhere()) { - handlerField(sqlSelect.getWhere(), sqlParserInfo); + allFields.addAll(handlerField(sqlSelect.getWhere())); } if (sqlSelect.hasOrderBy()) { - handlerField(sqlSelect.getOrderList(), sqlParserInfo); + allFields.addAll(handlerField(sqlSelect.getOrderList())); } SqlNodeList group = sqlSelect.getGroup(); if (group != null) { group.forEach(groupField -> { - handlerField(groupField, sqlParserInfo); + allFields.addAll(handlerField(groupField)); }); } } @@ -115,7 +131,7 @@ public class SqlParseUtils { SqlIdentifier sqlIdentifier = (SqlIdentifier) from; return sqlIdentifier.getSimple(); case AS: - SqlBasicCall sqlBasicCall = (SqlBasicCall) from; + SqlBasicCall sqlBasicCall = (SqlBasicCall) from; SqlNode sqlNode = sqlBasicCall.getOperandList().get(0); SqlSelect sqlSelect = (SqlSelect) sqlNode; return handlerFrom(sqlSelect.getFrom()); @@ -127,34 +143,120 @@ public class SqlParseUtils { * handler field * * @param field - * @param sqlParserInfo */ - private static void handlerField(SqlNode field, SqlParserInfo sqlParserInfo) { + private static Set handlerField(SqlNode field) { + Set fields = new HashSet<>(); SqlKind kind = field.getKind(); switch (kind) { case AS: List operandList1 = ((SqlBasicCall) field).getOperandList(); - SqlNode left_as = operandList1.get(0); - handlerField(left_as, sqlParserInfo); + SqlNode leftAs = operandList1.get(0); + fields.addAll(handlerField(leftAs)); break; case IDENTIFIER: SqlIdentifier sqlIdentifier = (SqlIdentifier) field; - sqlParserInfo.getAllFields().add(sqlIdentifier.getSimple()); + fields.add(sqlIdentifier.getSimple()); break; default: if (field instanceof SqlBasicCall) { List operandList2 = ((SqlBasicCall) field).getOperandList(); for (int i = 0; i < operandList2.size(); i++) { - handlerField(operandList2.get(i), sqlParserInfo); + fields.addAll(handlerField(operandList2.get(i))); } } if (field instanceof SqlNodeList) { ((SqlNodeList) field).getList().forEach(node -> { - handlerField(node, sqlParserInfo); + fields.addAll(handlerField(node)); }); } break; } + return fields; } + + public static String addAliasToSql(String sql) throws SqlParseException { + SqlParser parser = SqlParser.create(sql); + SqlNode sqlNode = parser.parseStmt(); + + if (!(sqlNode instanceof SqlSelect)) { + return sql; + } + + SqlNodeList selectList = ((SqlSelect) sqlNode).getSelectList(); + for (SqlNode node : selectList) { + if (node instanceof SqlBasicCall) { + SqlBasicCall sqlBasicCall = (SqlBasicCall) node; + + List operandList = sqlBasicCall.getOperandList(); + if (CollectionUtils.isNotEmpty(operandList) && operandList.size() == 1) { + SqlIdentifier sqlIdentifier = (SqlIdentifier) operandList.get(0); + String simple = sqlIdentifier.getSimple(); + SqlBasicCall aliasedNode = new SqlBasicCall( + SqlStdOperatorTable.AS, + new SqlNode[]{sqlBasicCall, new SqlIdentifier(simple.toLowerCase(), SqlParserPos.ZERO)}, + SqlParserPos.ZERO); + selectList.set(selectList.indexOf(node), aliasedNode); + } + } + } + SqlDialect dialect = new S2MysqlSqlDialect(S2MysqlSqlDialect.DEFAULT_CONTEXT); + SqlString newSql = sqlNode.toSqlString(dialect); + return newSql.getSql().replaceAll("`", ""); + } + + public static String addFieldsToSql(String sql, List addFields) throws SqlParseException { + if (CollectionUtils.isEmpty(addFields)) { + return sql; + } + SqlParser parser = SqlParser.create(sql); + SqlNode sqlNode = parser.parseStmt(); + SqlNodeList selectList = getSelectList(sqlNode); + + // agg to field not allow to add field + if (Objects.isNull(selectList)) { + return sql; + } + for (SqlNode node : selectList) { + if (node instanceof SqlBasicCall) { + return sql; + } + } + Set existFields = new HashSet<>(); + for (SqlNode node : selectList.getList()) { + if (node instanceof SqlIdentifier) { + String fieldName = ((SqlIdentifier) node).getSimple(); + existFields.add(fieldName.toLowerCase()); + } + } + + for (String addField : addFields) { + if (existFields.contains(addField.toLowerCase())) { + continue; + } + SqlIdentifier newField = new SqlIdentifier(addField, SqlParserPos.ZERO); + selectList.add(newField); + existFields.add(addField.toLowerCase()); + } + SqlDialect dialect = new S2MysqlSqlDialect(S2MysqlSqlDialect.DEFAULT_CONTEXT); + SqlString newSql = sqlNode.toSqlString(dialect); + + return newSql.getSql().replaceAll("`", ""); + } + + private static SqlNodeList getSelectList(SqlNode sqlNode) { + SqlKind kind = sqlNode.getKind(); + + switch (kind) { + case SELECT: + SqlSelect sqlSelect = (SqlSelect) sqlNode; + return sqlSelect.getSelectList(); + case ORDER_BY: + SqlOrderBy sqlOrderBy = (SqlOrderBy) sqlNode; + SqlSelect query = (SqlSelect) sqlOrderBy.query; + return query.getSelectList(); + } + return null; + } + } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParserInfo.java b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParserInfo.java index cab347a03..c75b01f8f 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParserInfo.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParserInfo.java @@ -12,6 +12,7 @@ public class SqlParserInfo implements Serializable { private String tableName; - private List allFields = new ArrayList<>(); + private List selectFields = new ArrayList<>(); + private List allFields = new ArrayList<>(); } \ No newline at end of file diff --git a/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java b/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java new file mode 100644 index 000000000..21bbd8bb9 --- /dev/null +++ b/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java @@ -0,0 +1,106 @@ +package com.tencent.supersonic.common.util.calcite; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.calcite.sql.parser.SqlParseException; +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +/** + * SqlParseUtils Test + * + * @date 2023/7/12 12:00 + */ +class SqlParseUtilsTest { + + @Test + void addAliasToSql() throws SqlParseException { + + String addAliasToSql = SqlParseUtils.addAliasToSql( + "select sum(pv) from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1"); + + Assert.assertTrue(addAliasToSql.toLowerCase().contains("as `pv`")); + } + + @Test + void addFieldToSql() throws SqlParseException { + + String addFieldToSql = SqlParseUtils.addFieldsToSql( + "select pv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1", + Collections.singletonList("uv")); + + Assert.assertTrue(addFieldToSql.toLowerCase().contains("uv")); + + + addFieldToSql = SqlParseUtils.addFieldsToSql( + "select uv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 order by play_count desc limit 10", + Collections.singletonList("pv")); + Assert.assertTrue(addFieldToSql.toLowerCase().contains("pv")); + + addFieldToSql = SqlParseUtils.addFieldsToSql( + "select uv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 where user_id = '张三' order by play_count desc limit 10", + Collections.singletonList("pv")); + Assert.assertTrue(addFieldToSql.toLowerCase().contains("pv")); + } + + + @Test + void getSqlParseInfo() { + + SqlParserInfo sqlParserInfo = SqlParseUtils.getSqlParseInfo( + "select pv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 "); + + Assert.assertTrue(sqlParserInfo.getTableName().equalsIgnoreCase("t_1")); + + List collect = sqlParserInfo.getAllFields().stream().map(field -> field.toLowerCase()) + .collect(Collectors.toList()); + + Assert.assertTrue(collect.contains("pv")); + Assert.assertTrue(!collect.contains("uv")); + + + List selectFields = sqlParserInfo.getSelectFields().stream().map(field -> field.toLowerCase()) + .collect(Collectors.toList()); + Assert.assertTrue(selectFields.contains("pv")); + Assert.assertTrue(!selectFields.contains("uv")); + + + sqlParserInfo = SqlParseUtils.getSqlParseInfo( + "select uv from t_1 order by play_count desc limit 10"); + + Assert.assertTrue(sqlParserInfo.getTableName().equalsIgnoreCase("t_1")); + collect = sqlParserInfo.getAllFields().stream().map(field -> field.toLowerCase()) + .collect(Collectors.toList()); + Assert.assertTrue(collect.contains("uv")); + Assert.assertTrue(collect.contains("play_count")); + Assert.assertTrue(!collect.contains("pv")); + + selectFields = sqlParserInfo.getSelectFields().stream().map(field -> field.toLowerCase()) + .collect(Collectors.toList()); + Assert.assertTrue(selectFields.contains("uv")); + Assert.assertTrue(!selectFields.contains("pv")); + Assert.assertTrue(!selectFields.contains("play_count")); + + + + sqlParserInfo = SqlParseUtils.getSqlParseInfo( + "select uv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 where user_id = '1' order by play_count desc limit 10"); + + Assert.assertTrue(sqlParserInfo.getTableName().equalsIgnoreCase("t_1")); + collect = sqlParserInfo.getAllFields().stream().map(field -> field.toLowerCase()) + .collect(Collectors.toList()); + Assert.assertTrue(collect.contains("uv")); + Assert.assertTrue(collect.contains("play_count")); + Assert.assertTrue(collect.contains("user_id")); + Assert.assertTrue(!collect.contains("pv")); + + selectFields = sqlParserInfo.getSelectFields().stream().map(field -> field.toLowerCase()) + .collect(Collectors.toList()); + Assert.assertTrue(selectFields.contains("uv")); + Assert.assertTrue(!selectFields.contains("pv")); + Assert.assertTrue(!selectFields.contains("user_id")); + Assert.assertTrue(!selectFields.contains("play_count")); + } + +} \ No newline at end of file diff --git a/launchers/chat/src/main/bin/service.sh b/launchers/chat/src/main/bin/service.sh index 3176eb811..fef8ff3a7 100755 --- a/launchers/chat/src/main/bin/service.sh +++ b/launchers/chat/src/main/bin/service.sh @@ -5,7 +5,7 @@ baseDir=$(readlink -f $binDir/../) confDir=$baseDir/conf source ${baseDir}/bin/env.sh -commond=$1 +command=$1 function start() { @@ -33,7 +33,7 @@ function stop() fi } -case "$commond" in +case "$command" in start) echo -e "Starting $APP_NAME" start diff --git a/launchers/chat/src/main/resources/META-INF/spring.factories b/launchers/chat/src/main/resources/META-INF/spring.factories index 19f37234b..c32fc28ea 100644 --- a/launchers/chat/src/main/resources/META-INF/spring.factories +++ b/launchers/chat/src/main/resources/META-INF/spring.factories @@ -6,8 +6,8 @@ com.tencent.supersonic.chat.api.component.SchemaMapper=\ com.tencent.supersonic.chat.api.component.SemanticParser=\ com.tencent.supersonic.chat.application.parser.DomainSemanticParser, \ com.tencent.supersonic.chat.application.parser.TimeSemanticParser, \ - com.tencent.supersonic.chat.application.parser.AggregateSemanticParser -# com.tencent.supersonic.chat.application.parser.LLMSemanticParser + com.tencent.supersonic.chat.application.parser.AggregateSemanticParser, \ + com.tencent.supersonic.chat.application.parser.LLMSemanticParser com.tencent.supersonic.chat.api.component.SemanticLayer=\ diff --git a/launchers/chat/src/main/resources/data/dictionary/custom/DimValue_1_2.txt b/launchers/chat/src/main/resources/data/dictionary/custom/DimValue_1_2.txt index e0570f4b0..7e06c5619 100644 --- a/launchers/chat/src/main/resources/data/dictionary/custom/DimValue_1_2.txt +++ b/launchers/chat/src/main/resources/data/dictionary/custom/DimValue_1_2.txt @@ -4,4 +4,16 @@ lucy _1_2 31 dean _1_2 36 john _1_2 50 jack _1_2 38 -admin _1_2 70 \ No newline at end of file +admin _1_2 70 +周杰伦 _2_7 100 +陈奕迅 _2_7 100 +林俊杰 _2_7 100 +张碧晨 _2_7 100 +程响 _2_7 100 +Taylor#Swift _2_7 100 +中国 _2_4 100 +欧美 _2_4 100 +流行 _2_6 100 +爱情 _2_6 100 +激情 _2_6 100 +国风 _2_6 100 diff --git a/launchers/chat/src/main/resources/db/chat-data-h2.sql b/launchers/chat/src/main/resources/db/chat-data-h2.sql index f88969f27..f997a6e74 100644 --- a/launchers/chat/src/main/resources/db/chat-data-h2.sql +++ b/launchers/chat/src/main/resources/db/chat-data-h2.sql @@ -3,7 +3,15 @@ insert into s2_user (id, `name`, password, display_name, email) values (2, 'jack insert into s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com'); insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy','123456','lucy','lucy@xx.com'); -insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +-- insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) +values (1,1,'{"visibility":{"blackDimIdList":[1],"blackMetricIdList":[2]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"},"entity":null}', +'{"visibility":{"blackDimIdList":[3],"blackMetricIdList":[3]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"}}', +'2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) +values (2,2,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":1,"names":["歌手","艺人"]}}', + '{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"}}', + '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (1, '超音数访问统计','2023-06-10 10:00:52.495','2023-06-10 10:00:52','admin','您好,欢迎使用内容智能小Q','0','0'); insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (2, '用户访问统计','2023-06-10 10:01:04.528','2023-06-10 10:01:04','admin','您好,欢迎使用内容智能小Q','0','0'); @@ -16,4 +24,4 @@ insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`, insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(3, '2023-06-10 10:40:49.877', '访问', 'admin',0,1,'{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `uv` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_uv` AS `uv` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT COUNT ( DISTINCT `s2_pv_uv_statis_uv` ) AS `s2_pv_uv_statis_uv` , SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `uv` AS `s2_pv_uv_statis_uv` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_022c` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问人数","type":"BIGINT","nameEn":"uv","showType":"NUMBER","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p2","uv":3,"pv":3},{"sys_imp_date":"2023-06-03","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p4","uv":1,"pv":1},{"sys_imp_date":"2023-06-03","page":"p5","uv":3,"pv":3},{"sys_imp_date":"2023-06-04","page":"p1","uv":2,"pv":3},{"sys_imp_date":"2023-06-04","page":"p2","uv":1,"pv":1},{"sys_imp_date":"2023-06-04","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-04","page":"p4","uv":3,"pv":4},{"sys_imp_date":"2023-06-04","page":"p5","uv":3,"pv":4}]}',0,''); insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(4, '2023-06-10 10:41:18.589','alice 访问次数','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `user_name` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_b825` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":2},{"sys_imp_date":"2023-06-04","pv":2},{"sys_imp_date":"2023-06-06","pv":2},{"sys_imp_date":"2023-06-07","pv":2},{"sys_imp_date":"2023-06-08","pv":5},{"sys_imp_date":"2023-06-09","pv":2}]}',0,''); insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(5, '2023-06-10 10:41:48.211','停留时长','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(6, '2023-06-10 10:42:02.184','访问','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,''); \ No newline at end of file +insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(6, '2023-06-10 10:42:02.184','访问','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,''); diff --git a/launchers/chat/src/main/resources/db/chat-schema-h2.sql b/launchers/chat/src/main/resources/db/chat-schema-h2.sql index 57f4a93d1..f603eb4aa 100644 --- a/launchers/chat/src/main/resources/db/chat-schema-h2.sql +++ b/launchers/chat/src/main/resources/db/chat-schema-h2.sql @@ -37,15 +37,11 @@ CREATE TABLE `s2_chat_query` PRIMARY KEY (`question_id`) ); - - CREATE TABLE IF NOT EXISTS `s2_chat_config` ( `id` INT NOT NULL AUTO_INCREMENT, `domain_id` INT DEFAULT NULL , - `default_metrics` varchar(655) DEFAULT NULL, - `visibility` varchar(655) , -- invisible dimension metric information - `entity_info` varchar(655) , - `dictionary_info` varchar(655) , -- dictionary-related dimension setting information + `chat_detail_config` varchar(655) , + `chat_agg_config` varchar(655) , `created_at` TIMESTAMP NOT NULL , `updated_at` TIMESTAMP NOT NULL , `created_by` varchar(100) NOT NULL , @@ -53,6 +49,22 @@ CREATE TABLE IF NOT EXISTS `s2_chat_config` ( `status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted PRIMARY KEY (`id`) ) ; + + +-- CREATE TABLE IF NOT EXISTS `s2_chat_config` ( +-- `id` INT NOT NULL AUTO_INCREMENT, +-- `domain_id` INT DEFAULT NULL , +-- `default_metrics` varchar(655) DEFAULT NULL, +-- `visibility` varchar(655) , -- invisible dimension metric information +-- `entity_info` varchar(655) , +-- `dictionary_info` varchar(655) , -- dictionary-related dimension setting information +-- `created_at` TIMESTAMP NOT NULL , +-- `updated_at` TIMESTAMP NOT NULL , +-- `created_by` varchar(100) NOT NULL , +-- `updated_by` varchar(100) NOT NULL , +-- `status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted +-- PRIMARY KEY (`id`) +-- ) ; COMMENT ON TABLE s2_chat_config IS 'chat config information table '; diff --git a/launchers/semantic/pom.xml b/launchers/semantic/pom.xml index f05a52ffd..206fc7505 100644 --- a/launchers/semantic/pom.xml +++ b/launchers/semantic/pom.xml @@ -90,7 +90,7 @@ - ../../assembly/build/build.xml + ../semantic/src/main/build/build.xml diff --git a/launchers/semantic/src/main/bin/service.sh b/launchers/semantic/src/main/bin/service.sh index 3176eb811..fef8ff3a7 100755 --- a/launchers/semantic/src/main/bin/service.sh +++ b/launchers/semantic/src/main/bin/service.sh @@ -5,7 +5,7 @@ baseDir=$(readlink -f $binDir/../) confDir=$baseDir/conf source ${baseDir}/bin/env.sh -commond=$1 +command=$1 function start() { @@ -33,7 +33,7 @@ function stop() fi } -case "$commond" in +case "$command" in start) echo -e "Starting $APP_NAME" start diff --git a/launchers/semantic/src/main/build/build.xml b/launchers/semantic/src/main/build/build.xml new file mode 100644 index 000000000..7165bcc00 --- /dev/null +++ b/launchers/semantic/src/main/build/build.xml @@ -0,0 +1,39 @@ + + bin + + tar.gz + + + + + ${project.basedir}/src/main/bin + bin + 0777 + 0755 + + + + ${project.basedir}/src/main/resources + conf + 0777 + 0755 + + + + ${project.build.directory} + lib + + *.jar + + + + + + + lib + false + + + \ No newline at end of file diff --git a/launchers/semantic/src/main/resources/application-local.yaml b/launchers/semantic/src/main/resources/application-local.yaml index 39e9d0715..4bfa55b6e 100644 --- a/launchers/semantic/src/main/resources/application-local.yaml +++ b/launchers/semantic/src/main/resources/application-local.yaml @@ -20,4 +20,4 @@ spring: authentication: enable: false exclude: - path: /api/auth/user/register,/api/auth/user/login \ No newline at end of file + path: /api/auth/user/register,/api/auth/user/login diff --git a/launchers/semantic/src/main/resources/db/semantic-data-h2.sql b/launchers/semantic/src/main/resources/db/semantic-data-h2.sql index 339f67f24..53ab8d1de 100644 --- a/launchers/semantic/src/main/resources/db/semantic-data-h2.sql +++ b/launchers/semantic/src/main/resources/db/semantic-data-h2.sql @@ -1,17 +1,27 @@ insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); +insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(2, 2, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 'PVUV统计', 's2_pv_uv_statis', 'PVUV统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","expr":"pv","isCreateMetric":1,"name":"访问次数"},{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","expr":"uv","isCreateMetric":1,"name":"访问人数"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, user_name,page,1 as pv, user_name as uv FROM s2_pv_uv_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, '用户部门', 'user_department', '用户部门', 1, '{"dimensions":[{"bizName":"department","dateFormat":"yyyy-MM-dd","expr":"department","isCreateDimension":1,"name":"部门","type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[],"queryType":"sql_query","sqlQuery":"SELECT user_name,department FROM s2_user_department"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(4, 2, '艺人库', 'singer', '艺人库', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"act_area","dateFormat":"yyyy-MM-dd","expr":"act_area","isCreateDimension":1,"name":"活跃区域","type":"categorical"},{"bizName":"song_name","dateFormat":"yyyy-MM-dd","expr":"song_name","isCreateDimension":1,"name":"代表作","type":"categorical"},{"bizName":"genre","dateFormat":"yyyy-MM-dd","expr":"genre","isCreateDimension":1,"name":"风格","type":"categorical"}],"identifiers":[{"bizName":"singer_name","name":"歌手名","type":"primary"}],"measures":[{"agg":"sum","bizName":"music_down_cnt","expr":"down_cnt","isCreateMetric":1,"name":"下载量"},{"agg":"sum","bizName":"music_js_play_cnt","expr":"js_play_cnt","isCreateMetric":1,"name":"播放量"},{"agg":"sum","bizName":"music_favor_cnt","expr":"favor_cnt","isCreateMetric":1,"name":"收藏量"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date,singer_name,act_area,song_name,genre,js_play_cnt,down_cnt,favor_cnt FROM singer "}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(5, 2, 4, '代表作', 'song_name', '代表作', 1, 2, 'categorical', NULL, 'song_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(6, 2, 4, '风格', 'genre', '风格', 1, 2, 'categorical', NULL, 'genre', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'expr', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'ATOMIC', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'ATOMIC', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'ATOMIC', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'ATOMIC', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); insert into s2_available_date_info(`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` ) values (1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin'); @@ -39,6 +49,60 @@ insert into s2_user_department (user_name, department) values ('john','strategy' insert into s2_user_department (user_name, department) values ('alice','sales'); insert into s2_user_department (user_name, department) values ('dean','marketing'); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'lucy', 'p1'); INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', 'p1'); diff --git a/launchers/semantic/src/main/resources/db/semantic-schema-h2.sql b/launchers/semantic/src/main/resources/db/semantic-schema-h2.sql index 4d484dee7..bc98b4f9e 100644 --- a/launchers/semantic/src/main/resources/db/semantic-schema-h2.sql +++ b/launchers/semantic/src/main/resources/db/semantic-schema-h2.sql @@ -211,6 +211,7 @@ CREATE TABLE IF NOT EXISTS `s2_available_date_info` ( `created_by` varchar(100) NOT NULL , `updated_at` TIMESTAMP NOT NULL , `updated_by` varchar(100) NOT NULL , + `date_period` varchar(100) DEFAULT NULL , `status` INT DEFAULT '0', -- 1-in use 0 is normal, 1 is off the shelf, 2 is deleted PRIMARY KEY (`id`) ); @@ -239,4 +240,16 @@ CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` ( ); COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info'; +CREATE TABLE IF NOT EXISTS `singer` ( + `imp_date` varchar(200) NOT NULL, + `singer_name` varchar(200) NOT NULL, + `act_area` varchar(200) NOT NULL, + `song_name` varchar(200) NOT NULL, + `genre` varchar(200) NOT NULL, + `js_play_cnt` bigINT DEFAULT NULL, + `down_cnt` bigINT DEFAULT NULL, + `favor_cnt` bigINT DEFAULT NULL + ); +COMMENT ON TABLE singer IS 'singer_info'; + diff --git a/launchers/standalone/src/main/bin/env.sh b/launchers/standalone/src/main/bin/env.sh index 969d3fe90..e808d15bf 100644 --- a/launchers/standalone/src/main/bin/env.sh +++ b/launchers/standalone/src/main/bin/env.sh @@ -1,2 +1,2 @@ export APP_NAME=chat-service -export MAIN_CLASS=com.tencent.supersonic.Launcher +export MAIN_CLASS=com.tencent.supersonic.StandaloneLauncher diff --git a/launchers/standalone/src/main/bin/service.sh b/launchers/standalone/src/main/bin/service.sh index 3176eb811..fef8ff3a7 100755 --- a/launchers/standalone/src/main/bin/service.sh +++ b/launchers/standalone/src/main/bin/service.sh @@ -5,7 +5,7 @@ baseDir=$(readlink -f $binDir/../) confDir=$baseDir/conf source ${baseDir}/bin/env.sh -commond=$1 +command=$1 function start() { @@ -33,7 +33,7 @@ function stop() fi } -case "$commond" in +case "$command" in start) echo -e "Starting $APP_NAME" start diff --git a/launchers/standalone/src/main/resources/META-INF/spring.factories b/launchers/standalone/src/main/resources/META-INF/spring.factories index 573471a9f..1219927d9 100644 --- a/launchers/standalone/src/main/resources/META-INF/spring.factories +++ b/launchers/standalone/src/main/resources/META-INF/spring.factories @@ -6,8 +6,8 @@ com.tencent.supersonic.chat.api.component.SchemaMapper=\ com.tencent.supersonic.chat.api.component.SemanticParser=\ com.tencent.supersonic.chat.application.parser.DomainSemanticParser, \ com.tencent.supersonic.chat.application.parser.TimeSemanticParser, \ - com.tencent.supersonic.chat.application.parser.AggregateSemanticParser -# com.tencent.supersonic.chat.application.parser.LLMSemanticParser + com.tencent.supersonic.chat.application.parser.AggregateSemanticParser, \ + com.tencent.supersonic.chat.application.parser.LLMSemanticParser com.tencent.supersonic.chat.api.component.SemanticLayer=\ diff --git a/launchers/standalone/src/main/resources/application-local.yaml b/launchers/standalone/src/main/resources/application-local.yaml index 4c029c184..dd3717532 100644 --- a/launchers/standalone/src/main/resources/application-local.yaml +++ b/launchers/standalone/src/main/resources/application-local.yaml @@ -16,7 +16,7 @@ server: port: 9080 authentication: - enable: false + enable: true exclude: path: /api/auth/user/register,/api/auth/user/login diff --git a/launchers/standalone/src/main/resources/data/dictionary/custom/DimValue_1_2.txt b/launchers/standalone/src/main/resources/data/dictionary/custom/DimValue_1_2.txt index e0570f4b0..7e06c5619 100644 --- a/launchers/standalone/src/main/resources/data/dictionary/custom/DimValue_1_2.txt +++ b/launchers/standalone/src/main/resources/data/dictionary/custom/DimValue_1_2.txt @@ -4,4 +4,16 @@ lucy _1_2 31 dean _1_2 36 john _1_2 50 jack _1_2 38 -admin _1_2 70 \ No newline at end of file +admin _1_2 70 +周杰伦 _2_7 100 +陈奕迅 _2_7 100 +林俊杰 _2_7 100 +张碧晨 _2_7 100 +程响 _2_7 100 +Taylor#Swift _2_7 100 +中国 _2_4 100 +欧美 _2_4 100 +流行 _2_6 100 +爱情 _2_6 100 +激情 _2_6 100 +国风 _2_6 100 diff --git a/launchers/standalone/src/main/resources/db/data-h2.sql b/launchers/standalone/src/main/resources/db/data-h2.sql index 61413b07d..138f1f438 100644 --- a/launchers/standalone/src/main/resources/db/data-h2.sql +++ b/launchers/standalone/src/main/resources/db/data-h2.sql @@ -4,7 +4,15 @@ insert into s2_user (id, `name`, password, display_name, email) values (2, 'jack insert into s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com'); insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy','123456','lucy','lucy@xx.com'); -insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +--insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) +values (1,1,'{"visibility":{"blackDimIdList":[1],"blackMetricIdList":[2]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"},"entity":null}', +'{"visibility":{"blackDimIdList":[3],"blackMetricIdList":[3]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"}}', +'2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) +values (2,2,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":1,"names":["歌手","艺人"]}}', + '{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"}}', + '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (1, '超音数访问统计','2023-06-10 10:00:52.495','2023-06-10 10:00:52','admin','您好,欢迎使用内容智能小Q','0','0'); insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (2, '用户访问统计','2023-06-10 10:01:04.528','2023-06-10 10:01:04','admin','您好,欢迎使用内容智能小Q','0','0'); @@ -22,19 +30,29 @@ insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`, -- semantic data insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); +insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(2, 2, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 'PVUV统计', 's2_pv_uv_statis', 'PVUV统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","expr":"pv","isCreateMetric":1,"name":"访问次数"},{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","expr":"uv","isCreateMetric":1,"name":"访问人数"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, user_name,page,1 as pv, user_name as uv FROM s2_pv_uv_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, '用户部门', 'user_department', '用户部门', 1, '{"dimensions":[{"bizName":"department","dateFormat":"yyyy-MM-dd","expr":"department","isCreateDimension":1,"name":"部门","type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[],"queryType":"sql_query","sqlQuery":"SELECT user_name,department FROM s2_user_department"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(4, 2, '艺人库', 'singer', '艺人库', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"act_area","dateFormat":"yyyy-MM-dd","expr":"act_area","isCreateDimension":1,"name":"活跃区域","type":"categorical"},{"bizName":"song_name","dateFormat":"yyyy-MM-dd","expr":"song_name","isCreateDimension":1,"name":"代表作","type":"categorical"},{"bizName":"genre","dateFormat":"yyyy-MM-dd","expr":"genre","isCreateDimension":1,"name":"风格","type":"categorical"}],"identifiers":[{"bizName":"singer_name","name":"歌手名","type":"primary"}],"measures":[{"agg":"sum","bizName":"music_down_cnt","expr":"down_cnt","isCreateMetric":1,"name":"下载量"},{"agg":"sum","bizName":"music_js_play_cnt","expr":"js_play_cnt","isCreateMetric":1,"name":"播放量"},{"agg":"sum","bizName":"music_favor_cnt","expr":"favor_cnt","isCreateMetric":1,"name":"收藏量"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date,singer_name,act_area,song_name,genre,js_play_cnt,down_cnt,favor_cnt FROM singer "}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(5, 2, 4, '代表作', 'song_name', '代表作', 1, 2, 'categorical', NULL, 'song_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(6, 2, 4, '风格', 'genre', '风格', 1, 2, 'categorical', NULL, 'genre', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); +insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'expr', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'expr', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'expr', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'expr', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); insert into s2_available_date_info(`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` ) values (1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin'); @@ -48,13 +66,64 @@ values (1, '{"domainId":"1","name":"admin-permission","groupId":1,"authRules":[{ insert into s2_auth_groups (group_id, config) values (2, '{"domainId":"1","name":"tom_sales_permission","groupId":2,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":["department in (''sales'')"],"dimensionFilterDescription":"开通 tom sales部门权限", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}'); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); --- insert into s2_user (id, `name`, password, display_name, email) values (1, 'admin','admin','admin','admin@xx.com'); --- insert into s2_user (id, `name`, password, display_name, email) values (2, 'jack','123456','jack','jack@xx.com'); --- insert into s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com'); --- insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy','123456','lucy','lucy@xx.com'); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); ---demo data for semantic and chat +insert into s2_user_department (user_name, department) values ('jack','HR'); + insert into s2_user_department (user_name, department) values ('jack','HR'); insert into s2_user_department (user_name, department) values ('tom','sales'); insert into s2_user_department (user_name, department) values ('lucy','marketing'); diff --git a/launchers/standalone/src/main/resources/db/schema-h2.sql b/launchers/standalone/src/main/resources/db/schema-h2.sql index e75454e90..5bc3bac12 100644 --- a/launchers/standalone/src/main/resources/db/schema-h2.sql +++ b/launchers/standalone/src/main/resources/db/schema-h2.sql @@ -8,7 +8,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_context` `semantic_parse` LONGVARCHAR DEFAULT NULL , -- parse data `ext_data` LONGVARCHAR DEFAULT NULL , -- extend data PRIMARY KEY (`chat_id`) -); + ); CREATE TABLE IF NOT EXISTS `s2_chat` ( @@ -21,7 +21,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat` `is_delete` INT DEFAULT '0' COMMENT 'is deleted', `is_top` INT DEFAULT '0' COMMENT 'is top', PRIMARY KEY (`chat_id`) -) ; + ) ; CREATE TABLE `s2_chat_query` @@ -39,33 +39,30 @@ CREATE TABLE `s2_chat_query` ); - CREATE TABLE IF NOT EXISTS `s2_chat_config` ( - `id` INT NOT NULL AUTO_INCREMENT, - `domain_id` INT DEFAULT NULL , - `default_metrics` varchar(655) DEFAULT NULL, - `visibility` varchar(655) , -- invisible dimension metric information - `entity_info` varchar(655) , - `dictionary_info` varchar(655) , -- dictionary-related dimension setting information + `id` INT NOT NULL AUTO_INCREMENT, + `domain_id` INT DEFAULT NULL , + `chat_detail_config` varchar(655) , + `chat_agg_config` varchar(655) , `created_at` TIMESTAMP NOT NULL , `updated_at` TIMESTAMP NOT NULL , `created_by` varchar(100) NOT NULL , `updated_by` varchar(100) NOT NULL , `status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted PRIMARY KEY (`id`) -) ; + ) ; COMMENT ON TABLE s2_chat_config IS 'chat config information table '; CREATE TABLE IF NOT EXISTS `s2_dictionary` ( - `id` INT NOT NULL AUTO_INCREMENT, - `domain_id` INT NOT NULL , - `dim_value_infos` LONGVARCHAR , -- dimension value setting information - `created_at` TIMESTAMP NOT NULL , - `updated_at` TIMESTAMP NOT NULL , - `created_by` varchar(100) NOT NULL , + `id` INT NOT NULL AUTO_INCREMENT, + `domain_id` INT NOT NULL , + `dim_value_infos` LONGVARCHAR , -- dimension value setting information + `created_at` TIMESTAMP NOT NULL , + `updated_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , `updated_by` varchar(100) DEFAULT NULL , `status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted PRIMARY KEY (`id`), @@ -75,19 +72,19 @@ COMMENT ON TABLE s2_dictionary IS 'dictionary configuration information table'; CREATE TABLE IF NOT EXISTS `s2_dictionary_task` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` varchar(255) NOT NULL , -- task name - `description` varchar(255) , - `command`LONGVARCHAR NOT NULL , -- task Request Parameters - `command_md5` varchar(255) NOT NULL , -- task Request Parameters md5 - `status` INT NOT NULL , -- the final status of the task - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP , - `created_by` varchar(100) NOT NULL , - `progress` DOUBLE default 0.00 , -- task real-time progress - `elapsed_ms` bigINT DEFAULT NULL , -- the task takes time in milliseconds - `message` LONGVARCHAR , -- remark related information - PRIMARY KEY (`id`) -); + `id` INT NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL , -- task name + `description` varchar(255) , + `command`LONGVARCHAR NOT NULL , -- task Request Parameters + `command_md5` varchar(255) NOT NULL , -- task Request Parameters md5 + `status` INT NOT NULL , -- the final status of the task + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP , + `created_by` varchar(100) NOT NULL , + `progress` DOUBLE default 0.00 , -- task real-time progress + `elapsed_ms` bigINT DEFAULT NULL , -- the task takes time in milliseconds + `message` LONGVARCHAR , -- remark related information + PRIMARY KEY (`id`) + ); COMMENT ON TABLE s2_dictionary_task IS 'dictionary task information table'; @@ -306,6 +303,7 @@ CREATE TABLE IF NOT EXISTS `s2_available_date_info` ( `created_by` varchar(100) NOT NULL , `updated_at` TIMESTAMP NOT NULL , `updated_by` varchar(100) NOT NULL , + `date_period` varchar(100) DEFAULT NULL , `status` INT DEFAULT '0', -- 1-in use 0 is normal, 1 is off the shelf, 2 is deleted PRIMARY KEY (`id`) ); @@ -334,6 +332,18 @@ CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` ( ); COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info'; +CREATE TABLE IF NOT EXISTS `singer` ( + `imp_date` varchar(200) NOT NULL, + `singer_name` varchar(200) NOT NULL, + `act_area` varchar(200) NOT NULL, + `song_name` varchar(200) NOT NULL, + `genre` varchar(200) NOT NULL, + `js_play_cnt` bigINT DEFAULT NULL, + `down_cnt` bigINT DEFAULT NULL, + `favor_cnt` bigINT DEFAULT NULL + ); +COMMENT ON TABLE singer IS 'singer_info'; + diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/db/MybatisConfig.java b/launchers/standalone/src/test/java/com/tencent/supersonic/db/MybatisConfig.java deleted file mode 100644 index f3428741a..000000000 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/db/MybatisConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tencent.supersonic.db; - -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; - -import javax.sql.DataSource; - - -@Configuration -@MapperScan(value = "com.tencent.supersonic", annotationClass = Mapper.class) -public class MybatisConfig { - - private static final String MAPPER_LOCATION = "classpath*:mapper/**/*.xml"; - - @Bean - public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { - SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); - org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); - configuration.setMapUnderscoreToCamelCase(true); - bean.setConfiguration(configuration); - bean.setDataSource(dataSource); - - bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION)); - return bean.getObject(); - } -} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnQueryTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnQueryTest.java new file mode 100644 index 000000000..f926defa9 --- /dev/null +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnQueryTest.java @@ -0,0 +1,444 @@ +package com.tencent.supersonic.integration; + +import com.tencent.supersonic.StandaloneLauncher; +import com.tencent.supersonic.chat.api.pojo.Filter; +import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.chat.api.response.QueryResultResp; +import com.tencent.supersonic.chat.application.query.MetricCompare; +import com.tencent.supersonic.chat.application.query.MetricDomain; +import com.tencent.supersonic.chat.application.query.MetricFilter; +import com.tencent.supersonic.chat.application.query.MetricGroupBy; +import com.tencent.supersonic.chat.domain.service.QueryService; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.SchemaItem; +import com.tencent.supersonic.common.util.json.JsonUtil; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.util.DataUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = StandaloneLauncher.class) +@ActiveProfiles("local") +public class MultiTurnQueryTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(MultiTurnQueryTest.class); + + @Autowired + @Qualifier("chatQueryService") + private QueryService queryService; + + //case:alice的访问次数->停留时长呢?->想知道lucy的,queryMode:METRIC_FILTER + @Test + public void queryTest1() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1,"alice的访问次数"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L); + Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter); + assertThat(dimensionFilterExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + + queryContextReq = DataUtils.getQueryContextReq(1,"停留时长呢?"); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics1 = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric1 = DataUtils.getSchemaItem(1L, "停留时长", "stay_hours"); + Boolean metricExist1 = DataUtils.compareSchemaItem(metrics1, schemaItemMetric1); + assertThat(metricExist1).isEqualTo(true); + + //assert 维度 + Set dimensions1 = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist1 = DataUtils.compareDateDimension(dimensions1); + assertThat(dimensionExist1).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters1 = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter1 = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L); + Boolean dimensionFilterExist1 = DataUtils.compareDimensionFilter(dimensionFilters1, dimensionFilter1); + assertThat(dimensionFilterExist1).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo1 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist1 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo1); + assertThat(timeFilterExist1).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + + queryContextReq = DataUtils.getQueryContextReq(1,"想知道lucy的"); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics2 = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric2 = DataUtils.getSchemaItem(1L, "停留时长", "stay_hours"); + Boolean metricExist2 = DataUtils.compareSchemaItem(metrics2, schemaItemMetric2); + assertThat(metricExist2).isEqualTo(true); + + //assert 维度 + Set dimensions2 = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist2 = DataUtils.compareDateDimension(dimensions2); + assertThat(dimensionExist2).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters2 = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter2 = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "lucy", "用户名", 2L); + Boolean dimensionFilterExist2 = DataUtils.compareDimensionFilter(dimensionFilters2, dimensionFilter2); + ; + assertThat(dimensionFilterExist2).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo2 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist2 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo2); + assertThat(timeFilterExist2).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + + //case:超音数的访问次数->按部门的呢->p2的呢 + @Test + public void queryTest2() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2,"超音数的访问次数"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricDomain.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + + queryContextReq = DataUtils.getQueryContextReq(2,"按部门的呢"); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics1 = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric1 = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist1 = DataUtils.compareSchemaItem(metrics1, schemaItemMetric1); + assertThat(metricExist1).isEqualTo(true); + + //assert 维度 + Set dimensions1 = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist1 = DataUtils.compareDateDimension(dimensions1); + assertThat(dimensionExist1).isEqualTo(true); + + SchemaItem schemaItemDimension2 = DataUtils.getSchemaItem(1L, "部门", "department"); + Boolean dimensionExist2 = DataUtils.compareSchemaItem(dimensions1, schemaItemDimension2); + assertThat(dimensionExist2).isEqualTo(true); + + + //assert 时间filter + DateConf dateInfo1 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist1 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo1); + assertThat(timeFilterExist1).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + + queryContextReq = DataUtils.getQueryContextReq(2,"p2的呢"); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics2 = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric2 = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist2 = DataUtils.compareSchemaItem(metrics2, schemaItemMetric2); + assertThat(metricExist2).isEqualTo(true); + + //assert 维度 + Set dimensions2 = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist3 = DataUtils.compareDateDimension(dimensions2); + assertThat(dimensionExist3).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters2 = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter2 = DataUtils.getFilter("page", FilterOperatorEnum.EQUALS, "p2", "页面", 3L); + Boolean dimensionFilterExist2 = DataUtils.compareDimensionFilter(dimensionFilters2, dimensionFilter2); + assertThat(dimensionFilterExist2).isEqualTo(true); + + + //assert 时间filter + DateConf dateInfo2 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist2 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo2); + assertThat(timeFilterExist2).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + //alice的访问次数->对比alice和lucy呢->他是哪个部门的呢 + @Test + public void queryTest3() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1,"alice的访问次数"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L); + Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter); + assertThat(dimensionFilterExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + + queryContextReq = DataUtils.getQueryContextReq(1,"对比alice和lucy呢"); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricCompare.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics1 = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric1 = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist1 = DataUtils.compareSchemaItem(metrics1, schemaItemMetric1); + assertThat(metricExist1).isEqualTo(true); + + //assert 维度 + Set dimensions1 = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist1 = DataUtils.compareDateDimension(dimensions1); + assertThat(dimensionExist1).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters1 = queryResultResp.getChatContext().getDimensionFilters(); + List list = new ArrayList<>(); + list.add("alice"); + list.add("lucy"); + Filter dimensionFilter1 = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list, "用户名", 2L); + Boolean dimensionFilterExist1 = DataUtils.compareDimensionFilter(dimensionFilters1, dimensionFilter1); + assertThat(dimensionFilterExist1).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo1 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist1 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo1); + assertThat(timeFilterExist1).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + + queryContextReq = DataUtils.getQueryContextReq(1,"他是哪个部门的呢"); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics2 = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric2 = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist2 = DataUtils.compareSchemaItem(metrics2, schemaItemMetric2); + assertThat(metricExist2).isEqualTo(true); + + //assert 维度 + Set dimensions2 = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist2 = DataUtils.compareDateDimension(dimensions2); + assertThat(dimensionExist2).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters2 = queryResultResp.getChatContext().getDimensionFilters(); + List list1 = new ArrayList<>(); + list1.add("alice"); + list1.add("lucy"); + Filter dimensionFilter2 = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list1, "用户名", 2L); + Boolean dimensionFilterExist2 = DataUtils.compareDimensionFilter(dimensionFilters2, dimensionFilter2); + assertThat(dimensionFilterExist2).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo2 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist2 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo2); + assertThat(timeFilterExist2).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + + } + + +} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/QueryTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/QueryTest.java new file mode 100644 index 000000000..5ffa68bd5 --- /dev/null +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/QueryTest.java @@ -0,0 +1,567 @@ +package com.tencent.supersonic.integration; + +import com.tencent.supersonic.StandaloneLauncher; +import com.tencent.supersonic.chat.api.pojo.Filter; +import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.chat.api.response.QueryResultResp; +import com.tencent.supersonic.chat.application.query.*; +import com.tencent.supersonic.common.enums.AggregateTypeEnum; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.SchemaItem; +import com.tencent.supersonic.common.util.json.JsonUtil; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.util.DataUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; +import com.tencent.supersonic.chat.domain.service.QueryService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = StandaloneLauncher.class) +@ActiveProfiles("local") +public class QueryTest { + private static final Logger LOGGER = LoggerFactory.getLogger(QueryTest.class); + + @Autowired + @Qualifier("chatQueryService") + private QueryService queryService; + + //case:alice的访问次数,queryMode:METRIC_FILTER, + @Test + public void queryTest_01() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "alice的访问次数"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L); + Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter); + assertThat(dimensionFilterExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + //case:超音数的访问次数,queryMode:METRIC_DOMAIN + @Test + public void queryTest_02() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "超音数的访问次数"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricDomain.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + + //case:超音数各部门的访问次数,queryMode:METRIC_GROUPBY + @Test + public void queryTest_03() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "超音数各部门的访问次数"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(1L, "部门", "department"); + Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1); + assertThat(dimensionExist1).isEqualTo(true); + + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + + //case:对比alice和lucy的访问次数,queryMode:METRIC_COMPARE + @Test + public void queryTest_04() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "对比alice和lucy的访问次数"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricCompare.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); + List list = new ArrayList<>(); + list.add("alice"); + list.add("lucy"); + Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list, "用户名", 2L); + Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter); + assertThat(dimensionFilterExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + //case:近3天访问次数最多的用户,queryMode:ENTITY_detail + @Test + public void queryTest_05() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "艺人周杰伦的代表作"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), EntityDetail.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L); + + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + SchemaItem schemaItemDimension = DataUtils.getSchemaItem(5L, "代表作", "song_name"); + Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension); + assertThat(dimensionExist).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, "周杰伦", "歌手名", 7L); + Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter); + assertThat(dimensionFilterExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true); + + } + + //case:近3天访问次数最多的用户名,queryMode:METRIC_ORDERBY + @Test + public void queryTest_06() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "近3天访问次数最多的用户名"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricOrderBy.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), AggregateTypeEnum.MAX); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + SchemaItem schemaItemDimension = DataUtils.getSchemaItem(2L, "用户名", "user_name"); + Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension); + assertThat(dimensionExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(3, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + + //case:播放量最多的艺人,queryMode:ENTITY_LIST_TOPN + @Test + public void queryTest_07() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "播放量最多的艺人"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), EntityListTopN.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), AggregateTypeEnum.MAX); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + SchemaItem schemaItemDimension = DataUtils.getSchemaItem(7L, "歌手名", "singer_name"); + Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension); + assertThat(dimensionExist).isEqualTo(true); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(4L, "播放量", "js_play_cnt"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true); + + } + + //case:超音数各部门的访问次数总和,queryMode:METRIC_GROUPBY,aggType:sum + @Test + public void queryTest_09() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "超音数各部门的访问次数总和"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), AggregateTypeEnum.SUM); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); + assertThat(dimensionExist).isEqualTo(true); + + SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(1L, "部门", "department"); + Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1); + assertThat(dimensionExist1).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + ; + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); + + } + + @Test + public void queryTest_10() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "爱情、流行类型的艺人"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), EntityListFilter.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L); + + //assert 指标 + Set metrics = queryResultResp.getChatContext().getMetrics(); + SchemaItem schemaItemMetric = DataUtils.getSchemaItem(4L, "播放量", "js_play_cnt"); + Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); + assertThat(metricExist).isEqualTo(true); + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + SchemaItem schemaItemDimension = DataUtils.getSchemaItem(7L, "歌手名", "singer_name"); + Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension); + assertThat(dimensionExist).isEqualTo(true); + + SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(6L, "风格", "genre"); + Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1); + assertThat(dimensionExist1).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); + List list = new ArrayList<>(); + list.add("爱情"); + list.add("流行"); + Filter dimensionFilter = DataUtils.getFilter("genre", FilterOperatorEnum.IN, list, "风格", 6L); + Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter); + assertThat(dimensionFilterExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true); + + } + + //case:近3天访问次数最多的用户,queryMode:ENTITY_detail + @Test + public void queryTest_11() { + QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "艺人周杰伦的代表作、风格、活跃区域"); + QueryResultResp queryResultResp = new QueryResultResp(); + try { + queryResultResp = queryService.executeQuery(queryContextReq); + } catch (Exception e) { + + } + LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp); + //assert queryState + Assert.assertEquals(queryResultResp.getQueryState(), 0); + //assert queryMode + Assert.assertEquals(queryResultResp.getQueryMode(), EntityDetail.QUERY_MODE); + //assert aggType + Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); + //assert 主题域Id + assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L); + + + //assert 维度 + Set dimensions = queryResultResp.getChatContext().getDimensions(); + SchemaItem schemaItemDimension = DataUtils.getSchemaItem(5L, "代表作", "song_name"); + Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension); + assertThat(dimensionExist).isEqualTo(true); + + SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(4L, "活跃区域", "act_area"); + Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1); + assertThat(dimensionExist1).isEqualTo(true); + + SchemaItem schemaItemDimension2 = DataUtils.getSchemaItem(6L, "风格", "genre"); + Boolean dimensionExist2 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension2); + assertThat(dimensionExist2).isEqualTo(true); + + //assert 维度filter + Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); + Filter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, "周杰伦", "歌手名", 7L); + Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter); + assertThat(dimensionFilterExist).isEqualTo(true); + + //assert 时间filter + DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY"); + Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); + assertThat(timeFilterExist).isEqualTo(true); + + //assert nativeQuery + assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true); + + } + + // @Test +// public void queryTest_11() { +// QueryContextReq queryContextReq = DataUtils.getQueryContextReq("最近4天HR部门的访问人数"); +// try { +// QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +//case:各部门对各页面的访问次数,queryMode:METRIC_GROUPBY +// @Test +// public void queryTest_08() { +// QueryContextReq queryContextReq = DataUtils.getQueryContextReq(3, "各部门对各页面的访问次数"); +// QueryResultResp queryResultResp = new QueryResultResp(); +// try { +// queryResultResp = queryService.executeQuery(queryContextReq); +// } catch (Exception e) { +// +// } +// LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp)); +// //assert queryState +// Assert.assertEquals(queryResultResp.getQueryState(), 0); +// //assert queryMode +// Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE); +// //assert aggType +// Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); +// //assert 主题域Id +// assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); +// +// //assert 指标 +// Set metrics = queryResultResp.getChatContext().getMetrics(); +// SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv"); +// Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric); +// assertThat(metricExist).isEqualTo(true); +// +// //assert 维度 +// Set dimensions = queryResultResp.getChatContext().getDimensions(); +// Boolean dimensionExist = DataUtils.compareDateDimension(dimensions); +// assertThat(dimensionExist).isEqualTo(true); +// +// SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(1L, "部门", "department"); +// Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1); +// assertThat(dimensionExist1).isEqualTo(true); +// +// SchemaItem schemaItemDimension2 = DataUtils.getSchemaItem(3L, "页面", "page"); +// Boolean dimensionExist2 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension2); +// assertThat(dimensionExist2).isEqualTo(true); +// +// +// //assert 时间filter +// DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY"); +// Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo); +// assertThat(timeFilterExist).isEqualTo(true); +// +// //assert nativeQuery +// assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); +// +// } + +} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/test/QueryIntegrationTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/test/QueryIntegrationTest.java deleted file mode 100644 index 14bf6ff77..000000000 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/test/QueryIntegrationTest.java +++ /dev/null @@ -1,371 +0,0 @@ -package com.tencent.supersonic.test; - -import com.tencent.supersonic.StandaloneLauncher; -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.pojo.Filter; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.application.query.MetricCompare; -import com.tencent.supersonic.chat.application.query.MetricDomain; -import com.tencent.supersonic.chat.application.query.MetricFilter; -import com.tencent.supersonic.chat.application.query.MetricGroupBy; -import com.tencent.supersonic.chat.domain.service.ChatService; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; -import com.tencent.supersonic.chat.domain.service.QueryService; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = StandaloneLauncher.class) -@ActiveProfiles("local") -public class QueryIntegrationTest { - - private static final Logger LOGGER = LoggerFactory.getLogger(QueryIntegrationTest.class); - - @Autowired - private ChatService chatService; - - @Autowired - @Qualifier("chatQueryService") - private QueryService queryService; - - //case:alice的访问次数,queryMode:METRIC_FILTER, - @Test - public void queryTest1() { - QueryContextReq queryContextReq = getQueryContextReq("alice的访问次数"); - try { - QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq); - LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp); - //assert queryState - Assert.assertEquals(queryResultResp.getQueryState(), 0); - //assert queryMode - Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE); - //assert aggType - Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); - //assert 主题域Id - assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); - - //assert 指标 - Set metrics = queryResultResp.getChatContext().getMetrics(); - SchemaItem schemaItemMetric = new SchemaItem(); - schemaItemMetric.setId(2L); - schemaItemMetric.setName("访问次数"); - schemaItemMetric.setBizName("pv"); - Boolean metricExist = false; - for (SchemaItem schemaItem : metrics) { - if (schemaItem.getId().equals(schemaItemMetric.getId()) && - schemaItem.getName().equals(schemaItemMetric.getName()) && - schemaItem.getBizName().equals(schemaItemMetric.getBizName())) { - metricExist = true; - } - } - assertThat(metricExist).isEqualTo(true); - - //assert 维度 - Set dimensions = queryResultResp.getChatContext().getDimensions(); - SchemaItem schemaItemDimension = new SchemaItem(); - schemaItemDimension.setBizName("sys_imp_date"); - Boolean dimensionExist = false; - for (SchemaItem schemaItem : dimensions) { - if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) { - dimensionExist = true; - } - } - assertThat(dimensionExist).isEqualTo(true); - - //assert 维度filter - Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); - Filter dimensionFilter = new Filter(); - dimensionFilter.setBizName("user_name"); - dimensionFilter.setOperator(FilterOperatorEnum.EQUALS); - dimensionFilter.setValue("alice"); - dimensionFilter.setName("用户名"); - dimensionFilter.setElementID(2L); - Boolean dimensionFilterExist = false; - for (Filter filter : dimensionFilters) { - if (filter.getBizName().equals(dimensionFilter.getBizName()) && - filter.getOperator().equals(dimensionFilter.getOperator()) && - filter.getValue().equals(dimensionFilter.getValue()) && - filter.getElementID().equals(dimensionFilter.getElementID()) && - filter.getName().equals(dimensionFilter.getName())) { - dimensionFilterExist = true; - } - } - assertThat(dimensionFilterExist).isEqualTo(true); - - //assert 时间filter - DateConf dateInfo = new DateConf(); - dateInfo.setUnit(7); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setPeriod("DAY"); - Boolean timeFilterExist = - queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) && - queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode()) - && - queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod()); - assertThat(timeFilterExist).isEqualTo(true); - - //assert nativeQuery - assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); - - } catch (Exception e) { - - } - } - - //case:超音数的访问次数,queryMode:METRIC_DOMAIN - @Test - public void queryTest2() { - QueryContextReq queryContextReq = getQueryContextReq("超音数的访问次数"); - try { - QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq); - LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp); - //assert queryState - Assert.assertEquals(queryResultResp.getQueryState(), 0); - //assert queryMode - Assert.assertEquals(queryResultResp.getQueryMode(), MetricDomain.QUERY_MODE); - //assert aggType - Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); - //assert 主题域Id - assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); - - //assert 指标 - Set metrics = queryResultResp.getChatContext().getMetrics(); - SchemaItem schemaItemMetric = new SchemaItem(); - schemaItemMetric.setId(2L); - schemaItemMetric.setName("访问次数"); - schemaItemMetric.setBizName("pv"); - Boolean metricExist = false; - for (SchemaItem schemaItem : metrics) { - if (schemaItem.getId().equals(schemaItemMetric.getId()) && - schemaItem.getName().equals(schemaItemMetric.getName()) && - schemaItem.getBizName().equals(schemaItemMetric.getBizName())) { - metricExist = true; - } - } - assertThat(metricExist).isEqualTo(true); - - //assert 维度 - Set dimensions = queryResultResp.getChatContext().getDimensions(); - SchemaItem schemaItemDimension = new SchemaItem(); - schemaItemDimension.setBizName("sys_imp_date"); - Boolean dimensionExist = false; - for (SchemaItem schemaItem : dimensions) { - if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) { - dimensionExist = true; - } - } - assertThat(dimensionExist).isEqualTo(true); - - //assert 时间filter - DateConf dateInfo = new DateConf(); - dateInfo.setUnit(7); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setPeriod("DAY"); - Boolean timeFilterExist = - queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) && - queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode()) - && - queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod()); - assertThat(timeFilterExist).isEqualTo(true); - - //assert nativeQuery - assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); - - } catch (Exception e) { - - } - } - - - //case:超音数各部门的访问次数,queryMode:METRIC_GROUPBY - @Test - public void queryTest3() { - QueryContextReq queryContextReq = getQueryContextReq("超音数各部门的访问次数"); - try { - QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq); - LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp); - //assert queryState - Assert.assertEquals(queryResultResp.getQueryState(), 0); - //assert queryMode - Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE); - //assert aggType - Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); - //assert 主题域Id - assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); - - //assert 指标 - Set metrics = queryResultResp.getChatContext().getMetrics(); - SchemaItem schemaItemMetric = new SchemaItem(); - schemaItemMetric.setId(2L); - schemaItemMetric.setName("访问次数"); - schemaItemMetric.setBizName("pv"); - Boolean metricExist = false; - for (SchemaItem schemaItem : metrics) { - if (schemaItem.getId().equals(schemaItemMetric.getId()) && - schemaItem.getName().equals(schemaItemMetric.getName()) && - schemaItem.getBizName().equals(schemaItemMetric.getBizName())) { - metricExist = true; - } - } - assertThat(metricExist).isEqualTo(true); - - //assert 维度 - Set dimensions = queryResultResp.getChatContext().getDimensions(); - SchemaItem schemaItemDimension = new SchemaItem(); - schemaItemDimension.setBizName("sys_imp_date"); - Boolean dimensionExist = false; - for (SchemaItem schemaItem : dimensions) { - if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) { - dimensionExist = true; - } - } - assertThat(dimensionExist).isEqualTo(true); - - SchemaItem schemaItemDimension1 = new SchemaItem(); - schemaItemDimension1.setBizName("department"); - schemaItemDimension1.setName("部门"); - schemaItemDimension1.setId(1L); - Boolean dimensionExist1 = false; - for (SchemaItem schemaItem : dimensions) { - if (schemaItem.getBizName().equals(schemaItemDimension1.getBizName()) && - schemaItem.getId().equals(schemaItemDimension1.getId()) && - schemaItem.getName().equals(schemaItemDimension1.getName())) { - dimensionExist1 = true; - } - } - assertThat(dimensionExist1).isEqualTo(true); - - //assert 时间filter - DateConf dateInfo = new DateConf(); - dateInfo.setUnit(7); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setPeriod("DAY"); - Boolean timeFilterExist = - queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) && - queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode()) - && - queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod()); - assertThat(timeFilterExist).isEqualTo(true); - - //assert nativeQuery - assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); - - } catch (Exception e) { - - } - } - - - //case:对比alice和lucy的访问次数,queryMode:METRIC_COMPARE - @Test - public void queryTest4() { - QueryContextReq queryContextReq = getQueryContextReq("对比alice和lucy的访问次数"); - try { - QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq); - LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp); - //assert queryState - Assert.assertEquals(queryResultResp.getQueryState(), 0); - //assert queryMode - Assert.assertEquals(queryResultResp.getQueryMode(), MetricCompare.QUERY_MODE); - //assert aggType - Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null); - //assert 主题域Id - assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L); - - //assert 指标 - Set metrics = queryResultResp.getChatContext().getMetrics(); - SchemaItem schemaItemMetric = new SchemaItem(); - schemaItemMetric.setId(2L); - schemaItemMetric.setName("访问次数"); - schemaItemMetric.setBizName("pv"); - Boolean metricExist = false; - for (SchemaItem schemaItem : metrics) { - if (schemaItem.getId().equals(schemaItemMetric.getId()) && - schemaItem.getName().equals(schemaItemMetric.getName()) && - schemaItem.getBizName().equals(schemaItemMetric.getBizName())) { - metricExist = true; - } - } - assertThat(metricExist).isEqualTo(true); - - //assert 维度 - Set dimensions = queryResultResp.getChatContext().getDimensions(); - SchemaItem schemaItemDimension = new SchemaItem(); - schemaItemDimension.setBizName("sys_imp_date"); - Boolean dimensionExist = false; - for (SchemaItem schemaItem : dimensions) { - if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) { - dimensionExist = true; - } - } - assertThat(dimensionExist).isEqualTo(true); - - //assert 维度filter - Set dimensionFilters = queryResultResp.getChatContext().getDimensionFilters(); - Filter dimensionFilter = new Filter(); - dimensionFilter.setBizName("user_name"); - dimensionFilter.setOperator(FilterOperatorEnum.IN); - List list = new ArrayList<>(); - list.add("alice"); - list.add("lucy"); - dimensionFilter.setValue(list); - dimensionFilter.setName("用户名"); - dimensionFilter.setElementID(2L); - Boolean dimensionFilterExist = false; - for (Filter filter : dimensionFilters) { - if (filter.getBizName().equals(dimensionFilter.getBizName()) && - filter.getOperator().equals(dimensionFilter.getOperator()) && - filter.getValue().toString().equals(dimensionFilter.getValue().toString()) && - filter.getElementID().equals(dimensionFilter.getElementID()) && - filter.getName().equals(dimensionFilter.getName())) { - dimensionFilterExist = true; - } - } - assertThat(dimensionFilterExist).isEqualTo(true); - - //assert 时间filter - DateConf dateInfo = new DateConf(); - dateInfo.setUnit(7); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setPeriod("DAY"); - Boolean timeFilterExist = - queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) && - queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode()) - && - queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod()); - assertThat(timeFilterExist).isEqualTo(true); - - //assert nativeQuery - assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false); - - } catch (Exception e) { - - } - } - - public QueryContextReq getQueryContextReq(String query) { - QueryContextReq queryContextReq = new QueryContextReq(); - queryContextReq.setQueryText(query);//"alice的访问次数" - queryContextReq.setChatId(1); - queryContextReq.setUser(new User(1L, "admin", "admin", "admin@email")); - return queryContextReq; - } - -} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java b/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java new file mode 100644 index 000000000..3901badf3 --- /dev/null +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java @@ -0,0 +1,95 @@ +package com.tencent.supersonic.util; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.pojo.Filter; +import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.SchemaItem; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; + +import java.util.Set; + +public class DataUtils { + + public static QueryContextReq getQueryContextReq(Integer id,String query) { + QueryContextReq queryContextReq = new QueryContextReq(); + queryContextReq.setQueryText(query);//"alice的访问次数" + queryContextReq.setChatId(id); + queryContextReq.setUser(new User(1L, "admin", "admin", "admin@email")); + return queryContextReq; + } + + public static SchemaItem getSchemaItem(Long id, String name, String bizName) { + SchemaItem schemaItem = new SchemaItem(); + schemaItem.setId(id); + schemaItem.setName(name); + schemaItem.setBizName(bizName); + return schemaItem; + } + + public static Filter getFilter(String bizName, FilterOperatorEnum filterOperatorEnum, Object value, String name, + Long elementId) { + Filter filter = new Filter(); + filter.setBizName(bizName); + filter.setOperator(filterOperatorEnum); + filter.setValue(value); + filter.setName(name); + filter.setElementID(elementId); + return filter; + } + + public static DateConf getDateConf(Integer unit, DateConf.DateMode dateMode, String period) { + DateConf dateInfo = new DateConf(); + dateInfo.setUnit(unit); + dateInfo.setDateMode(dateMode); + dateInfo.setPeriod(period); + return dateInfo; + } + + + public static Boolean compareDate(DateConf dateInfo1, DateConf dateInfo2) { + Boolean timeFilterExist = dateInfo1.getUnit().equals(dateInfo2.getUnit()) && + dateInfo1.getDateMode().equals(dateInfo2.getDateMode()) && + dateInfo1.getPeriod().equals(dateInfo2.getPeriod()); + return timeFilterExist; + } + + public static Boolean compareSchemaItem(Set metrics, SchemaItem schemaItemMetric) { + Boolean metricExist = false; + for (SchemaItem schemaItem : metrics) { + if(schemaItem.getBizName().equals(schemaItemMetric.getBizName())) + if (schemaItem.getId()!=null&&schemaItem.getId().equals(schemaItemMetric.getId()) && + schemaItem.getName()!=null&&schemaItem.getName().equals(schemaItemMetric.getName()) ) { + metricExist = true; + } + } + return metricExist; + } + + public static Boolean compareDateDimension(Set dimensions) { + SchemaItem schemaItemDimension = new SchemaItem(); + schemaItemDimension.setBizName("sys_imp_date"); + Boolean dimensionExist = false; + for (SchemaItem schemaItem : dimensions) { + if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) { + dimensionExist = true; + } + } + return dimensionExist; + } + + public static Boolean compareDimensionFilter(Set dimensionFilters, Filter dimensionFilter) { + Boolean dimensionFilterExist = false; + for (Filter filter : dimensionFilters) { + if (filter.getBizName().equals(dimensionFilter.getBizName()) && + filter.getOperator().equals(dimensionFilter.getOperator()) && + filter.getValue().toString().equals(dimensionFilter.getValue().toString()) && + filter.getElementID().equals(dimensionFilter.getElementID()) && + filter.getName().equals(dimensionFilter.getName())) { + dimensionFilterExist = true; + } + } + return dimensionFilterExist; + } + +} diff --git a/launchers/standalone/src/test/resources/data/dictionary/custom/DimValue_1_2.txt b/launchers/standalone/src/test/resources/data/dictionary/custom/DimValue_1_2.txt index e0570f4b0..7e06c5619 100644 --- a/launchers/standalone/src/test/resources/data/dictionary/custom/DimValue_1_2.txt +++ b/launchers/standalone/src/test/resources/data/dictionary/custom/DimValue_1_2.txt @@ -4,4 +4,16 @@ lucy _1_2 31 dean _1_2 36 john _1_2 50 jack _1_2 38 -admin _1_2 70 \ No newline at end of file +admin _1_2 70 +周杰伦 _2_7 100 +陈奕迅 _2_7 100 +林俊杰 _2_7 100 +张碧晨 _2_7 100 +程响 _2_7 100 +Taylor#Swift _2_7 100 +中国 _2_4 100 +欧美 _2_4 100 +流行 _2_6 100 +爱情 _2_6 100 +激情 _2_6 100 +国风 _2_6 100 diff --git a/launchers/standalone/src/test/resources/db/data-h2.sql b/launchers/standalone/src/test/resources/db/data-h2.sql index 61413b07d..6188a1aa6 100644 --- a/launchers/standalone/src/test/resources/db/data-h2.sql +++ b/launchers/standalone/src/test/resources/db/data-h2.sql @@ -4,7 +4,15 @@ insert into s2_user (id, `name`, password, display_name, email) values (2, 'jack insert into s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com'); insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy','123456','lucy','lucy@xx.com'); -insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +--insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) +values (1,1,'{"visibility":{"blackDimIdList":[1],"blackMetricIdList":[2]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"},"entity":null}', + '{"visibility":{"blackDimIdList":[3],"blackMetricIdList":[3]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"}}', + '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) +values (2,2,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":1,"names":["歌手","艺人"]}}', + '{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"}}', + '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (1, '超音数访问统计','2023-06-10 10:00:52.495','2023-06-10 10:00:52','admin','您好,欢迎使用内容智能小Q','0','0'); insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (2, '用户访问统计','2023-06-10 10:01:04.528','2023-06-10 10:01:04','admin','您好,欢迎使用内容智能小Q','0','0'); @@ -22,19 +30,29 @@ insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`, -- semantic data insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); +insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(2, 2, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 'PVUV统计', 's2_pv_uv_statis', 'PVUV统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","expr":"pv","isCreateMetric":1,"name":"访问次数"},{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","expr":"uv","isCreateMetric":1,"name":"访问人数"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, user_name,page,1 as pv, user_name as uv FROM s2_pv_uv_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, '用户部门', 'user_department', '用户部门', 1, '{"dimensions":[{"bizName":"department","dateFormat":"yyyy-MM-dd","expr":"department","isCreateDimension":1,"name":"部门","type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[],"queryType":"sql_query","sqlQuery":"SELECT user_name,department FROM s2_user_department"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(4, 2, '艺人库', 'singer', '艺人库', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"act_area","dateFormat":"yyyy-MM-dd","expr":"act_area","isCreateDimension":1,"name":"活跃区域","type":"categorical"},{"bizName":"song_name","dateFormat":"yyyy-MM-dd","expr":"song_name","isCreateDimension":1,"name":"代表作","type":"categorical"},{"bizName":"genre","dateFormat":"yyyy-MM-dd","expr":"genre","isCreateDimension":1,"name":"风格","type":"categorical"}],"identifiers":[{"bizName":"singer_name","name":"歌手名","type":"primary"}],"measures":[{"agg":"sum","bizName":"music_down_cnt","expr":"down_cnt","isCreateMetric":1,"name":"下载量"},{"agg":"sum","bizName":"music_js_play_cnt","expr":"js_play_cnt","isCreateMetric":1,"name":"播放量"},{"agg":"sum","bizName":"music_favor_cnt","expr":"favor_cnt","isCreateMetric":1,"name":"收藏量"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date,singer_name,act_area,song_name,genre,js_play_cnt,down_cnt,favor_cnt FROM singer "}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(5, 2, 4, '代表作', 'song_name', '代表作', 1, 2, 'categorical', NULL, 'song_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(6, 2, 4, '风格', 'genre', '风格', 1, 2, 'categorical', NULL, 'genre', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); +insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'expr', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'expr', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'expr', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'expr', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); insert into s2_available_date_info(`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` ) values (1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin'); @@ -48,13 +66,64 @@ values (1, '{"domainId":"1","name":"admin-permission","groupId":1,"authRules":[{ insert into s2_auth_groups (group_id, config) values (2, '{"domainId":"1","name":"tom_sales_permission","groupId":2,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":["department in (''sales'')"],"dimensionFilterDescription":"开通 tom sales部门权限", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}'); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); --- insert into s2_user (id, `name`, password, display_name, email) values (1, 'admin','admin','admin','admin@xx.com'); --- insert into s2_user (id, `name`, password, display_name, email) values (2, 'jack','123456','jack','jack@xx.com'); --- insert into s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com'); --- insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy','123456','lucy','lucy@xx.com'); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); + +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); ---demo data for semantic and chat +insert into s2_user_department (user_name, department) values ('jack','HR'); + insert into s2_user_department (user_name, department) values ('jack','HR'); insert into s2_user_department (user_name, department) values ('tom','sales'); insert into s2_user_department (user_name, department) values ('lucy','marketing'); diff --git a/launchers/standalone/src/test/resources/db/schema-h2.sql b/launchers/standalone/src/test/resources/db/schema-h2.sql index e75454e90..6d41f684a 100644 --- a/launchers/standalone/src/test/resources/db/schema-h2.sql +++ b/launchers/standalone/src/test/resources/db/schema-h2.sql @@ -39,14 +39,11 @@ CREATE TABLE `s2_chat_query` ); - CREATE TABLE IF NOT EXISTS `s2_chat_config` ( `id` INT NOT NULL AUTO_INCREMENT, `domain_id` INT DEFAULT NULL , - `default_metrics` varchar(655) DEFAULT NULL, - `visibility` varchar(655) , -- invisible dimension metric information - `entity_info` varchar(655) , - `dictionary_info` varchar(655) , -- dictionary-related dimension setting information + `chat_detail_config` varchar(655) , + `chat_agg_config` varchar(655) , `created_at` TIMESTAMP NOT NULL , `updated_at` TIMESTAMP NOT NULL , `created_by` varchar(100) NOT NULL , @@ -306,6 +303,7 @@ CREATE TABLE IF NOT EXISTS `s2_available_date_info` ( `created_by` varchar(100) NOT NULL , `updated_at` TIMESTAMP NOT NULL , `updated_by` varchar(100) NOT NULL , + `date_period` varchar(100) DEFAULT NULL , `status` INT DEFAULT '0', -- 1-in use 0 is normal, 1 is off the shelf, 2 is deleted PRIMARY KEY (`id`) ); @@ -334,6 +332,18 @@ CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` ( ); COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info'; +CREATE TABLE IF NOT EXISTS `singer` ( + `imp_date` varchar(200) NOT NULL, + `singer_name` varchar(200) NOT NULL, + `act_area` varchar(200) NOT NULL, + `song_name` varchar(200) NOT NULL, + `genre` varchar(200) NOT NULL, + `js_play_cnt` bigINT DEFAULT NULL, + `down_cnt` bigINT DEFAULT NULL, + `favor_cnt` bigINT DEFAULT NULL + ); +COMMENT ON TABLE singer IS 'singer_info'; + diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryColumn.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryColumn.java index 6fa981635..748f3f362 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryColumn.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryColumn.java @@ -14,6 +14,8 @@ public class QueryColumn { private String nameEn; private String showType; private Boolean authorized = true; + private String dataFormatType; + private DataFormat dataFormat; public QueryColumn(String nameEn, String type) { this.type = type; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/DateInfoReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/DateInfoReq.java index 74cc43f28..cf2f0e15a 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/DateInfoReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/DateInfoReq.java @@ -18,6 +18,7 @@ public class DateInfoReq { private String dateFormat; private String startDate; private String endDate; + private String datePeriod; private List unavailableDateList = new ArrayList<>(); public DateInfoReq(String type, Long itemId, String dateFormat, String startDate, String endDate) { @@ -27,4 +28,15 @@ public class DateInfoReq { this.startDate = startDate; this.endDate = endDate; } + + public DateInfoReq(String type, Long itemId, String dateFormat, String startDate, String endDate, + List unavailableDateList) { + this.type = type; + this.itemId = itemId; + this.dateFormat = dateFormat; + this.startDate = startDate; + this.endDate = endDate; + this.unavailableDateList = unavailableDateList; + } + } \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/MetricReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/MetricReq.java index b7f6cf337..0eef7bc0b 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/MetricReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/MetricReq.java @@ -19,11 +19,10 @@ public class MetricReq extends MetricBaseReq { return metricType; } List measureList = typeParams.getMeasures(); - if (measureList.size() > 1) { - return MetricTypeEnum.DERIVED; - } if (measureList.size() == 1 && typeParams.getExpr().trim().equalsIgnoreCase(measureList.get(0).getBizName())) { return MetricTypeEnum.ATOMIC; + } else if (measureList.size() >= 1) { + return MetricTypeEnum.DERIVED; } throw new RuntimeException("measure can not be none"); } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/PageMetricReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/PageMetricReq.java index 715fad78c..f283becd2 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/PageMetricReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/PageMetricReq.java @@ -7,5 +7,6 @@ import lombok.Data; @Data public class PageMetricReq extends PageSchemaItemReq { + private String type; } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/response/ItemDateResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/response/ItemDateResp.java index 1df4272b7..0a62e1b6a 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/response/ItemDateResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/response/ItemDateResp.java @@ -18,5 +18,6 @@ public class ItemDateResp { private String dateFormat; private String startDate; private String endDate; + private String datePeriod; private List unavailableDateList = new ArrayList<>(); } \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java index 3fc11f3b9..9d8722d13 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ParseSqlReq.java @@ -4,7 +4,6 @@ import com.tencent.supersonic.semantic.api.query.pojo.MetricTable; import java.util.HashMap; import java.util.List; import java.util.Map; - import lombok.Data; @Data @@ -12,7 +11,7 @@ public class ParseSqlReq { private String rootPath = ""; private Map variables; - private String sql; + private String sql = ""; private List tables; public Map getVariables() { diff --git a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/application/CatalogImpl.java b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/application/CatalogImpl.java new file mode 100644 index 000000000..615e950c7 --- /dev/null +++ b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/application/CatalogImpl.java @@ -0,0 +1,93 @@ +package com.tencent.supersonic.semantic.core.application; + +import com.tencent.supersonic.semantic.api.core.pojo.ItemDateFilter; +import com.tencent.supersonic.semantic.api.core.pojo.yaml.DatasourceYamlTpl; +import com.tencent.supersonic.semantic.api.core.pojo.yaml.DimensionYamlTpl; +import com.tencent.supersonic.semantic.api.core.pojo.yaml.MetricYamlTpl; +import com.tencent.supersonic.semantic.api.core.response.DatabaseResp; +import com.tencent.supersonic.semantic.api.core.response.DatasourceResp; +import com.tencent.supersonic.semantic.api.core.response.DimensionResp; +import com.tencent.supersonic.semantic.api.core.response.ItemDateResp; +import com.tencent.supersonic.semantic.api.core.response.MetricResp; +import com.tencent.supersonic.semantic.core.domain.Catalog; +import com.tencent.supersonic.semantic.core.domain.DatasourceService; +import com.tencent.supersonic.semantic.core.domain.DimensionService; +import com.tencent.supersonic.semantic.core.domain.DomainService; +import com.tencent.supersonic.semantic.core.domain.MetricService; +import com.tencent.supersonic.semantic.core.domain.dataobject.DatabaseDO; +import com.tencent.supersonic.semantic.core.domain.repository.DatabaseRepository; +import com.tencent.supersonic.semantic.core.domain.utils.DatabaseConverter; +import java.util.List; +import java.util.Map; +import java.util.Set; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class CatalogImpl implements Catalog { + + private final DatabaseRepository databaseRepository; + private final DomainService domainService; + private final DimensionService dimensionService; + private final DatasourceService datasourceService; + private final MetricService metricService; + + public CatalogImpl(DatabaseRepository databaseRepository, + DomainService domainService, DimensionService dimensionService, + DatasourceService datasourceService, + MetricService metricService) { + this.databaseRepository = databaseRepository; + this.domainService = domainService; + this.dimensionService = dimensionService; + this.datasourceService = datasourceService; + this.metricService = metricService; + } + + public DatabaseResp getDatabase(Long id) { + DatabaseDO databaseDO = databaseRepository.getDatabase(id); + return DatabaseConverter.convert(databaseDO); + } + + @Override + public String getDomainFullPath(Long domainId) { + return domainService.getDomainFullPath(domainId); + } + + @Override + public Map getDomainFullPath() { + return domainService.getDomainFullPath(); + } + + @Override + public DimensionResp getDimension(String bizName, Long domainId) { + return dimensionService.getDimension(bizName, domainId); + } + + @Override + public void getModelYamlTplByDomainIds(Set domainIds, Map> dimensionYamlMap, + List datasourceYamlTplList, List metricYamlTplList) { + datasourceService.getModelYamlTplByDomainIds(domainIds, dimensionYamlMap, datasourceYamlTplList, + metricYamlTplList); + } + + @Override + public List getDimensions(Long domainId) { + return dimensionService.getDimensions(domainId); + } + + @Override + public List getDatasourceList(Long domainId) { + return datasourceService.getDatasourceList(domainId); + } + + @Override + public List getMetrics(Long domainId) { + return metricService.getMetrics(domainId); + } + + @Override + public ItemDateResp getDateDate(ItemDateFilter dimension, ItemDateFilter metric) { + return datasourceService.getDateDate(dimension, metric); + } +} diff --git a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/application/DatasourceServiceImpl.java b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/application/DatasourceServiceImpl.java index 139b92f6c..cb87e595d 100644 --- a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/application/DatasourceServiceImpl.java +++ b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/application/DatasourceServiceImpl.java @@ -3,6 +3,7 @@ package com.tencent.supersonic.semantic.core.application; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.common.util.json.JsonUtil; import com.tencent.supersonic.semantic.api.core.pojo.DatasourceDetail; import com.tencent.supersonic.semantic.api.core.pojo.Dim; import com.tencent.supersonic.semantic.api.core.pojo.ItemDateFilter; @@ -22,25 +23,22 @@ import com.tencent.supersonic.semantic.api.core.response.DimensionResp; import com.tencent.supersonic.semantic.api.core.response.ItemDateResp; import com.tencent.supersonic.semantic.api.core.response.MeasureResp; import com.tencent.supersonic.semantic.api.core.response.MetricResp; -import com.tencent.supersonic.common.util.json.JsonUtil; +import com.tencent.supersonic.semantic.core.domain.DatabaseService; +import com.tencent.supersonic.semantic.core.domain.DatasourceService; +import com.tencent.supersonic.semantic.core.domain.DimensionService; +import com.tencent.supersonic.semantic.core.domain.MetricService; import com.tencent.supersonic.semantic.core.domain.dataobject.DatasourceDO; import com.tencent.supersonic.semantic.core.domain.dataobject.DatasourceRelaDO; import com.tencent.supersonic.semantic.core.domain.dataobject.DateInfoDO; import com.tencent.supersonic.semantic.core.domain.manager.DatasourceYamlManager; import com.tencent.supersonic.semantic.core.domain.manager.DimensionYamlManager; import com.tencent.supersonic.semantic.core.domain.manager.MetricYamlManager; +import com.tencent.supersonic.semantic.core.domain.pojo.Datasource; import com.tencent.supersonic.semantic.core.domain.repository.DatasourceRepository; import com.tencent.supersonic.semantic.core.domain.repository.DateInfoRepository; import com.tencent.supersonic.semantic.core.domain.utils.DatasourceConverter; import com.tencent.supersonic.semantic.core.domain.utils.DimensionConverter; import com.tencent.supersonic.semantic.core.domain.utils.MetricConverter; -import com.tencent.supersonic.semantic.core.domain.DatabaseService; -import com.tencent.supersonic.semantic.core.domain.DatasourceService; -import com.tencent.supersonic.semantic.core.domain.DimensionService; -import com.tencent.supersonic.semantic.core.domain.DomainService; -import com.tencent.supersonic.semantic.core.domain.MetricService; -import com.tencent.supersonic.semantic.core.domain.pojo.Datasource; - import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -338,6 +336,7 @@ public class DatasourceServiceImpl implements DatasourceService { String dateFormat = itemDates.get(0).getDateFormat(); String startDate = itemDates.get(0).getStartDate(); String endDate = itemDates.get(0).getEndDate(); + String datePeriod = itemDates.get(0).getDatePeriod(); List unavailableDateList = itemDates.get(0).getUnavailableDateList(); for (DateInfoReq item : itemDates) { String startDate1 = item.getStartDate(); @@ -354,7 +353,7 @@ public class DatasourceServiceImpl implements DatasourceService { } } - return new ItemDateResp(dateFormat, startDate, endDate, unavailableDateList); + return new ItemDateResp(dateFormat, startDate, endDate, datePeriod, unavailableDateList); } diff --git a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/Catalog.java b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/Catalog.java new file mode 100644 index 000000000..36ddf8bc0 --- /dev/null +++ b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/Catalog.java @@ -0,0 +1,38 @@ +package com.tencent.supersonic.semantic.core.domain; + +import com.tencent.supersonic.semantic.api.core.pojo.ItemDateFilter; +import com.tencent.supersonic.semantic.api.core.pojo.yaml.DatasourceYamlTpl; +import com.tencent.supersonic.semantic.api.core.pojo.yaml.DimensionYamlTpl; +import com.tencent.supersonic.semantic.api.core.pojo.yaml.MetricYamlTpl; +import com.tencent.supersonic.semantic.api.core.response.DatabaseResp; +import com.tencent.supersonic.semantic.api.core.response.DatasourceResp; +import com.tencent.supersonic.semantic.api.core.response.DimensionResp; +import com.tencent.supersonic.semantic.api.core.response.ItemDateResp; +import com.tencent.supersonic.semantic.api.core.response.MetricResp; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface Catalog { + + DatabaseResp getDatabase(Long id); + + List getDatasourceList(Long domainId); + + String getDomainFullPath(Long domainId); + + Map getDomainFullPath(); + + DimensionResp getDimension(String bizName, Long domainId); + + List getDimensions(Long domainId); + + List getMetrics(Long domainId); + + void getModelYamlTplByDomainIds(Set domainIds, Map> dimensionYamlMap, + List datasourceYamlTplList, List metricYamlTplList); + + + ItemDateResp getDateDate(ItemDateFilter dimension, ItemDateFilter metric); + +} diff --git a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/dataobject/DateInfoDO.java b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/dataobject/DateInfoDO.java index bd11b5e93..e4d467cbb 100644 --- a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/dataobject/DateInfoDO.java +++ b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/dataobject/DateInfoDO.java @@ -14,6 +14,7 @@ public class DateInfoDO { private String unavailableDateList; private String createdBy; private String updatedBy; + private String datePeriod; } \ No newline at end of file diff --git a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/manager/DatasourceYamlManager.java b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/manager/DatasourceYamlManager.java index e0e50816b..66112635b 100644 --- a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/manager/DatasourceYamlManager.java +++ b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/manager/DatasourceYamlManager.java @@ -15,11 +15,11 @@ import com.tencent.supersonic.semantic.core.domain.adaptor.engineadapter.EngineA import com.tencent.supersonic.semantic.core.domain.adaptor.engineadapter.EngineAdaptorFactory; import com.tencent.supersonic.semantic.core.domain.pojo.Datasource; import com.tencent.supersonic.semantic.core.domain.pojo.DatasourceQueryEnum; -import java.util.List; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; @Service @@ -30,7 +30,7 @@ public class DatasourceYamlManager { DatasourceDetail datasourceDetail = datasource.getDatasourceDetail(); EngineAdaptor engineAdaptor = EngineAdaptorFactory.getEngineAdaptor(databaseResp.getType()); SysTimeDimensionBuilder.addSysTimeDimension(datasourceDetail.getDimensions(), engineAdaptor); - addInterCntMetric(datasource.getBizName(), datasourceDetail.getMeasures()); + addInterCntMetric(datasource.getBizName(), datasourceDetail); DatasourceYamlTpl datasourceYamlTpl = new DatasourceYamlTpl(); BeanUtils.copyProperties(datasourceDetail, datasourceYamlTpl); datasourceYamlTpl.setIdentifiers(datasourceDetail.getIdentifiers().stream().map(DatasourceYamlManager::convert) @@ -77,13 +77,16 @@ public class DatasourceYamlManager { } - private static void addInterCntMetric(String datasourceEnName, List measures) { + private static void addInterCntMetric(String datasourceEnName, DatasourceDetail datasourceDetail) { Measure measure = new Measure(); measure.setExpr("1"); + if (!CollectionUtils.isEmpty(datasourceDetail.getIdentifiers())) { + measure.setExpr(datasourceDetail.getIdentifiers().get(0).getBizName()); + } measure.setAgg("count"); measure.setBizName(String.format("%s_%s", datasourceEnName, "internal_cnt")); measure.setCreateMetric("true"); - measures.add(measure); + datasourceDetail.getMeasures().add(measure); } diff --git a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/pojo/MetricFilter.java b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/pojo/MetricFilter.java index d724f26b2..b352a1855 100644 --- a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/pojo/MetricFilter.java +++ b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/pojo/MetricFilter.java @@ -1,7 +1,10 @@ package com.tencent.supersonic.semantic.core.domain.pojo; +import lombok.Data; +@Data public class MetricFilter extends MetaFilter { + private String type; } diff --git a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/infrastructure/repository/MetricRepositoryImpl.java b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/infrastructure/repository/MetricRepositoryImpl.java index 8ff981b45..356114b5a 100644 --- a/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/infrastructure/repository/MetricRepositoryImpl.java +++ b/semantic/core/src/main/java/com/tencent/supersonic/semantic/core/infrastructure/repository/MetricRepositoryImpl.java @@ -8,6 +8,7 @@ import com.tencent.supersonic.semantic.core.domain.repository.MetricRepository; import com.tencent.supersonic.semantic.core.infrastructure.mapper.MetricDOCustomMapper; import com.tencent.supersonic.semantic.core.infrastructure.mapper.MetricDOMapper; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -96,6 +97,9 @@ public class MetricRepositoryImpl implements MetricRepository { if (metricFilter.getStatus() != null) { metricDOExample.getOredCriteria().get(0).andStatusEqualTo(metricFilter.getStatus()); } + if (StringUtils.isNotBlank(metricFilter.getType())) { + metricDOExample.getOredCriteria().get(0).andTypeEqualTo(metricFilter.getType()); + } return metricDOMapper.selectByExampleWithBLOBs(metricDOExample); } diff --git a/semantic/core/src/main/resources/mapper/custom/DateInfoMapper.xml b/semantic/core/src/main/resources/mapper/custom/DateInfoMapper.xml index 5df03b47d..1e9823b71 100644 --- a/semantic/core/src/main/resources/mapper/custom/DateInfoMapper.xml +++ b/semantic/core/src/main/resources/mapper/custom/DateInfoMapper.xml @@ -14,21 +14,23 @@ + insert into s2_available_date_info (`type`, item_id, date_format, start_date, end_date, unavailable_date, created_by, - updated_by) + updated_by,date_period) values (#{type}, #{itemId}, #{dateFormat}, #{startDate}, #{endDate}, #{unavailableDateList}, - #{createdBy}, #{updatedBy}) ON DUPLICATE KEY + #{createdBy}, #{updatedBy}, #{datePeriod}) ON DUPLICATE KEY UPDATE date_format = #{dateFormat}, start_date = #{startDate}, end_date = #{endDate}, unavailable_date = #{unavailableDateList}, created_by = #{createdBy}, - updated_by = #{updatedBy} + updated_by = #{updatedBy}, + date_period = #{datePeriod} + + + void; +}; + +const FormItem = Form.Item; +const Option = Select.Option; + +const DefaultSettingForm: ForwardRefRenderFunction = ( + { metricList, dimensionList, domainId, entityData, chatConfigKey, chatConfigType, onSubmit }, + ref, +) => { + const [form] = Form.useForm(); + const [metricListOptions, setMetricListOptions] = useState([]); + const [unitState, setUnit] = useState(); + const [periodState, setPeriod] = useState(); + const [dataItemListOptions, setDataItemListOptions] = useState([]); + const formatEntityData = formatRichEntityDataListToIds(entityData); + const getFormValidateFields = async () => { + return await form.validateFields(); + }; + + useImperativeHandle(ref, () => ({ + getFormValidateFields, + })); + + useEffect(() => { + form.resetFields(); + setUnit(null); + setPeriod(''); + if (!entityData?.chatDefaultConfig) { + return; + } + const { chatDefaultConfig, id } = formatEntityData; + const { period, unit } = chatDefaultConfig; + setUnit(unit); + setPeriod(period); + form.setFieldsValue({ + ...chatDefaultConfig, + id, + }); + if (chatConfigType === ChatConfigType.DETAIL) { + initDataItemValue(chatDefaultConfig); + } + }, [entityData, dataItemListOptions]); + + const initDataItemValue = (chatDefaultConfig: { + dimensionIds: number[]; + metricIds: number[]; + }) => { + const { dimensionIds, metricIds } = chatDefaultConfig; + const dimensionIdString = dimensionIds.map((dimensionId: number) => { + return wrapperTransTypeAndId(TransType.DIMENSION, dimensionId); + }); + const metricIdString = metricIds.map((metricId: number) => { + return wrapperTransTypeAndId(TransType.METRIC, metricId); + }); + form.setFieldsValue({ + dataItemIds: [...dimensionIdString, ...metricIdString], + }); + }; + + useEffect(() => { + const metricOption = metricList.map((item: any) => { + return { + label: item.name, + value: item.id, + }; + }); + setMetricListOptions(metricOption); + }, [metricList]); + + useEffect(() => { + if (Array.isArray(dimensionList) && Array.isArray(metricList)) { + const dimensionEnum = dimensionList.map((item: ISemantic.IDimensionItem) => { + const { name, id, bizName } = item; + return { + name, + label: ( + <> + + {name} + + ), + value: wrapperTransTypeAndId(TransType.DIMENSION, id), + bizName, + id, + transType: TransType.DIMENSION, + }; + }); + const metricEnum = metricList.map((item: ISemantic.IMetricItem) => { + const { name, id, bizName } = item; + return { + name, + label: ( + <> + + {name} + + ), + value: wrapperTransTypeAndId(TransType.METRIC, id), + bizName, + id, + transType: TransType.METRIC, + }; + }); + setDataItemListOptions([...dimensionEnum, ...metricEnum]); + } + }, [dimensionList, metricList]); + + const saveEntity = async () => { + const values = await form.validateFields(); + const { id, dataItemIds } = values; + let dimensionConfig = {}; + if (dataItemIds) { + const { dimensionIds, metricIds } = splitListToTransTypeId(dataItemIds); + dimensionConfig = { + dimensionIds, + metricIds, + }; + } + let saveDomainExtendQuery = addDomainExtend; + if (id) { + saveDomainExtendQuery = editDomainExtend; + } + const params = { + ...formatEntityData, + chatDefaultConfig: { ...values, ...dimensionConfig }, + }; + const { code, msg, data } = await saveDomainExtendQuery({ + [chatConfigKey]: params, + domainId, + id, + }); + if (code === 200) { + form.setFieldValue('id', data); + onSubmit?.(); + message.success('保存成功'); + return; + } + message.error(msg); + }; + + return ( + <> +
+ + + {chatConfigType === ChatConfigType.DETAIL && ( + + { + const { label } = item; + if (label.includes(inputValue)) { + return true; + } + return false; + }} + placeholder="请选择展示指标信息" + options={metricListOptions} + /> + + )} + + + } + > + + + {chatConfigType === ChatConfigType.DETAIL ? '前' : '最近'} + + { + setUnit(value); + form.setFieldValue('unit', value); + }} + /> + + + + + + + + + + +
+ + ); +}; + +export default forwardRef(DefaultSettingForm); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionAndMetricVisibleModal.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionAndMetricVisibleModal.tsx new file mode 100644 index 000000000..8c65cc0e5 --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionAndMetricVisibleModal.tsx @@ -0,0 +1,205 @@ +import React, { useEffect, useState, useRef } from 'react'; +import { Button, Modal, message, Tabs } from 'antd'; + +import { addDomainExtend, editDomainExtend } from '../../service'; +import DimensionMetricVisibleTransfer from './DimensionMetricVisibleTransfer'; +import { IChatConfig } from '../../data'; +import DimensionValueSettingForm from './DimensionValueSettingForm'; +import { TransType } from '../../enum'; +import { wrapperTransTypeAndId, formatRichEntityDataListToIds } from './utils'; + +type Props = { + domainId: number; + entityData: any; + chatConfigKey: string; + settingSourceList: any[]; + onCancel: () => void; + visible: boolean; + onSubmit: (params?: any) => void; +}; + +const dimensionConfig = { + blackIdListKey: 'blackDimIdList', + visibleIdListKey: 'whiteDimIdList', + modalTitle: '问答可见信息', + titles: ['不可见维度/指标', '可见维度/指标'], +}; + +const DimensionAndMetricVisibleModal: React.FC = ({ + domainId, + visible, + entityData = {}, + chatConfigKey, + settingSourceList, + onCancel, + onSubmit, +}) => { + const [selectedKeyList, setSelectedKeyList] = useState([]); + const settingTypeConfig = dimensionConfig; + const formatEntityData = formatRichEntityDataListToIds(entityData); + const [knowledgeInfosMap, setKnowledgeInfosMap] = useState( + {}, + ); + const formRef = useRef(); + + const [globalKnowledgeConfigInitialValues, setGlobalKnowledgeConfigInitialValues] = + useState(); + + useEffect(() => { + if (entityData?.visibility && Array.isArray(settingSourceList)) { + const { whiteDimIdList, whiteMetricIdList } = entityData.visibility; + const dimensionIdString = whiteDimIdList.map((dimensionId: number) => { + return wrapperTransTypeAndId(TransType.DIMENSION, dimensionId); + }); + const metricIdString = whiteMetricIdList.map((metricId: number) => { + return wrapperTransTypeAndId(TransType.METRIC, metricId); + }); + setSelectedKeyList([...dimensionIdString, ...metricIdString]); + } + if (entityData?.globalKnowledgeConfig) { + setGlobalKnowledgeConfigInitialValues(entityData.globalKnowledgeConfig); + } + if (Array.isArray(entityData?.knowledgeInfos)) { + const infoMap = entityData.knowledgeInfos.reduce( + (maps: IChatConfig.IKnowledgeInfosItemMap, item: IChatConfig.IKnowledgeInfosItem) => { + const { bizName } = item; + maps[bizName] = item; + return maps; + }, + {}, + ); + setKnowledgeInfosMap(infoMap); + } + }, [entityData, settingSourceList]); + + const saveEntity = async () => { + const globalKnowledgeConfigFormFields = await formRef?.current?.getFormValidateFields?.(); + let globalKnowledgeConfig = entityData.globalKnowledgeConfig; + if (globalKnowledgeConfigFormFields) { + globalKnowledgeConfig = globalKnowledgeConfigFormFields; + } + const { id } = entityData; + let saveDomainExtendQuery = addDomainExtend; + if (id) { + saveDomainExtendQuery = editDomainExtend; + } + + const blackIdListMap = settingSourceList.reduce( + (ids, item) => { + const { id, transType } = item; + if (!selectedKeyList.includes(wrapperTransTypeAndId(transType, id))) { + if (transType === TransType.DIMENSION) { + ids.blackDimIdList.push(id); + } + if (transType === TransType.METRIC) { + ids.blackMetricIdList.push(id); + } + } + return ids; + }, + { + blackDimIdList: [], + blackMetricIdList: [], + }, + ); + + const knowledgeInfos = Object.keys(knowledgeInfosMap).reduce( + (infoList: IChatConfig.IKnowledgeInfosItem[], key: string) => { + const target = knowledgeInfosMap[key]; + if (target.searchEnable) { + infoList.push(target); + } + return infoList; + }, + [], + ); + + const params = { + ...formatEntityData, + visibility: blackIdListMap, + knowledgeInfos, + ...(globalKnowledgeConfig ? { globalKnowledgeConfig } : {}), + }; + + const { code, msg } = await saveDomainExtendQuery({ + [chatConfigKey]: params, + domainId, + id, + }); + if (code === 200) { + onSubmit?.(); + message.success('保存成功'); + return; + } + message.error(msg); + }; + + const handleTransferChange = (newTargetKeys: string[]) => { + setSelectedKeyList(newTargetKeys); + }; + + const renderFooter = () => { + return ( + <> + + + + ); + }; + + const tabItem = [ + { + label: '可见设置', + key: 'visibleSetting', + children: ( + { + setKnowledgeInfosMap(knowledgeInfosMap); + }} + knowledgeInfosMap={knowledgeInfosMap} + titles={settingTypeConfig.titles} + sourceList={settingSourceList} + targetList={selectedKeyList} + onChange={(newTargetKeys) => { + handleTransferChange(newTargetKeys); + }} + /> + ), + }, + { + label: '全局维度值过滤', + key: 'dimensionValueFilter', + children: ( + + ), + }, + ]; + + return ( + <> + + + + + ); +}; + +export default DimensionAndMetricVisibleModal; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleForm.tsx index 52abe9773..616061f7f 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleForm.tsx @@ -3,11 +3,13 @@ import type { ForwardRefRenderFunction } from 'react'; import { Form, Button } from 'antd'; import FormItemTitle from '@/components/FormHelper/FormItemTitle'; import { formLayout } from '@/components/FormHelper/utils'; -import DimensionMetricVisibleModal from './DimensionMetricVisibleModal'; -import DimensionSearchVisibleModal from './DimensionSearchVisibleModal'; +import DimensionAndMetricVisibleModal from './DimensionAndMetricVisibleModal'; +import { TransType } from '../../enum'; +import { wrapperTransTypeAndId } from './utils'; type Props = { - themeData: any; + entityData: any; + chatConfigKey: string; metricList: any[]; dimensionList: any[]; domainId: number; @@ -20,18 +22,17 @@ const DimensionMetricVisibleForm: ForwardRefRenderFunction = ({ domainId, metricList, dimensionList, - themeData, + entityData, + chatConfigKey, onSubmit, }) => { const [dimensionModalVisible, setDimensionModalVisible] = useState(false); - const [dimensionSearchModalVisible, setDimensionSearchModalVisible] = useState(false); - const [metricModalVisible, setMetricModalVisible] = useState(false); return ( <>
+ } > - - } - > - - - - } - > - -
{dimensionModalVisible && ( - { + const transType = TransType.DIMENSION; + const { id } = item; + return { + ...item, + transType, + key: wrapperTransTypeAndId(transType, id), + }; + }), + ...metricList.map((item) => { + const transType = TransType.METRIC; + const { id } = item; + return { + ...item, + transType, + key: wrapperTransTypeAndId(transType, id), + }; + }), + ]} visible={dimensionModalVisible} onCancel={() => { setDimensionModalVisible(false); @@ -91,43 +80,6 @@ const DimensionMetricVisibleForm: ForwardRefRenderFunction = ({ }} /> )} - {dimensionSearchModalVisible && ( - { - const blackDimensionList = themeData.visibility?.blackDimIdList; - if (Array.isArray(blackDimensionList)) { - return !blackDimensionList.includes(item.id); - } - return false; - })} - themeData={themeData} - visible={dimensionSearchModalVisible} - onCancel={() => { - setDimensionSearchModalVisible(false); - }} - onSubmit={() => { - onSubmit?.({ from: 'dimensionSearchVisible' }); - setDimensionSearchModalVisible(false); - }} - /> - )} - {metricModalVisible && ( - { - setMetricModalVisible(false); - }} - onSubmit={() => { - onSubmit?.(); - setMetricModalVisible(false); - }} - /> - )} ); }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleTableTransfer.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleTableTransfer.tsx new file mode 100644 index 000000000..dceda749c --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleTableTransfer.tsx @@ -0,0 +1,199 @@ +import { Space, Table, Transfer, Checkbox, Tooltip, Button } from 'antd'; +import type { ColumnsType, TableRowSelection } from 'antd/es/table/interface'; +import type { TransferItem } from 'antd/es/transfer'; +import type { CheckboxChangeEvent } from 'antd/es/checkbox'; +import { ExclamationCircleOutlined } from '@ant-design/icons'; +import difference from 'lodash/difference'; +import React, { useState } from 'react'; +import type { IChatConfig } from '../../data'; +import DimensionValueSettingModal from './DimensionValueSettingModal'; +import TransTypeTag from '../TransTypeTag'; +import { TransType } from '../../enum'; + +interface RecordType { + id: number; + key: string; + name: string; + bizName: string; + type: TransType.DIMENSION | TransType.METRIC; +} + +type Props = { + knowledgeInfosMap: IChatConfig.IKnowledgeInfosItemMap; + onKnowledgeInfosMapChange: (knowledgeInfosMap: IChatConfig.IKnowledgeInfosItemMap) => void; + [key: string]: any; +}; + +const DimensionMetricVisibleTableTransfer: React.FC = ({ + knowledgeInfosMap, + onKnowledgeInfosMapChange, + ...restProps +}) => { + const [dimensionValueSettingModalVisible, setDimensionValueSettingModalVisible] = + useState(false); + const [currentRecord, setCurrentRecord] = useState({}); + const [currentDimensionSettingFormData, setCurrentDimensionSettingFormData] = + useState(); + + const updateKnowledgeInfosMap = (record: RecordType, updateData: Record) => { + const { bizName, id } = record; + const knowledgeMap = { + ...knowledgeInfosMap, + }; + const target = knowledgeMap[bizName]; + if (target) { + knowledgeMap[bizName] = { + ...target, + ...updateData, + }; + } else { + knowledgeMap[bizName] = { + itemId: id, + bizName, + ...updateData, + }; + } + onKnowledgeInfosMapChange?.(knowledgeMap); + }; + + const rightColumns: ColumnsType = [ + { + dataIndex: 'name', + title: '名称', + }, + { + dataIndex: 'type', + width: 80, + title: '类型', + render: (type) => { + return ; + }, + }, + { + dataIndex: 'y', + title: ( + + 维度值可见 + + + + + ), + width: 120, + render: (_, record) => { + const { type, bizName } = record; + return type === TransType.DIMENSION ? ( + { + updateKnowledgeInfosMap(record, { searchEnable: e.target.checked }); + }} + onClick={(event) => { + event.stopPropagation(); + }} + /> + ) : ( + <> + ); + }, + }, + { + title: '操作', + dataIndex: 'x', + render: (_, record) => { + const { type, bizName } = record; + return type === TransType.DIMENSION ? ( + + ) : ( + <> + ); + }, + }, + ]; + + const leftColumns: ColumnsType = [ + { + dataIndex: 'name', + title: '名称', + }, + { + dataIndex: 'type', + title: '类型', + render: (type) => { + return ; + }, + }, + ]; + return ( + <> + + {({ + direction, + filteredItems, + onItemSelectAll, + onItemSelect, + selectedKeys: listSelectedKeys, + }) => { + const columns = direction === 'left' ? leftColumns : rightColumns; + const rowSelection: TableRowSelection = { + onSelectAll(selected, selectedRows) { + const treeSelectedKeys = selectedRows.map(({ key }) => key); + const diffKeys = selected + ? difference(treeSelectedKeys, listSelectedKeys) + : difference(listSelectedKeys, treeSelectedKeys); + onItemSelectAll(diffKeys as string[], selected); + }, + onSelect({ key }, selected) { + onItemSelect(key as string, selected); + }, + selectedRowKeys: listSelectedKeys, + }; + + return ( + ({ + onClick: () => { + onItemSelect(key as string, !listSelectedKeys.includes(key as string)); + }, + })} + /> + ); + }} + + { + updateKnowledgeInfosMap(currentRecord, { knowledgeAdvancedConfig: formValues }); + setDimensionValueSettingModalVisible(false); + }} + onCancel={() => { + setDimensionValueSettingModalVisible(false); + }} + /> + + ); +}; + +export default DimensionMetricVisibleTableTransfer; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleTransfer.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleTransfer.tsx index cdd756871..54e49b629 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleTransfer.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionMetricVisibleTransfer.tsx @@ -1,5 +1,7 @@ -import { Transfer, Tag } from 'antd'; +import { Tag } from 'antd'; import React, { useEffect, useState } from 'react'; +import { IChatConfig } from '../../data'; +import DimensionMetricVisibleTableTransfer from './DimensionMetricVisibleTableTransfer'; interface RecordType { key: string; @@ -8,14 +10,18 @@ interface RecordType { } type Props = { + knowledgeInfosMap: IChatConfig.IKnowledgeInfosItemMap; sourceList: any[]; targetList: string[]; titles?: string[]; + onKnowledgeInfosMapChange: (knowledgeInfosMap: IChatConfig.IKnowledgeInfosItemMap) => void; onChange?: (params?: any) => void; transferProps?: Record; }; const DimensionMetricVisibleTransfer: React.FC = ({ + knowledgeInfosMap, + onKnowledgeInfosMapChange, sourceList = [], targetList = [], titles, @@ -27,11 +33,13 @@ const DimensionMetricVisibleTransfer: React.FC = ({ useEffect(() => { setTransferData( - sourceList.map(({ id, name, type }: any) => { + sourceList.map(({ key, id, name, bizName, transType }) => { return { - key: id, + key, name, - type, + bizName, + id, + type: transType, }; }), ); @@ -48,13 +56,15 @@ const DimensionMetricVisibleTransfer: React.FC = ({ return (
- { const { name } = item; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingForm.tsx new file mode 100644 index 000000000..21ae054b8 --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingForm.tsx @@ -0,0 +1,80 @@ +import { useEffect, forwardRef, useImperativeHandle } from 'react'; +import type { ForwardRefRenderFunction } from 'react'; +import { Form, Input } from 'antd'; + +import { formLayout } from '@/components/FormHelper/utils'; +import { isString } from 'lodash'; +import styles from '../style.less'; + +import SqlEditor from '@/components/SqlEditor'; +type Props = { + initialValues: any; + onSubmit?: () => void; +}; + +const FormItem = Form.Item; + +const EntityCreateForm: ForwardRefRenderFunction = ({ initialValues }, ref) => { + const [form] = Form.useForm(); + + const exchangeFields = ['blackList', 'whiteList', 'ruleList']; + + const getFormValidateFields = async () => { + const fields = await form.validateFields(); + const fieldValue = Object.keys(fields).reduce((formField, key: string) => { + const targetValue = fields[key]; + if (isString(targetValue) && exchangeFields.includes(key)) { + formField[key] = targetValue.split(','); + } else { + formField[key] = targetValue; + } + return formField; + }, {}); + return { + ...fieldValue, + }; + }; + + useEffect(() => { + form.resetFields(); + if (!initialValues) { + return; + } + const fieldValue = Object.keys(initialValues).reduce((formField, key: string) => { + const targetValue = initialValues[key]; + if (Array.isArray(targetValue) && exchangeFields.includes(key)) { + formField[key] = targetValue.join(','); + } else { + formField[key] = targetValue; + } + return formField; + }, {}); + form.setFieldsValue({ + ...fieldValue, + }); + }, [initialValues]); + + useImperativeHandle(ref, () => ({ + getFormValidateFields, + })); + + return ( + <> +
+ + + + + + + + + + + + + + ); +}; + +export default forwardRef(EntityCreateForm); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingModal.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingModal.tsx new file mode 100644 index 000000000..f803f636b --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingModal.tsx @@ -0,0 +1,56 @@ +import React, { useRef } from 'react'; +import { Button, Modal } from 'antd'; +import DimensionValueSettingForm from './DimensionValueSettingForm'; + +type Props = { + initialValues: any; + onCancel?: () => void; + visible: boolean; + onSubmit?: (params?: any) => void; +}; +const DimensionValueSettingModal: React.FC = ({ + initialValues, + visible, + onCancel, + onSubmit, +}) => { + const formRef = useRef(); + + const handleSubmit = async () => { + const formValues = await formRef.current.getFormValidateFields(); + onSubmit?.(formValues); + }; + + const renderFooter = () => { + return ( + <> + + + + ); + }; + return ( + <> + + + + + ); +}; + +export default DimensionValueSettingModal; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/EntityCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/EntityCreateForm.tsx index bfd7d2d29..1a3a78f47 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/EntityCreateForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/EntityCreateForm.tsx @@ -4,27 +4,24 @@ import { message, Form, Input, Select, Button } from 'antd'; import { addDomainExtend, editDomainExtend } from '../../service'; import type { ISemantic, IChatConfig } from '../../data'; import { formLayout } from '@/components/FormHelper/utils'; -import { exChangeRichEntityListToIds } from './utils'; +import { formatRichEntityDataListToIds } from './utils'; import styles from '../style.less'; type Props = { - entityData: IChatConfig.IEntity; - metricList: ISemantic.IMetricList; + entityData: IChatConfig.IChatRichConfig; dimensionList: ISemantic.IDimensionList; domainId: number; onSubmit: () => void; }; const FormItem = Form.Item; -const TextArea = Input.TextArea; const EntityCreateForm: ForwardRefRenderFunction = ( - { entityData, metricList, dimensionList, domainId, onSubmit }, + { entityData, dimensionList, domainId, onSubmit }, ref, ) => { const [form] = Form.useForm(); - - const [metricListOptions, setMetricListOptions] = useState([]); + const formatEntityData = formatRichEntityDataListToIds(entityData); const [dimensionListOptions, setDimensionListOptions] = useState([]); const getFormValidateFields = async () => { @@ -33,29 +30,19 @@ const EntityCreateForm: ForwardRefRenderFunction = ( useEffect(() => { form.resetFields(); - if (Object.keys(entityData).length === 0) { + if (!entityData?.entity) { return; } - const names = entityData.names || []; - const formatEntityData = exChangeRichEntityListToIds(entityData); + form.setFieldsValue({ - ...formatEntityData, - name: names.join(','), + ...formatEntityData.entity, + id: formatEntityData.id, }); }, [entityData]); useImperativeHandle(ref, () => ({ getFormValidateFields, })); - useEffect(() => { - const metricOption = metricList.map((item: ISemantic.IMetricItem) => { - return { - label: item.name, - value: item.id, - }; - }); - setMetricListOptions(metricOption); - }, [metricList]); useEffect(() => { const dimensionEnum = dimensionList.map((item: ISemantic.IDimensionItem) => { @@ -75,10 +62,14 @@ const EntityCreateForm: ForwardRefRenderFunction = ( saveDomainExtendQuery = editDomainExtend; } const { code, msg, data } = await saveDomainExtendQuery({ - entity: { - ...values, - names: name.split(','), + chatDetailConfig: { + ...formatEntityData, + entity: { + ...values, + names: name.split(','), + }, }, + id, domainId, }); @@ -99,66 +90,31 @@ const EntityCreateForm: ForwardRefRenderFunction = ( - ",B.noCloneChecked=!!rt.cloneNode(!0).lastChild.defaultValue,rt.innerHTML="",B.option=!!rt.lastChild})();var bn={thead:[1,"
","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};bn.tbody=bn.tfoot=bn.colgroup=bn.caption=bn.thead,bn.th=bn.td,B.option||(bn.optgroup=bn.option=[1,""]);function Bn($t,rt){var Vt;return typeof $t.getElementsByTagName!="undefined"?Vt=$t.getElementsByTagName(rt||"*"):typeof $t.querySelectorAll!="undefined"?Vt=$t.querySelectorAll(rt||"*"):Vt=[],rt===void 0||rt&&te($t,rt)?W.merge([$t],Vt):Vt}function Tn($t,rt){for(var Vt=0,tn=$t.length;Vt-1){wn&&wn.push(qn);continue}if(en=Ot(qn),zn=Bn(Jn.appendChild(qn),"script"),en&&Tn(zn),Vt)for(Fn=0;qn=zn[Fn++];)_n.test(qn.type||"")&&Vt.push(qn)}return Jn}var Wr=/^([^.]*)(?:\.(.+)|)/;function br(){return!0}function Wn(){return!1}function gr($t,rt,Vt,tn,wn,qn){var zn,xr;if(typeof rt=="object"){typeof Vt!="string"&&(tn=tn||Vt,Vt=void 0);for(xr in rt)gr($t,xr,Vt,tn,rt[xr],qn);return $t}if(tn==null&&wn==null?(wn=Vt,tn=Vt=void 0):wn==null&&(typeof Vt=="string"?(wn=tn,tn=void 0):(wn=tn,tn=Vt,Vt=void 0)),wn===!1)wn=Wn;else if(!wn)return $t;return qn===1&&(zn=wn,wn=function(en){return W().off(en),zn.apply(this,arguments)},wn.guid=zn.guid||(zn.guid=W.guid++)),$t.each(function(){W.event.add(this,rt,wn,tn,Vt)})}W.event={global:{},add:function(rt,Vt,tn,wn,qn){var zn,xr,da,en,Fn,Jn,Ir,Gr,ga,Mr,$a,Ya=gt.get(rt);if(!!_t(rt))for(tn.handler&&(zn=tn,tn=zn.handler,qn=zn.selector),qn&&W.find.matchesSelector(Tt,qn),tn.guid||(tn.guid=W.guid++),(en=Ya.events)||(en=Ya.events=Object.create(null)),(xr=Ya.handle)||(xr=Ya.handle=function(_o){return typeof W!="undefined"&&W.event.triggered!==_o.type?W.event.dispatch.apply(rt,arguments):void 0}),Vt=(Vt||"").match(ht)||[""],Fn=Vt.length;Fn--;)da=Wr.exec(Vt[Fn])||[],ga=$a=da[1],Mr=(da[2]||"").split(".").sort(),!!ga&&(Ir=W.event.special[ga]||{},ga=(qn?Ir.delegateType:Ir.bindType)||ga,Ir=W.event.special[ga]||{},Jn=W.extend({type:ga,origType:$a,data:wn,handler:tn,guid:tn.guid,selector:qn,needsContext:qn&&W.expr.match.needsContext.test(qn),namespace:Mr.join(".")},zn),(Gr=en[ga])||(Gr=en[ga]=[],Gr.delegateCount=0,(!Ir.setup||Ir.setup.call(rt,wn,Mr,xr)===!1)&&rt.addEventListener&&rt.addEventListener(ga,xr)),Ir.add&&(Ir.add.call(rt,Jn),Jn.handler.guid||(Jn.handler.guid=tn.guid)),qn?Gr.splice(Gr.delegateCount++,0,Jn):Gr.push(Jn),W.event.global[ga]=!0)},remove:function(rt,Vt,tn,wn,qn){var zn,xr,da,en,Fn,Jn,Ir,Gr,ga,Mr,$a,Ya=gt.hasData(rt)&>.get(rt);if(!(!Ya||!(en=Ya.events))){for(Vt=(Vt||"").match(ht)||[""],Fn=Vt.length;Fn--;){if(da=Wr.exec(Vt[Fn])||[],ga=$a=da[1],Mr=(da[2]||"").split(".").sort(),!ga){for(ga in en)W.event.remove(rt,ga+Vt[Fn],tn,wn,!0);continue}for(Ir=W.event.special[ga]||{},ga=(wn?Ir.delegateType:Ir.bindType)||ga,Gr=en[ga]||[],da=da[2]&&new RegExp("(^|\\.)"+Mr.join("\\.(?:.*\\.|)")+"(\\.|$)"),xr=zn=Gr.length;zn--;)Jn=Gr[zn],(qn||$a===Jn.origType)&&(!tn||tn.guid===Jn.guid)&&(!da||da.test(Jn.namespace))&&(!wn||wn===Jn.selector||wn==="**"&&Jn.selector)&&(Gr.splice(zn,1),Jn.selector&&Gr.delegateCount--,Ir.remove&&Ir.remove.call(rt,Jn));xr&&!Gr.length&&((!Ir.teardown||Ir.teardown.call(rt,Mr,Ya.handle)===!1)&&W.removeEvent(rt,ga,Ya.handle),delete en[ga])}W.isEmptyObject(en)&>.remove(rt,"handle events")}},dispatch:function(rt){var Vt,tn,wn,qn,zn,xr,da=new Array(arguments.length),en=W.event.fix(rt),Fn=(gt.get(this,"events")||Object.create(null))[en.type]||[],Jn=W.event.special[en.type]||{};for(da[0]=en,Vt=1;Vt=1)){for(;Fn!==this;Fn=Fn.parentNode||this)if(Fn.nodeType===1&&!(rt.type==="click"&&Fn.disabled===!0)){for(zn=[],xr={},tn=0;tn-1:W.find(qn,this,null,[Fn]).length),xr[qn]&&zn.push(wn);zn.length&&da.push({elem:Fn,handlers:zn})}}return Fn=this,en\s*$/g;function Bt($t,rt){return te($t,"table")&&te(rt.nodeType!==11?rt:rt.firstChild,"tr")&&W($t).children("tbody")[0]||$t}function H($t){return $t.type=($t.getAttribute("type")!==null)+"/"+$t.type,$t}function ot($t){return($t.type||"").slice(0,5)==="true/"?$t.type=$t.type.slice(5):$t.removeAttribute("type"),$t}function nt($t,rt){var Vt,tn,wn,qn,zn,xr,da;if(rt.nodeType===1){if(gt.hasData($t)&&(qn=gt.get($t),da=qn.events,da)){gt.remove(rt,"handle events");for(wn in da)for(Vt=0,tn=da[wn].length;Vt1&&typeof Gr=="string"&&!B.checkClone&&un.test(Gr))return $t.each(function(Mr){var $a=$t.eq(Mr);ga&&(rt[0]=Gr.call(this,Mr,$a.html())),Wt($a,rt,Vt,tn)});if(Jn&&(wn=Sr(rt,$t[0].ownerDocument,!1,$t,tn),qn=wn.firstChild,wn.childNodes.length===1&&(wn=qn),qn||tn)){for(zn=W.map(Bn(wn,"script"),H),xr=zn.length;Fn0&&Tn(xr,!en&&Bn(rt,"script")),da},cleanData:function(rt){for(var Vt,tn,wn,qn=W.event.special,zn=0;(tn=rt[zn])!==void 0;zn++)if(_t(tn)){if(Vt=tn[gt.expando]){if(Vt.events)for(wn in Vt.events)qn[wn]?W.event.remove(tn,wn):W.removeEvent(tn,wn,Vt.handle);tn[gt.expando]=void 0}tn[at.expando]&&(tn[at.expando]=void 0)}}}),W.fn.extend({detach:function(rt){return kn(this,rt,!0)},remove:function(rt){return kn(this,rt)},text:function(rt){return qe(this,function(Vt){return Vt===void 0?W.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=Vt)})},null,rt,arguments.length)},append:function(){return Wt(this,arguments,function(rt){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var Vt=Bt(this,rt);Vt.appendChild(rt)}})},prepend:function(){return Wt(this,arguments,function(rt){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var Vt=Bt(this,rt);Vt.insertBefore(rt,Vt.firstChild)}})},before:function(){return Wt(this,arguments,function(rt){this.parentNode&&this.parentNode.insertBefore(rt,this)})},after:function(){return Wt(this,arguments,function(rt){this.parentNode&&this.parentNode.insertBefore(rt,this.nextSibling)})},empty:function(){for(var rt,Vt=0;(rt=this[Vt])!=null;Vt++)rt.nodeType===1&&(W.cleanData(Bn(rt,!1)),rt.textContent="");return this},clone:function(rt,Vt){return rt=rt==null?!1:rt,Vt=Vt==null?rt:Vt,this.map(function(){return W.clone(this,rt,Vt)})},html:function(rt){return qe(this,function(Vt){var tn=this[0]||{},wn=0,qn=this.length;if(Vt===void 0&&tn.nodeType===1)return tn.innerHTML;if(typeof Vt=="string"&&!jn.test(Vt)&&!bn[(hn.exec(Vt)||["",""])[1].toLowerCase()]){Vt=W.htmlPrefilter(Vt);try{for(;wn=0&&(da+=Math.max(0,Math.ceil($t["offset"+rt[0].toUpperCase()+rt.slice(1)]-qn-da-xr-.5))||0),da+en}function Ma($t,rt,Vt){var tn=Or($t),wn=!B.boxSizingReliable()||Vt,qn=wn&&W.css($t,"boxSizing",!1,tn)==="border-box",zn=qn,xr=Zt($t,rt,tn),da="offset"+rt[0].toUpperCase()+rt.slice(1);if(Sn.test(xr)){if(!Vt)return xr;xr="auto"}return(!B.boxSizingReliable()&&qn||!B.reliableTrDimensions()&&te($t,"tr")||xr==="auto"||!parseFloat(xr)&&W.css($t,"display",!1,tn)==="inline")&&$t.getClientRects().length&&(qn=W.css($t,"boxSizing",!1,tn)==="border-box",zn=da in $t,zn&&(xr=$t[da])),xr=parseFloat(xr)||0,xr+za($t,rt,Vt||(qn?"border":"content"),zn,tn,xr)+"px"}W.extend({cssHooks:{opacity:{get:function(rt,Vt){if(Vt){var tn=Zt(rt,"opacity");return tn===""?"1":tn}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(rt,Vt,tn,wn){if(!(!rt||rt.nodeType===3||rt.nodeType===8||!rt.style)){var qn,zn,xr,da=Ge(Vt),en=Zn.test(Vt),Fn=rt.style;if(en||(Vt=fr(da)),xr=W.cssHooks[Vt]||W.cssHooks[da],tn!==void 0){if(zn=typeof tn,zn==="string"&&(qn=$e.exec(tn))&&qn[1]&&(tn=Pt(rt,Vt,qn),zn="number"),tn==null||tn!==tn)return;zn==="number"&&!en&&(tn+=qn&&qn[3]||(W.cssNumber[da]?"":"px")),!B.clearCloneStyle&&tn===""&&Vt.indexOf("background")===0&&(Fn[Vt]="inherit"),(!xr||!("set"in xr)||(tn=xr.set(rt,tn,wn))!==void 0)&&(en?Fn.setProperty(Vt,tn):Fn[Vt]=tn)}else return xr&&"get"in xr&&(qn=xr.get(rt,!1,wn))!==void 0?qn:Fn[Vt]}},css:function(rt,Vt,tn,wn){var qn,zn,xr,da=Ge(Vt),en=Zn.test(Vt);return en||(Vt=fr(da)),xr=W.cssHooks[Vt]||W.cssHooks[da],xr&&"get"in xr&&(qn=xr.get(rt,!0,tn)),qn===void 0&&(qn=Zt(rt,Vt,wn)),qn==="normal"&&Vt in Lr&&(qn=Lr[Vt]),tn===""||tn?(zn=parseFloat(qn),tn===!0||isFinite(zn)?zn||0:qn):qn}}),W.each(["height","width"],function($t,rt){W.cssHooks[rt]={get:function(tn,wn,qn){if(wn)return Hn.test(W.css(tn,"display"))&&(!tn.getClientRects().length||!tn.getBoundingClientRect().width)?Yn(tn,Sa,function(){return Ma(tn,rt,qn)}):Ma(tn,rt,qn)},set:function(tn,wn,qn){var zn,xr=Or(tn),da=!B.scrollboxSize()&&xr.position==="absolute",en=da||qn,Fn=en&&W.css(tn,"boxSizing",!1,xr)==="border-box",Jn=qn?za(tn,rt,qn,Fn,xr):0;return Fn&&da&&(Jn-=Math.ceil(tn["offset"+rt[0].toUpperCase()+rt.slice(1)]-parseFloat(xr[rt])-za(tn,rt,"border",!1,xr)-.5)),Jn&&(zn=$e.exec(wn))&&(zn[3]||"px")!=="px"&&(tn.style[rt]=wn,wn=W.css(tn,rt)),Ca(tn,wn,Jn)}}}),W.cssHooks.marginLeft=rr(B.reliableMarginLeft,function($t,rt){if(rt)return(parseFloat(Zt($t,"marginLeft"))||$t.getBoundingClientRect().left-Yn($t,{marginLeft:0},function(){return $t.getBoundingClientRect().left}))+"px"}),W.each({margin:"",padding:"",border:"Width"},function($t,rt){W.cssHooks[$t+rt]={expand:function(tn){for(var wn=0,qn={},zn=typeof tn=="string"?tn.split(" "):[tn];wn<4;wn++)qn[$t+Qe[wn]+rt]=zn[wn]||zn[wn-2]||zn[0];return qn}},$t!=="margin"&&(W.cssHooks[$t+rt].set=Ca)}),W.fn.extend({css:function(rt,Vt){return qe(this,function(tn,wn,qn){var zn,xr,da={},en=0;if(Array.isArray(wn)){for(zn=Or(tn),xr=wn.length;en1)}});function va($t,rt,Vt,tn,wn){return new va.prototype.init($t,rt,Vt,tn,wn)}W.Tween=va,va.prototype={constructor:va,init:function(rt,Vt,tn,wn,qn,zn){this.elem=rt,this.prop=tn,this.easing=qn||W.easing._default,this.options=Vt,this.start=this.now=this.cur(),this.end=wn,this.unit=zn||(W.cssNumber[tn]?"":"px")},cur:function(){var rt=va.propHooks[this.prop];return rt&&rt.get?rt.get(this):va.propHooks._default.get(this)},run:function(rt){var Vt,tn=va.propHooks[this.prop];return this.options.duration?this.pos=Vt=W.easing[this.easing](rt,this.options.duration*rt,0,1,this.options.duration):this.pos=Vt=rt,this.now=(this.end-this.start)*Vt+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),tn&&tn.set?tn.set(this):va.propHooks._default.set(this),this}},va.prototype.init.prototype=va.prototype,va.propHooks={_default:{get:function(rt){var Vt;return rt.elem.nodeType!==1||rt.elem[rt.prop]!=null&&rt.elem.style[rt.prop]==null?rt.elem[rt.prop]:(Vt=W.css(rt.elem,rt.prop,""),!Vt||Vt==="auto"?0:Vt)},set:function(rt){W.fx.step[rt.prop]?W.fx.step[rt.prop](rt):rt.elem.nodeType===1&&(W.cssHooks[rt.prop]||rt.elem.style[fr(rt.prop)]!=null)?W.style(rt.elem,rt.prop,rt.now+rt.unit):rt.elem[rt.prop]=rt.now}}},va.propHooks.scrollTop=va.propHooks.scrollLeft={set:function(rt){rt.elem.nodeType&&rt.elem.parentNode&&(rt.elem[rt.prop]=rt.now)}},W.easing={linear:function(rt){return rt},swing:function(rt){return .5-Math.cos(rt*Math.PI)/2},_default:"swing"},W.fx=va.prototype.init,W.fx.step={};var qa,gi,Qi=/^(?:toggle|show|hide)$/,mi=/queueHooks$/;function Cr(){gi&&($.hidden===!1&&O.requestAnimationFrame?O.requestAnimationFrame(Cr):O.setTimeout(Cr,W.fx.interval),W.fx.tick())}function Un(){return O.setTimeout(function(){qa=void 0}),qa=Date.now()}function Lt($t,rt){var Vt,tn=0,wn={height:$t};for(rt=rt?1:0;tn<4;tn+=2-rt)Vt=Qe[tn],wn["margin"+Vt]=wn["padding"+Vt]=$t;return rt&&(wn.opacity=wn.width=$t),wn}function gn($t,rt,Vt){for(var tn,wn=(ea.tweeners[rt]||[]).concat(ea.tweeners["*"]),qn=0,zn=wn.length;qn1)},removeAttr:function(rt){return this.each(function(){W.removeAttr(this,rt)})}}),W.extend({attr:function(rt,Vt,tn){var wn,qn,zn=rt.nodeType;if(!(zn===3||zn===8||zn===2)){if(typeof rt.getAttribute=="undefined")return W.prop(rt,Vt,tn);if((zn!==1||!W.isXMLDoc(rt))&&(qn=W.attrHooks[Vt.toLowerCase()]||(W.expr.match.bool.test(Vt)?Qr:void 0)),tn!==void 0){if(tn===null){W.removeAttr(rt,Vt);return}return qn&&"set"in qn&&(wn=qn.set(rt,tn,Vt))!==void 0?wn:(rt.setAttribute(Vt,tn+""),tn)}return qn&&"get"in qn&&(wn=qn.get(rt,Vt))!==null?wn:(wn=W.find.attr(rt,Vt),wn==null?void 0:wn)}},attrHooks:{type:{set:function(rt,Vt){if(!B.radioValue&&Vt==="radio"&&te(rt,"input")){var tn=rt.value;return rt.setAttribute("type",Vt),tn&&(rt.value=tn),Vt}}}},removeAttr:function(rt,Vt){var tn,wn=0,qn=Vt&&Vt.match(ht);if(qn&&rt.nodeType===1)for(;tn=qn[wn++];)rt.removeAttribute(tn)}}),Qr={set:function(rt,Vt,tn){return Vt===!1?W.removeAttr(rt,tn):rt.setAttribute(tn,tn),tn}},W.each(W.expr.match.bool.source.match(/\w+/g),function($t,rt){var Vt=Na[rt]||W.find.attr;Na[rt]=function(tn,wn,qn){var zn,xr,da=wn.toLowerCase();return qn||(xr=Na[da],Na[da]=zn,zn=Vt(tn,wn,qn)!=null?da:null,Na[da]=xr),zn}});var ar=/^(?:input|select|textarea|button)$/i,pi=/^(?:a|area)$/i;W.fn.extend({prop:function(rt,Vt){return qe(this,W.prop,rt,Vt,arguments.length>1)},removeProp:function(rt){return this.each(function(){delete this[W.propFix[rt]||rt]})}}),W.extend({prop:function(rt,Vt,tn){var wn,qn,zn=rt.nodeType;if(!(zn===3||zn===8||zn===2))return(zn!==1||!W.isXMLDoc(rt))&&(Vt=W.propFix[Vt]||Vt,qn=W.propHooks[Vt]),tn!==void 0?qn&&"set"in qn&&(wn=qn.set(rt,tn,Vt))!==void 0?wn:rt[Vt]=tn:qn&&"get"in qn&&(wn=qn.get(rt,Vt))!==null?wn:rt[Vt]},propHooks:{tabIndex:{get:function(rt){var Vt=W.find.attr(rt,"tabindex");return Vt?parseInt(Vt,10):ar.test(rt.nodeName)||pi.test(rt.nodeName)&&rt.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),B.optSelected||(W.propHooks.selected={get:function(rt){var Vt=rt.parentNode;return Vt&&Vt.parentNode&&Vt.parentNode.selectedIndex,null},set:function(rt){var Vt=rt.parentNode;Vt&&(Vt.selectedIndex,Vt.parentNode&&Vt.parentNode.selectedIndex)}}),W.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){W.propFix[this.toLowerCase()]=this});function _i($t){var rt=$t.match(ht)||[];return rt.join(" ")}function ti($t){return $t.getAttribute&&$t.getAttribute("class")||""}function ui($t){return Array.isArray($t)?$t:typeof $t=="string"?$t.match(ht)||[]:[]}W.fn.extend({addClass:function(rt){var Vt,tn,wn,qn,zn,xr;return U(rt)?this.each(function(da){W(this).addClass(rt.call(this,da,ti(this)))}):(Vt=ui(rt),Vt.length?this.each(function(){if(wn=ti(this),tn=this.nodeType===1&&" "+_i(wn)+" ",tn){for(zn=0;zn-1;)tn=tn.replace(" "+qn+" "," ");xr=_i(tn),wn!==xr&&this.setAttribute("class",xr)}}):this):this.attr("class","")},toggleClass:function(rt,Vt){var tn,wn,qn,zn,xr=typeof rt,da=xr==="string"||Array.isArray(rt);return U(rt)?this.each(function(en){W(this).toggleClass(rt.call(this,en,ti(this),Vt),Vt)}):typeof Vt=="boolean"&&da?Vt?this.addClass(rt):this.removeClass(rt):(tn=ui(rt),this.each(function(){if(da)for(zn=W(this),qn=0;qn-1)return!0;return!1}});var Ri=/\r/g;W.fn.extend({val:function(rt){var Vt,tn,wn,qn=this[0];return arguments.length?(wn=U(rt),this.each(function(zn){var xr;this.nodeType===1&&(wn?xr=rt.call(this,zn,W(this).val()):xr=rt,xr==null?xr="":typeof xr=="number"?xr+="":Array.isArray(xr)&&(xr=W.map(xr,function(da){return da==null?"":da+""})),Vt=W.valHooks[this.type]||W.valHooks[this.nodeName.toLowerCase()],(!Vt||!("set"in Vt)||Vt.set(this,xr,"value")===void 0)&&(this.value=xr))})):qn?(Vt=W.valHooks[qn.type]||W.valHooks[qn.nodeName.toLowerCase()],Vt&&"get"in Vt&&(tn=Vt.get(qn,"value"))!==void 0?tn:(tn=qn.value,typeof tn=="string"?tn.replace(Ri,""):tn==null?"":tn)):void 0}}),W.extend({valHooks:{option:{get:function(rt){var Vt=W.find.attr(rt,"value");return Vt!=null?Vt:_i(W.text(rt))}},select:{get:function(rt){var Vt,tn,wn,qn=rt.options,zn=rt.selectedIndex,xr=rt.type==="select-one",da=xr?null:[],en=xr?zn+1:qn.length;for(zn<0?wn=en:wn=xr?zn:0;wn-1)&&(tn=!0);return tn||(rt.selectedIndex=-1),zn}}}}),W.each(["radio","checkbox"],function(){W.valHooks[this]={set:function(rt,Vt){if(Array.isArray(Vt))return rt.checked=W.inArray(W(rt).val(),Vt)>-1}},B.checkOn||(W.valHooks[this].get=function($t){return $t.getAttribute("value")===null?"on":$t.value})});var ao=O.location,Zi={guid:Date.now()},Fi=/\?/;W.parseXML=function($t){var rt,Vt;if(!$t||typeof $t!="string")return null;try{rt=new O.DOMParser().parseFromString($t,"text/xml")}catch(tn){}return Vt=rt&&rt.getElementsByTagName("parsererror")[0],(!rt||Vt)&&W.error("Invalid XML: "+(Vt?W.map(Vt.childNodes,function(tn){return tn.textContent}).join(` +`):$t)),rt};var Si=/^(?:focusinfocus|focusoutblur)$/,qi=function(rt){rt.stopPropagation()};W.extend(W.event,{trigger:function(rt,Vt,tn,wn){var qn,zn,xr,da,en,Fn,Jn,Ir,Gr=[tn||$],ga=D.call(rt,"type")?rt.type:rt,Mr=D.call(rt,"namespace")?rt.namespace.split("."):[];if(zn=Ir=xr=tn=tn||$,!(tn.nodeType===3||tn.nodeType===8)&&!Si.test(ga+W.event.triggered)&&(ga.indexOf(".")>-1&&(Mr=ga.split("."),ga=Mr.shift(),Mr.sort()),en=ga.indexOf(":")<0&&"on"+ga,rt=rt[W.expando]?rt:new W.Event(ga,typeof rt=="object"&&rt),rt.isTrigger=wn?2:3,rt.namespace=Mr.join("."),rt.rnamespace=rt.namespace?new RegExp("(^|\\.)"+Mr.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,rt.result=void 0,rt.target||(rt.target=tn),Vt=Vt==null?[rt]:W.makeArray(Vt,[rt]),Jn=W.event.special[ga]||{},!(!wn&&Jn.trigger&&Jn.trigger.apply(tn,Vt)===!1))){if(!wn&&!Jn.noBubble&&!J(tn)){for(da=Jn.delegateType||ga,Si.test(da+ga)||(zn=zn.parentNode);zn;zn=zn.parentNode)Gr.push(zn),xr=zn;xr===(tn.ownerDocument||$)&&Gr.push(xr.defaultView||xr.parentWindow||O)}for(qn=0;(zn=Gr[qn++])&&!rt.isPropagationStopped();)Ir=zn,rt.type=qn>1?da:Jn.bindType||ga,Fn=(gt.get(zn,"events")||Object.create(null))[rt.type]&>.get(zn,"handle"),Fn&&Fn.apply(zn,Vt),Fn=en&&zn[en],Fn&&Fn.apply&&_t(zn)&&(rt.result=Fn.apply(zn,Vt),rt.result===!1&&rt.preventDefault());return rt.type=ga,!wn&&!rt.isDefaultPrevented()&&(!Jn._default||Jn._default.apply(Gr.pop(),Vt)===!1)&&_t(tn)&&en&&U(tn[ga])&&!J(tn)&&(xr=tn[en],xr&&(tn[en]=null),W.event.triggered=ga,rt.isPropagationStopped()&&Ir.addEventListener(ga,qi),tn[ga](),rt.isPropagationStopped()&&Ir.removeEventListener(ga,qi),W.event.triggered=void 0,xr&&(tn[en]=xr)),rt.result}},simulate:function(rt,Vt,tn){var wn=W.extend(new W.Event,tn,{type:rt,isSimulated:!0});W.event.trigger(wn,null,Vt)}}),W.fn.extend({trigger:function(rt,Vt){return this.each(function(){W.event.trigger(rt,Vt,this)})},triggerHandler:function(rt,Vt){var tn=this[0];if(tn)return W.event.trigger(rt,Vt,tn,!0)}});var eo=/\[\]$/,xo=/\r?\n/g,cs=/^(?:submit|button|image|reset|file)$/i,ba=/^(?:input|select|textarea|keygen)/i;function sa($t,rt,Vt,tn){var wn;if(Array.isArray(rt))W.each(rt,function(qn,zn){Vt||eo.test($t)?tn($t,zn):sa($t+"["+(typeof zn=="object"&&zn!=null?qn:"")+"]",zn,Vt,tn)});else if(!Vt&&ie(rt)==="object")for(wn in rt)sa($t+"["+wn+"]",rt[wn],Vt,tn);else tn($t,rt)}W.param=function($t,rt){var Vt,tn=[],wn=function(zn,xr){var da=U(xr)?xr():xr;tn[tn.length]=encodeURIComponent(zn)+"="+encodeURIComponent(da==null?"":da)};if($t==null)return"";if(Array.isArray($t)||$t.jquery&&!W.isPlainObject($t))W.each($t,function(){wn(this.name,this.value)});else for(Vt in $t)sa(Vt,$t[Vt],rt,wn);return tn.join("&")},W.fn.extend({serialize:function(){return W.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var rt=W.prop(this,"elements");return rt?W.makeArray(rt):this}).filter(function(){var rt=this.type;return this.name&&!W(this).is(":disabled")&&ba.test(this.nodeName)&&!cs.test(rt)&&(this.checked||!$n.test(rt))}).map(function(rt,Vt){var tn=W(this).val();return tn==null?null:Array.isArray(tn)?W.map(tn,function(wn){return{name:Vt.name,value:wn.replace(xo,`\r +`)}}):{name:Vt.name,value:tn.replace(xo,`\r +`)}}).get()}});var Da=/%20/g,On=/#.*$/,xn=/([?&])_=[^&]*/,Rt=/^(.*?):[ \t]*([^\r\n]*)$/mg,mr=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ta=/^(?:GET|HEAD)$/,ma=/^\/\//,Oa={},Pn={},Kr="*/".concat("*"),Vn=$.createElement("a");Vn.href=ao.href;function tr($t){return function(rt,Vt){typeof rt!="string"&&(Vt=rt,rt="*");var tn,wn=0,qn=rt.toLowerCase().match(ht)||[];if(U(Vt))for(;tn=qn[wn++];)tn[0]==="+"?(tn=tn.slice(1)||"*",($t[tn]=$t[tn]||[]).unshift(Vt)):($t[tn]=$t[tn]||[]).push(Vt)}}function Ea($t,rt,Vt,tn){var wn={},qn=$t===Pn;function zn(xr){var da;return wn[xr]=!0,W.each($t[xr]||[],function(en,Fn){var Jn=Fn(rt,Vt,tn);if(typeof Jn=="string"&&!qn&&!wn[Jn])return rt.dataTypes.unshift(Jn),zn(Jn),!1;if(qn)return!(da=Jn)}),da}return zn(rt.dataTypes[0])||!wn["*"]&&zn("*")}function Ja($t,rt){var Vt,tn,wn=W.ajaxSettings.flatOptions||{};for(Vt in rt)rt[Vt]!==void 0&&((wn[Vt]?$t:tn||(tn={}))[Vt]=rt[Vt]);return tn&&W.extend(!0,$t,tn),$t}function go($t,rt,Vt){for(var tn,wn,qn,zn,xr=$t.contents,da=$t.dataTypes;da[0]==="*";)da.shift(),tn===void 0&&(tn=$t.mimeType||rt.getResponseHeader("Content-Type"));if(tn){for(wn in xr)if(xr[wn]&&xr[wn].test(tn)){da.unshift(wn);break}}if(da[0]in Vt)qn=da[0];else{for(wn in Vt){if(!da[0]||$t.converters[wn+" "+da[0]]){qn=wn;break}zn||(zn=wn)}qn=qn||zn}if(qn)return qn!==da[0]&&da.unshift(qn),Vt[qn]}function fi($t,rt,Vt,tn){var wn,qn,zn,xr,da,en={},Fn=$t.dataTypes.slice();if(Fn[1])for(zn in $t.converters)en[zn.toLowerCase()]=$t.converters[zn];for(qn=Fn.shift();qn;)if($t.responseFields[qn]&&(Vt[$t.responseFields[qn]]=rt),!da&&tn&&$t.dataFilter&&(rt=$t.dataFilter(rt,$t.dataType)),da=qn,qn=Fn.shift(),qn){if(qn==="*")qn=da;else if(da!=="*"&&da!==qn){if(zn=en[da+" "+qn]||en["* "+qn],!zn){for(wn in en)if(xr=wn.split(" "),xr[1]===qn&&(zn=en[da+" "+xr[0]]||en["* "+xr[0]],zn)){zn===!0?zn=en[wn]:en[wn]!==!0&&(qn=xr[0],Fn.unshift(xr[1]));break}}if(zn!==!0)if(zn&&$t.throws)rt=zn(rt);else try{rt=zn(rt)}catch(Jn){return{state:"parsererror",error:zn?Jn:"No conversion from "+da+" to "+qn}}}}return{state:"success",data:rt}}W.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ao.href,type:"GET",isLocal:mr.test(ao.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kr,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":W.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(rt,Vt){return Vt?Ja(Ja(rt,W.ajaxSettings),Vt):Ja(W.ajaxSettings,rt)},ajaxPrefilter:tr(Oa),ajaxTransport:tr(Pn),ajax:function(rt,Vt){typeof rt=="object"&&(Vt=rt,rt=void 0),Vt=Vt||{};var tn,wn,qn,zn,xr,da,en,Fn,Jn,Ir,Gr=W.ajaxSetup({},Vt),ga=Gr.context||Gr,Mr=Gr.context&&(ga.nodeType||ga.jquery)?W(ga):W.event,$a=W.Deferred(),Ya=W.Callbacks("once memory"),_o=Gr.statusCode||{},Ni={},ec={},ks="canceled",jo={readyState:0,getResponseHeader:function(Pa){var Qa;if(en){if(!zn)for(zn={};Qa=Rt.exec(qn);)zn[Qa[1].toLowerCase()+" "]=(zn[Qa[1].toLowerCase()+" "]||[]).concat(Qa[2]);Qa=zn[Pa.toLowerCase()+" "]}return Qa==null?null:Qa.join(", ")},getAllResponseHeaders:function(){return en?qn:null},setRequestHeader:function(Pa,Qa){return en==null&&(Pa=ec[Pa.toLowerCase()]=ec[Pa.toLowerCase()]||Pa,Ni[Pa]=Qa),this},overrideMimeType:function(Pa){return en==null&&(Gr.mimeType=Pa),this},statusCode:function(Pa){var Qa;if(Pa)if(en)jo.always(Pa[jo.status]);else for(Qa in Pa)_o[Qa]=[_o[Qa],Pa[Qa]];return this},abort:function(Pa){var Qa=Pa||ks;return tn&&tn.abort(Qa),Qn(0,Qa),this}};if($a.promise(jo),Gr.url=((rt||Gr.url||ao.href)+"").replace(ma,ao.protocol+"//"),Gr.type=Vt.method||Vt.type||Gr.method||Gr.type,Gr.dataTypes=(Gr.dataType||"*").toLowerCase().match(ht)||[""],Gr.crossDomain==null){da=$.createElement("a");try{da.href=Gr.url,da.href=da.href,Gr.crossDomain=Vn.protocol+"//"+Vn.host!=da.protocol+"//"+da.host}catch(ka){Gr.crossDomain=!0}}if(Gr.data&&Gr.processData&&typeof Gr.data!="string"&&(Gr.data=W.param(Gr.data,Gr.traditional)),Ea(Oa,Gr,Vt,jo),en)return jo;Fn=W.event&&Gr.global,Fn&&W.active++==0&&W.event.trigger("ajaxStart"),Gr.type=Gr.type.toUpperCase(),Gr.hasContent=!ta.test(Gr.type),wn=Gr.url.replace(On,""),Gr.hasContent?Gr.data&&Gr.processData&&(Gr.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&(Gr.data=Gr.data.replace(Da,"+")):(Ir=Gr.url.slice(wn.length),Gr.data&&(Gr.processData||typeof Gr.data=="string")&&(wn+=(Fi.test(wn)?"&":"?")+Gr.data,delete Gr.data),Gr.cache===!1&&(wn=wn.replace(xn,"$1"),Ir=(Fi.test(wn)?"&":"?")+"_="+Zi.guid+++Ir),Gr.url=wn+Ir),Gr.ifModified&&(W.lastModified[wn]&&jo.setRequestHeader("If-Modified-Since",W.lastModified[wn]),W.etag[wn]&&jo.setRequestHeader("If-None-Match",W.etag[wn])),(Gr.data&&Gr.hasContent&&Gr.contentType!==!1||Vt.contentType)&&jo.setRequestHeader("Content-Type",Gr.contentType),jo.setRequestHeader("Accept",Gr.dataTypes[0]&&Gr.accepts[Gr.dataTypes[0]]?Gr.accepts[Gr.dataTypes[0]]+(Gr.dataTypes[0]!=="*"?", "+Kr+"; q=0.01":""):Gr.accepts["*"]);for(Jn in Gr.headers)jo.setRequestHeader(Jn,Gr.headers[Jn]);if(Gr.beforeSend&&(Gr.beforeSend.call(ga,jo,Gr)===!1||en))return jo.abort();if(ks="abort",Ya.add(Gr.complete),jo.done(Gr.success),jo.fail(Gr.error),tn=Ea(Pn,Gr,Vt,jo),!tn)Qn(-1,"No Transport");else{if(jo.readyState=1,Fn&&Mr.trigger("ajaxSend",[jo,Gr]),en)return jo;Gr.async&&Gr.timeout>0&&(xr=O.setTimeout(function(){jo.abort("timeout")},Gr.timeout));try{en=!1,tn.send(Ni,Qn)}catch(ka){if(en)throw ka;Qn(-1,ka)}}function Qn(ka,Pa,Qa,Ei){var zo,fo,gs,Ks,pc,tc=Pa;en||(en=!0,xr&&O.clearTimeout(xr),tn=void 0,qn=Ei||"",jo.readyState=ka>0?4:0,zo=ka>=200&&ka<300||ka===304,Qa&&(Ks=go(Gr,jo,Qa)),!zo&&W.inArray("script",Gr.dataTypes)>-1&&W.inArray("json",Gr.dataTypes)<0&&(Gr.converters["text script"]=function(){}),Ks=fi(Gr,Ks,jo,zo),zo?(Gr.ifModified&&(pc=jo.getResponseHeader("Last-Modified"),pc&&(W.lastModified[wn]=pc),pc=jo.getResponseHeader("etag"),pc&&(W.etag[wn]=pc)),ka===204||Gr.type==="HEAD"?tc="nocontent":ka===304?tc="notmodified":(tc=Ks.state,fo=Ks.data,gs=Ks.error,zo=!gs)):(gs=tc,(ka||!tc)&&(tc="error",ka<0&&(ka=0))),jo.status=ka,jo.statusText=(Pa||tc)+"",zo?$a.resolveWith(ga,[fo,tc,jo]):$a.rejectWith(ga,[jo,tc,gs]),jo.statusCode(_o),_o=void 0,Fn&&Mr.trigger(zo?"ajaxSuccess":"ajaxError",[jo,Gr,zo?fo:gs]),Ya.fireWith(ga,[jo,tc]),Fn&&(Mr.trigger("ajaxComplete",[jo,Gr]),--W.active||W.event.trigger("ajaxStop")))}return jo},getJSON:function(rt,Vt,tn){return W.get(rt,Vt,tn,"json")},getScript:function(rt,Vt){return W.get(rt,void 0,Vt,"script")}}),W.each(["get","post"],function($t,rt){W[rt]=function(Vt,tn,wn,qn){return U(tn)&&(qn=qn||wn,wn=tn,tn=void 0),W.ajax(W.extend({url:Vt,type:rt,dataType:qn,data:tn,success:wn},W.isPlainObject(Vt)&&Vt))}}),W.ajaxPrefilter(function($t){var rt;for(rt in $t.headers)rt.toLowerCase()==="content-type"&&($t.contentType=$t.headers[rt]||"")}),W._evalUrl=function($t,rt,Vt){return W.ajax({url:$t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(wn){W.globalEval(wn,rt,Vt)}})},W.fn.extend({wrapAll:function(rt){var Vt;return this[0]&&(U(rt)&&(rt=rt.call(this[0])),Vt=W(rt,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&Vt.insertBefore(this[0]),Vt.map(function(){for(var tn=this;tn.firstElementChild;)tn=tn.firstElementChild;return tn}).append(this)),this},wrapInner:function(rt){return U(rt)?this.each(function(Vt){W(this).wrapInner(rt.call(this,Vt))}):this.each(function(){var Vt=W(this),tn=Vt.contents();tn.length?tn.wrapAll(rt):Vt.append(rt)})},wrap:function(rt){var Vt=U(rt);return this.each(function(tn){W(this).wrapAll(Vt?rt.call(this,tn):rt)})},unwrap:function(rt){return this.parent(rt).not("body").each(function(){W(this).replaceWith(this.childNodes)}),this}}),W.expr.pseudos.hidden=function($t){return!W.expr.pseudos.visible($t)},W.expr.pseudos.visible=function($t){return!!($t.offsetWidth||$t.offsetHeight||$t.getClientRects().length)},W.ajaxSettings.xhr=function(){try{return new O.XMLHttpRequest}catch($t){}};var lo={0:200,1223:204},Oi=W.ajaxSettings.xhr();B.cors=!!Oi&&"withCredentials"in Oi,B.ajax=Oi=!!Oi,W.ajaxTransport(function($t){var rt,Vt;if(B.cors||Oi&&!$t.crossDomain)return{send:function(wn,qn){var zn,xr=$t.xhr();if(xr.open($t.type,$t.url,$t.async,$t.username,$t.password),$t.xhrFields)for(zn in $t.xhrFields)xr[zn]=$t.xhrFields[zn];$t.mimeType&&xr.overrideMimeType&&xr.overrideMimeType($t.mimeType),!$t.crossDomain&&!wn["X-Requested-With"]&&(wn["X-Requested-With"]="XMLHttpRequest");for(zn in wn)xr.setRequestHeader(zn,wn[zn]);rt=function(en){return function(){rt&&(rt=Vt=xr.onload=xr.onerror=xr.onabort=xr.ontimeout=xr.onreadystatechange=null,en==="abort"?xr.abort():en==="error"?typeof xr.status!="number"?qn(0,"error"):qn(xr.status,xr.statusText):qn(lo[xr.status]||xr.status,xr.statusText,(xr.responseType||"text")!=="text"||typeof xr.responseText!="string"?{binary:xr.response}:{text:xr.responseText},xr.getAllResponseHeaders()))}},xr.onload=rt(),Vt=xr.onerror=xr.ontimeout=rt("error"),xr.onabort!==void 0?xr.onabort=Vt:xr.onreadystatechange=function(){xr.readyState===4&&O.setTimeout(function(){rt&&Vt()})},rt=rt("abort");try{xr.send($t.hasContent&&$t.data||null)}catch(da){if(rt)throw da}},abort:function(){rt&&rt()}}}),W.ajaxPrefilter(function($t){$t.crossDomain&&($t.contents.script=!1)}),W.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(rt){return W.globalEval(rt),rt}}}),W.ajaxPrefilter("script",function($t){$t.cache===void 0&&($t.cache=!1),$t.crossDomain&&($t.type="GET")}),W.ajaxTransport("script",function($t){if($t.crossDomain||$t.scriptAttrs){var rt,Vt;return{send:function(wn,qn){rt=W("",de=de.removeChild(de.firstChild)):typeof Kt.is=="string"?de=ja.createElement(Je,{is:Kt.is}):(de=ja.createElement(Je),Je==="select"&&(ja=de,Kt.multiple?ja.multiple=!0:Kt.size&&(ja.size=Kt.size))):de=ja.createElementNS(de,Je),de[Jo]=Ce,de[dn]=Kt,wv(de,Ce,!1,!1),Ce.stateNode=de,ja=$n(Je,Kt),Je){case"dialog":Hl("cancel",de),Hl("close",de),Mn=Kt;break;case"iframe":case"object":case"embed":Hl("load",de),Mn=Kt;break;case"video":case"audio":for(Mn=0;MnOc&&(Ce.flags|=64,Rr=!0,Hp(Kt,!1),Ce.lanes=33554432)}else{if(!Rr)if(de=Il(ja),de!==null){if(Ce.flags|=64,Rr=!0,Je=de.updateQueue,Je!==null&&(Ce.updateQueue=Je,Ce.flags|=4),Hp(Kt,!0),Kt.tail===null&&Kt.tailMode==="hidden"&&!ja.alternate&&!Du)return Ce=Ce.lastEffect=Kt.lastEffect,Ce!==null&&(Ce.nextEffect=null),null}else 2*ji()-Kt.renderingStartTime>Oc&&Je!==1073741824&&(Ce.flags|=64,Rr=!0,Hp(Kt,!1),Ce.lanes=33554432);Kt.isBackwards?(ja.sibling=Ce.child,Ce.child=ja):(Je=Kt.last,Je!==null?Je.sibling=ja:Ce.child=ja,Kt.last=ja)}return Kt.tail!==null?(Je=Kt.tail,Kt.rendering=Je,Kt.tail=Je.sibling,Kt.lastEffect=Ce.lastEffect,Kt.renderingStartTime=ji(),Je.sibling=null,Ce=oc.current,Fo(oc,Rr?Ce&1|2:Ce&1),Je):null;case 23:case 24:return Xl(),de!==null&&de.memoizedState!==null!=(Ce.memoizedState!==null)&&Kt.mode!=="unstable-defer-without-hiding"&&(Ce.flags|=4),null}throw Error(C(156,Ce.tag))}function Gp(de){switch(de.tag){case 1:yr(de.type)&&Ls();var Ce=de.flags;return Ce&4096?(de.flags=Ce&-4097|64,de):null;case 3:if(Yo(),Io(ys),Io(ms),wt(),Ce=de.flags,(Ce&64)!=0)throw Error(C(285));return de.flags=Ce&-4097|64,de;case 5:return ds(de),null;case 13:return Io(oc),Ce=de.flags,Ce&4096?(de.flags=Ce&-4097|64,de):null;case 19:return Io(oc),null;case 4:return Yo(),null;case 10:return Lu(de),null;case 23:case 24:return Xl(),null;default:return null}}function Ap(de,Ce){try{var Je="",Kt=Ce;do Je+=Xe(Kt),Kt=Kt.return;while(Kt);var Mn=Je}catch(Rr){Mn=` +Error generating stack: `+Rr.message+` +`+Rr.stack}return{value:de,source:Ce,stack:Mn}}function hv(de,Ce){try{console.error(Ce.value)}catch(Je){setTimeout(function(){throw Je})}}var kp=typeof WeakMap=="function"?WeakMap:Map;function bp(de,Ce,Je){Je=Bd(-1,Je),Je.tag=3,Je.payload={element:null};var Kt=Ce.value;return Je.callback=function(){No||(No=!0,vc=Kt),hv(de,Ce)},Je}function jf(de,Ce,Je){Je=Bd(-1,Je),Je.tag=3;var Kt=de.type.getDerivedStateFromError;if(typeof Kt=="function"){var Mn=Ce.value;Je.payload=function(){return hv(de,Ce),Kt(Mn)}}var Rr=de.stateNode;return Rr!==null&&typeof Rr.componentDidCatch=="function"&&(Je.callback=function(){typeof Kt!="function"&&(kt===null?kt=new Set([this]):kt.add(this),hv(de,Ce));var ja=Ce.stack;this.componentDidCatch(Ce.value,{componentStack:ja!==null?ja:""})}),Je}var qf=typeof WeakSet=="function"?WeakSet:Set;function Eh(de){var Ce=de.ref;if(Ce!==null)if(typeof Ce=="function")try{Ce(null)}catch(Je){xu(de,Je)}else Ce.current=null}function Av(de,Ce){switch(Ce.tag){case 0:case 11:case 15:case 22:return;case 1:if(Ce.flags&256&&de!==null){var Je=de.memoizedProps,Kt=de.memoizedState;de=Ce.stateNode,Ce=de.getSnapshotBeforeUpdate(Ce.elementType===Ce.type?Je:Rl(Ce.type,Je),Kt),de.__reactInternalSnapshotBeforeUpdate=Ce}return;case 3:Ce.flags&256&&Ra(Ce.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(C(163))}function Lg(de,Ce,Je){switch(Je.tag){case 0:case 11:case 15:case 22:if(Ce=Je.updateQueue,Ce=Ce!==null?Ce.lastEffect:null,Ce!==null){de=Ce=Ce.next;do{if((de.tag&3)==3){var Kt=de.create;de.destroy=Kt()}de=de.next}while(de!==Ce)}if(Ce=Je.updateQueue,Ce=Ce!==null?Ce.lastEffect:null,Ce!==null){de=Ce=Ce.next;do{var Mn=de;Kt=Mn.next,Mn=Mn.tag,(Mn&4)!=0&&(Mn&1)!=0&&(rs(Je,de),oi(Je,de)),de=Kt}while(de!==Ce)}return;case 1:de=Je.stateNode,Je.flags&4&&(Ce===null?de.componentDidMount():(Kt=Je.elementType===Je.type?Ce.memoizedProps:Rl(Je.type,Ce.memoizedProps),de.componentDidUpdate(Kt,Ce.memoizedState,de.__reactInternalSnapshotBeforeUpdate))),Ce=Je.updateQueue,Ce!==null&&ld(Je,Ce,de);return;case 3:if(Ce=Je.updateQueue,Ce!==null){if(de=null,Je.child!==null)switch(Je.child.tag){case 5:de=Je.child.stateNode;break;case 1:de=Je.child.stateNode}ld(Je,Ce,de)}return;case 5:de=Je.stateNode,Ce===null&&Je.flags&4&&yn(Je.type,Je.memoizedProps)&&de.focus();return;case 6:return;case 4:return;case 12:return;case 13:Je.memoizedState===null&&(Je=Je.alternate,Je!==null&&(Je=Je.memoizedState,Je!==null&&(Je=Je.dehydrated,Je!==null&&ar(Je))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(C(163))}function Fg(de,Ce){for(var Je=de;;){if(Je.tag===5){var Kt=Je.stateNode;if(Ce)Kt=Kt.style,typeof Kt.setProperty=="function"?Kt.setProperty("display","none","important"):Kt.display="none";else{Kt=Je.stateNode;var Mn=Je.memoizedProps.style;Mn=Mn!=null&&Mn.hasOwnProperty("display")?Mn.display:null,Kt.style.display=Pt("display",Mn)}}else if(Je.tag===6)Je.stateNode.nodeValue=Ce?"":Je.memoizedProps;else if((Je.tag!==23&&Je.tag!==24||Je.memoizedState===null||Je===de)&&Je.child!==null){Je.child.return=Je,Je=Je.child;continue}if(Je===de)break;for(;Je.sibling===null;){if(Je.return===null||Je.return===de)return;Je=Je.return}Je.sibling.return=Je.return,Je=Je.sibling}}function xh(de,Ce){if(qr&&typeof qr.onCommitFiberUnmount=="function")try{qr.onCommitFiberUnmount(cr,Ce)}catch(Rr){}switch(Ce.tag){case 0:case 11:case 14:case 15:case 22:if(de=Ce.updateQueue,de!==null&&(de=de.lastEffect,de!==null)){var Je=de=de.next;do{var Kt=Je,Mn=Kt.destroy;if(Kt=Kt.tag,Mn!==void 0)if((Kt&4)!=0)rs(Ce,Je);else{Kt=Ce;try{Mn()}catch(Rr){xu(Kt,Rr)}}Je=Je.next}while(Je!==de)}break;case 1:if(Eh(Ce),de=Ce.stateNode,typeof de.componentWillUnmount=="function")try{de.props=Ce.memoizedProps,de.state=Ce.memoizedState,de.componentWillUnmount()}catch(Rr){xu(Ce,Rr)}break;case 5:Eh(Ce);break;case 4:Jv(de,Ce)}}function gv(de){de.alternate=null,de.child=null,de.dependencies=null,de.firstEffect=null,de.lastEffect=null,de.memoizedProps=null,de.memoizedState=null,de.pendingProps=null,de.return=null,de.updateQueue=null}function vh(de){return de.tag===5||de.tag===3||de.tag===4}function Uh(de){e:{for(var Ce=de.return;Ce!==null;){if(vh(Ce))break e;Ce=Ce.return}throw Error(C(160))}var Je=Ce;switch(Ce=Je.stateNode,Je.tag){case 5:var Kt=!1;break;case 3:Ce=Ce.containerInfo,Kt=!0;break;case 4:Ce=Ce.containerInfo,Kt=!0;break;default:throw Error(C(161))}Je.flags&16&&(Ot(Ce,""),Je.flags&=-17);e:t:for(Je=de;;){for(;Je.sibling===null;){if(Je.return===null||vh(Je.return)){Je=null;break e}Je=Je.return}for(Je.sibling.return=Je.return,Je=Je.sibling;Je.tag!==5&&Je.tag!==6&&Je.tag!==18;){if(Je.flags&2||Je.child===null||Je.tag===4)continue t;Je.child.return=Je,Je=Je.child}if(!(Je.flags&2)){Je=Je.stateNode;break e}}Kt?Sh(de,Je,Ce):mv(de,Je,Ce)}function Sh(de,Ce,Je){var Kt=de.tag,Mn=Kt===5||Kt===6;if(Mn)de=Mn?de.stateNode:de.stateNode.instance,Ce?Je.nodeType===8?Je.parentNode.insertBefore(de,Ce):Je.insertBefore(de,Ce):(Je.nodeType===8?(Ce=Je.parentNode,Ce.insertBefore(de,Je)):(Ce=Je,Ce.appendChild(de)),Je=Je._reactRootContainer,Je!=null||Ce.onclick!==null||(Ce.onclick=El));else if(Kt!==4&&(de=de.child,de!==null))for(Sh(de,Ce,Je),de=de.sibling;de!==null;)Sh(de,Ce,Je),de=de.sibling}function mv(de,Ce,Je){var Kt=de.tag,Mn=Kt===5||Kt===6;if(Mn)de=Mn?de.stateNode:de.stateNode.instance,Ce?Je.insertBefore(de,Ce):Je.appendChild(de);else if(Kt!==4&&(de=de.child,de!==null))for(mv(de,Ce,Je),de=de.sibling;de!==null;)mv(de,Ce,Je),de=de.sibling}function Jv(de,Ce){for(var Je=Ce,Kt=!1,Mn,Rr;;){if(!Kt){Kt=Je.return;e:for(;;){if(Kt===null)throw Error(C(160));switch(Mn=Kt.stateNode,Kt.tag){case 5:Rr=!1;break e;case 3:Mn=Mn.containerInfo,Rr=!0;break e;case 4:Mn=Mn.containerInfo,Rr=!0;break e}Kt=Kt.return}Kt=!0}if(Je.tag===5||Je.tag===6){e:for(var ja=de,ci=Je,yo=ci;;)if(xh(ja,yo),yo.child!==null&&yo.tag!==4)yo.child.return=yo,yo=yo.child;else{if(yo===ci)break e;for(;yo.sibling===null;){if(yo.return===null||yo.return===ci)break e;yo=yo.return}yo.sibling.return=yo.return,yo=yo.sibling}Rr?(ja=Mn,ci=Je.stateNode,ja.nodeType===8?ja.parentNode.removeChild(ci):ja.removeChild(ci)):Mn.removeChild(Je.stateNode)}else if(Je.tag===4){if(Je.child!==null){Mn=Je.stateNode.containerInfo,Rr=!0,Je.child.return=Je,Je=Je.child;continue}}else if(xh(de,Je),Je.child!==null){Je.child.return=Je,Je=Je.child;continue}if(Je===Ce)break;for(;Je.sibling===null;){if(Je.return===null||Je.return===Ce)return;Je=Je.return,Je.tag===4&&(Kt=!1)}Je.sibling.return=Je.return,Je=Je.sibling}}function mg(de,Ce){switch(Ce.tag){case 0:case 11:case 14:case 15:case 22:var Je=Ce.updateQueue;if(Je=Je!==null?Je.lastEffect:null,Je!==null){var Kt=Je=Je.next;do(Kt.tag&3)==3&&(de=Kt.destroy,Kt.destroy=void 0,de!==void 0&&de()),Kt=Kt.next;while(Kt!==Je)}return;case 1:return;case 5:if(Je=Ce.stateNode,Je!=null){Kt=Ce.memoizedProps;var Mn=de!==null?de.memoizedProps:Kt;de=Ce.type;var Rr=Ce.updateQueue;if(Ce.updateQueue=null,Rr!==null){for(Je[dn]=Kt,de==="input"&&Kt.type==="radio"&&Kt.name!=null&&Re(Je,Kt),$n(de,Mn),Ce=$n(de,Kt),Mn=0;MnMn&&(Mn=ja),Je&=~Rr}if(Je=Mn,Je=ji()-Je,Je=(120>Je?120:480>Je?480:1080>Je?1080:1920>Je?1920:3e3>Je?3e3:4320>Je?4320:1960*gh(Je/1960))-Je,10 component higher in the tree to provide a loading indicator or placeholder to display.`)}So!==5&&(So=2),yo=Ap(yo,ci),Gc=ja;do{switch(Gc.tag){case 3:Rr=yo,Gc.flags|=4096,Ce&=-Ce,Gc.lanes|=Ce;var Td=bp(Gc,Rr,Ce);xd(Gc,Td);break e;case 1:Rr=yo;var Ou=Gc.type,Sd=Gc.stateNode;if((Gc.flags&64)==0&&(typeof Ou.getDerivedStateFromError=="function"||Sd!==null&&typeof Sd.componentDidCatch=="function"&&(kt===null||!kt.has(Sd)))){Gc.flags|=4096,Ce&=-Ce,Gc.lanes|=Ce;var Vd=jf(Gc,Rr,Ce);xd(Gc,Vd);break e}}Gc=Gc.return}while(Gc!==null)}Jl(Je)}catch(Rd){Ce=Rd,Br===Je&&Je!==null&&(Br=Je=Je.return);continue}break}while(1)}function Zd(){var de=kv.current;return kv.current=Gu,de===null?Gu:de}function Zl(de,Ce){var Je=od;od|=16;var Kt=Zd();_r===de&&ei===Ce||vd(de,Ce);do try{wf();break}catch(Mn){ff(de,Mn)}while(1);if(Od(),od=Je,kv.current=Kt,Br!==null)throw Error(C(261));return _r=null,ei=0,So}function wf(){for(;Br!==null;)Al(Br)}function Wd(){for(;Br!==null&&!As();)Al(Br)}function Al(de){var Ce=Ai(de.alternate,de,Ao);de.memoizedProps=de.pendingProps,Ce===null?Jl(de):Br=Ce,$p.current=null}function Jl(de){var Ce=de;do{var Je=Ce.alternate;if(de=Ce.return,(Ce.flags&2048)==0){if(Je=Tv(Je,Ce,Ao),Je!==null){Br=Je;return}if(Je=Ce,Je.tag!==24&&Je.tag!==23||Je.memoizedState===null||(Ao&1073741824)!=0||(Je.mode&4)==0){for(var Kt=0,Mn=Je.child;Mn!==null;)Kt|=Mn.lanes|Mn.childLanes,Mn=Mn.sibling;Je.childLanes=Kt}de!==null&&(de.flags&2048)==0&&(de.firstEffect===null&&(de.firstEffect=Ce.firstEffect),Ce.lastEffect!==null&&(de.lastEffect!==null&&(de.lastEffect.nextEffect=Ce.firstEffect),de.lastEffect=Ce.lastEffect),1ja&&(ci=ja,ja=Td,Td=ci),ci=ps(Wo,Td),Rr=ps(Wo,ja),ci&&Rr&&(jc.rangeCount!==1||jc.anchorNode!==ci.node||jc.anchorOffset!==ci.offset||jc.focusNode!==Rr.node||jc.focusOffset!==Rr.offset)&&(ic=ic.createRange(),ic.setStart(ci.node,ci.offset),jc.removeAllRanges(),Td>ja?(jc.addRange(ic),jc.extend(Rr.node,Rr.offset)):(ic.setEnd(Rr.node,Rr.offset),jc.addRange(ic)))))),ic=[],jc=Wo;jc=jc.parentNode;)jc.nodeType===1&&ic.push({element:jc,left:jc.scrollLeft,top:jc.scrollTop});for(typeof Wo.focus=="function"&&Wo.focus(),Wo=0;Woji()-Hc?vd(de,0):qs|=Je),ac(de,Ce)}function wa(de,Ce){var Je=de.stateNode;Je!==null&&Je.delete(Ce),Ce=0,Ce===0&&(Ce=de.mode,(Ce&2)==0?Ce=1:(Ce&4)==0?Ce=xa()===99?1:2:(ha===0&&(ha=Fs),Ce=ma(62914560&~ha),Ce===0&&(Ce=4194304))),Je=Xi(),de=Os(de,Ce),de!==null&&(Pn(de,Ce,Je),ac(de,Je))}var Ai;Ai=function(de,Ce,Je){var Kt=Ce.lanes;if(de!==null)if(de.memoizedProps!==Ce.pendingProps||ys.current)Vu=!0;else if((Je&Kt)!=0)Vu=(de.flags&16384)!=0;else{switch(Vu=!1,Ce.tag){case 3:ph(Ce),Ae();break;case 5:Mi(Ce);break;case 1:yr(Ce.type)&&Hs(Ce);break;case 4:Vr(Ce,Ce.stateNode.containerInfo);break;case 10:Kt=Ce.memoizedProps.value;var Mn=Ce.type._context;Fo(Ol,Mn._currentValue),Mn._currentValue=Kt;break;case 13:if(Ce.memoizedState!==null)return(Je&Ce.child.childLanes)!=0?Xv(de,Ce,Je):(Fo(oc,oc.current&1),Ce=Pp(de,Ce,Je),Ce!==null?Ce.sibling:null);Fo(oc,oc.current&1);break;case 19:if(Kt=(Je&Ce.childLanes)!=0,(de.flags&64)!=0){if(Kt)return Sv(de,Ce,Je);Ce.flags|=64}if(Mn=Ce.memoizedState,Mn!==null&&(Mn.rendering=null,Mn.tail=null,Mn.lastEffect=null),Fo(oc,oc.current),Kt)break;return null;case 23:case 24:return Ce.lanes=0,Tp(de,Ce,Je)}return Pp(de,Ce,Je)}else Vu=!1;switch(Ce.lanes=0,Ce.tag){case 2:if(Kt=Ce.type,de!==null&&(de.alternate=null,Ce.alternate=null,Ce.flags|=2),de=Ce.pendingProps,Mn=Po(Ce,ms.current),af(Ce,Je),Mn=ev(null,Ce,Kt,de,Mn,Je),Ce.flags|=1,typeof Mn=="object"&&Mn!==null&&typeof Mn.render=="function"&&Mn.$$typeof===void 0){if(Ce.tag=1,Ce.memoizedState=null,Ce.updateQueue=null,yr(Kt)){var Rr=!0;Hs(Ce)}else Rr=!1;Ce.memoizedState=Mn.state!==null&&Mn.state!==void 0?Mn.state:null,kd(Ce);var ja=Kt.getDerivedStateFromProps;typeof ja=="function"&&ll(Ce,Kt,ja,de),Mn.updater=ad,Ce.stateNode=Mn,Mn._reactInternals=Ce,Uu(Ce,Kt,de,Je),Ce=tv(null,Ce,Kt,!0,Rr,Je)}else Ce.tag=0,lf(null,Ce,Mn,Je),Ce=Ce.child;return Ce;case 16:Mn=Ce.elementType;e:{switch(de!==null&&(de.alternate=null,Ce.alternate=null,Ce.flags|=2),de=Ce.pendingProps,Rr=Mn._init,Mn=Rr(Mn._payload),Ce.type=Mn,Rr=Ce.tag=ki(Mn),de=Rl(Mn,de),Rr){case 0:Ce=vp(null,Ce,Mn,de,Je);break e;case 1:Ce=Uv(null,Ce,Mn,de,Je);break e;case 11:Ce=cp(null,Ce,Mn,de,Je);break e;case 14:Ce=Gf(null,Ce,Mn,Rl(Mn.type,de),Kt,Je);break e}throw Error(C(306,Mn,""))}return Ce;case 0:return Kt=Ce.type,Mn=Ce.pendingProps,Mn=Ce.elementType===Kt?Mn:Rl(Kt,Mn),vp(de,Ce,Kt,Mn,Je);case 1:return Kt=Ce.type,Mn=Ce.pendingProps,Mn=Ce.elementType===Kt?Mn:Rl(Kt,Mn),Uv(de,Ce,Kt,Mn,Je);case 3:if(ph(Ce),Kt=Ce.updateQueue,de===null||Kt===null)throw Error(C(282));if(Kt=Ce.pendingProps,Mn=Ce.memoizedState,Mn=Mn!==null?Mn.element:null,xf(de,Ce),of(Ce,Kt,null,Je),Kt=Ce.memoizedState.element,Kt===Mn)Ae(),Ce=Pp(de,Ce,Je);else{if(Mn=Ce.stateNode,(Rr=Mn.hydrate)&&(Nl=wi(Ce.stateNode.containerInfo.firstChild),pu=Ce,Rr=Du=!0),Rr){if(de=Mn.mutableSourceEagerHydrationData,de!=null)for(Mn=0;MnA;)O(y,A,arguments[A++]);return y.length=S,y}})},"z+Cf":function(ce,R,l){"use strict";Object.defineProperty(R,"__esModule",{value:!0}),R.cssValue=R.parseLengthAndUnit=void 0;var E={cm:!0,mm:!0,in:!0,px:!0,pt:!0,pc:!0,em:!0,ex:!0,ch:!0,rem:!0,vw:!0,vh:!0,vmin:!0,vmax:!0,"%":!0};function m(C){if(typeof C=="number")return{value:C,unit:"px"};var k,A=(C.match(/^[0-9.]*/)||"").toString();A.includes(".")?k=parseFloat(A):k=parseInt(A,10);var S=(C.match(/[^0-9]*$/)||"").toString();return E[S]?{value:k,unit:S}:(console.warn("React Spinners: "+C+" is not a valid css value. Defaulting to "+k+"px."),{value:k,unit:"px"})}R.parseLengthAndUnit=m;function O(C){var k=m(C);return""+k.value+k.unit}R.cssValue=O},"z/XJ":function(ce,R,l){"use strict";var E=l("TqRt"),m=l("cDf5");Object.defineProperty(R,"__esModule",{value:!0}),R.default=void 0;var O=E(l("3tO9")),C=y(l("q1tI")),k=E(l("g4LC")),A=E(l("KQxl"));function S(T){if(typeof WeakMap!="function")return null;var j=new WeakMap,D=new WeakMap;return(S=function(F){return F?D:j})(T)}function y(T,j){if(!j&&T&&T.__esModule)return T;if(T===null||m(T)!=="object"&&typeof T!="function")return{default:T};var D=S(j);if(D&&D.has(T))return D.get(T);var N={},F=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var B in T)if(B!=="default"&&Object.prototype.hasOwnProperty.call(T,B)){var U=F?Object.getOwnPropertyDescriptor(T,B):null;U&&(U.get||U.set)?Object.defineProperty(N,B,U):N[B]=T[B]}return N.default=T,D&&D.set(T,N),N}var w=function(j,D){return C.createElement(A.default,(0,O.default)((0,O.default)({},j),{},{ref:D,icon:k.default}))};w.displayName="CloseCircleOutlined";var x=C.forwardRef(w);R.default=x},"z01/":function(ce,R){function l(E){return ce.exports=l=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(m){return typeof m}:function(m){return m&&typeof Symbol=="function"&&m.constructor===Symbol&&m!==Symbol.prototype?"symbol":typeof m},ce.exports.__esModule=!0,ce.exports.default=ce.exports,l(E)}ce.exports=l,ce.exports.__esModule=!0,ce.exports.default=ce.exports},z4Hk:function(ce,R,l){"use strict";Object.defineProperty(R,"__esModule",{value:!0}),R.BindingWhenSyntax=void 0;var E=l("406g"),m=l("RR/i"),O=function(){function C(k){this._binding=k}return C.prototype.when=function(k){return this._binding.constraint=k,new E.BindingOnSyntax(this._binding)},C.prototype.whenTargetNamed=function(k){return this._binding.constraint=m.namedConstraint(k),new E.BindingOnSyntax(this._binding)},C.prototype.whenTargetIsDefault=function(){return this._binding.constraint=function(k){var A=k.target!==null&&!k.target.isNamed()&&!k.target.isTagged();return A},new E.BindingOnSyntax(this._binding)},C.prototype.whenTargetTagged=function(k,A){return this._binding.constraint=m.taggedConstraint(k)(A),new E.BindingOnSyntax(this._binding)},C.prototype.whenInjectedInto=function(k){return this._binding.constraint=function(A){return m.typeConstraint(k)(A.parentRequest)},new E.BindingOnSyntax(this._binding)},C.prototype.whenParentNamed=function(k){return this._binding.constraint=function(A){return m.namedConstraint(k)(A.parentRequest)},new E.BindingOnSyntax(this._binding)},C.prototype.whenParentTagged=function(k,A){return this._binding.constraint=function(S){return m.taggedConstraint(k)(A)(S.parentRequest)},new E.BindingOnSyntax(this._binding)},C.prototype.whenAnyAncestorIs=function(k){return this._binding.constraint=function(A){return m.traverseAncerstors(A,m.typeConstraint(k))},new E.BindingOnSyntax(this._binding)},C.prototype.whenNoAncestorIs=function(k){return this._binding.constraint=function(A){return!m.traverseAncerstors(A,m.typeConstraint(k))},new E.BindingOnSyntax(this._binding)},C.prototype.whenAnyAncestorNamed=function(k){return this._binding.constraint=function(A){return m.traverseAncerstors(A,m.namedConstraint(k))},new E.BindingOnSyntax(this._binding)},C.prototype.whenNoAncestorNamed=function(k){return this._binding.constraint=function(A){return!m.traverseAncerstors(A,m.namedConstraint(k))},new E.BindingOnSyntax(this._binding)},C.prototype.whenAnyAncestorTagged=function(k,A){return this._binding.constraint=function(S){return m.traverseAncerstors(S,m.taggedConstraint(k)(A))},new E.BindingOnSyntax(this._binding)},C.prototype.whenNoAncestorTagged=function(k,A){return this._binding.constraint=function(S){return!m.traverseAncerstors(S,m.taggedConstraint(k)(A))},new E.BindingOnSyntax(this._binding)},C.prototype.whenAnyAncestorMatches=function(k){return this._binding.constraint=function(A){return m.traverseAncerstors(A,k)},new E.BindingOnSyntax(this._binding)},C.prototype.whenNoAncestorMatches=function(k){return this._binding.constraint=function(A){return!m.traverseAncerstors(A,k)},new E.BindingOnSyntax(this._binding)},C}();R.BindingWhenSyntax=O},z9fm:function(ce,R,l){"use strict";var E=l("ENif"),m=l("f1E4"),O=l("oa35"),C=l("FCfD"),k=l("xH5X"),A=l("dagG");E("match",1,function(S,y,w){return[function(T){var j=C(this),D=T==null?void 0:T[S];return D!==void 0?D.call(T,j):new RegExp(T)[S](String(j))},function(x){var T=w(y,x,this);if(T.done)return T.value;var j=m(x),D=String(this);if(!j.global)return A(j,D);var N=j.unicode;j.lastIndex=0;for(var F=[],B=0,U;(U=A(j,D))!==null;){var J=String(U[0]);F[B]=J,J===""&&(j.lastIndex=k(D,O(j.lastIndex),N)),B++}return B===0?null:F}]})},zEVN:function(ce,R,l){var E=l("Gi0A"),m=l("sEf8"),O=l("mdPL"),C=O&&O.isMap,k=C?m(C):E;ce.exports=k},zLVn:function(ce,R,l){"use strict";l.d(R,"a",function(){return E});function E(m,O){if(m==null)return{};var C={},k=Object.keys(m),A,S;for(S=0;S=0)&&(C[A]=m[A]);return C}},zP5H:function(ce,R,l){"use strict";l.d(R,"a",function(){return m});var E=l("q1tI");function m(C){var k=E.createContext(null);function A(y){var w=C(y.initialState);return E.createElement(k.Provider,{value:w},y.children)}function S(){var y=E.useContext(k);if(y===null)throw new Error("Component must be wrapped with ");return y}return{Provider:A,useContainer:S}}function O(C){return C.useContainer()}},zTPR:function(ce,R,l){"use strict";var E=l("/gva"),m=l("vO0A");ce.exports=E("Set",function(O){return function(){return O(this,arguments.length?arguments[0]:void 0)}},m)},zZ0H:function(ce,R){function l(E){return E}ce.exports=l},zbpD:function(ce,R,l){"use strict";var E=l("284h").default,m=l("TqRt").default;Object.defineProperty(R,"__esModule",{value:!0}),Object.defineProperty(R,"List",{enumerable:!0,get:function(){return y.List}}),R.default=void 0,Object.defineProperty(R,"useForm",{enumerable:!0,get:function(){return F.default}}),Object.defineProperty(R,"useWatch",{enumerable:!0,get:function(){return y.useWatch}});var O=m(l("pVnL")),C=m(l("cDf5")),k=m(l("J4zp")),A=m(l("lSNA")),S=m(l("TSYQ")),y=E(l("85Yc")),w=E(l("q1tI")),x=l("vgIT"),T=E(l("i4Ex")),j=E(l("fVhf")),D=l("Gi/T"),N=m(l("aWDn")),F=m(l("hpdD")),B=function(X,ee){var ie={};for(var G in X)Object.prototype.hasOwnProperty.call(X,G)&&ee.indexOf(G)<0&&(ie[G]=X[G]);if(X!=null&&typeof Object.getOwnPropertySymbols=="function")for(var Q=0,G=Object.getOwnPropertySymbols(X);Q=0)&&(pe[Me]=we[Me]);return pe}function F(we,fe){if(we==null)return{};var pe=N(we,fe),Ke,Me;if(Object.getOwnPropertySymbols){var ze=Object.getOwnPropertySymbols(we);for(Me=0;Me=0)&&(!Object.prototype.propertyIsEnumerable.call(we,Ke)||(pe[Ke]=we[Ke]))}return pe}function B(we,fe){return U(we)||J(we,fe)||$(we,fe)||ee()}function U(we){if(Array.isArray(we))return we}function J(we,fe){var pe=we==null?null:typeof Symbol!="undefined"&&we[Symbol.iterator]||we["@@iterator"];if(pe!=null){var Ke=[],Me=!0,ze=!1,Ue,He;try{for(pe=pe.call(we);!(Me=(Ue=pe.next()).done)&&(Ke.push(Ue.value),!(fe&&Ke.length===fe));Me=!0);}catch(Ne){ze=!0,He=Ne}finally{try{!Me&&pe.return!=null&&pe.return()}finally{if(ze)throw He}}return Ke}}function $(we,fe){if(!!we){if(typeof we=="string")return X(we,fe);var pe=Object.prototype.toString.call(we).slice(8,-1);if(pe==="Object"&&we.constructor&&(pe=we.constructor.name),pe==="Map"||pe==="Set")return Array.from(we);if(pe==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(pe))return X(we,fe)}}function X(we,fe){(fe==null||fe>we.length)&&(fe=we.length);for(var pe=0,Ke=new Array(fe);pe=we.length?{done:!0}:{done:!1,value:we[Ke++]}},e:function(it){throw it},f:Me}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ze=!0,Ue=!1,He;return{s:function(){pe=pe.call(we)},n:function(){var it=pe.next();return ze=it.done,it},e:function(it){Ue=!0,He=it},f:function(){try{!ze&&pe.return!=null&&pe.return()}finally{if(Ue)throw He}}}}function G(we){return S.default.createElement(m.__RouterContext.Consumer,null,function(fe){var pe=we.location||fe.location,Ke=we.computedMatch,Me=w(w({},fe),{},{location:pe,match:Ke}),ze=we.render;return S.default.createElement(m.__RouterContext.Provider,{value:Me},Me.match?ze(w(w({},we.layoutProps),Me)):null)})}var Q=["children"];function W(we){return S.default.createElement(m.__RouterContext.Consumer,null,function(fe){var pe=we.children,Ke=F(we,Q),Me=we.location||fe.location,ze,Ue=null;return O.Children.forEach(pe,function(He){if(Ue===null&&O.isValidElement(He)){ze=He;var Ne=He.props.path||He.props.from;Ue=Ne?m.matchPath(Me.pathname,w(w({},He.props),{},{path:Ne})):fe.match}}),Ue?O.cloneElement(ze,{location:Me,computedMatch:Ue,layoutProps:Ke}):null})}var ne=["component"];function te(we,fe){var pe=we.component,Ke=F(we,ne),Me=we.component;function ze(Ue){var He=O.useState(function(){return window.g_initialProps}),Ne=B(He,2),it=Ne[0],Xe=Ne[1];return O.useEffect(function(){var ht=function(){var lt=T(E().mark(function Et(){var tt,mt,xt,Xt,vt;return E().wrap(function(Re){for(;;)switch(Re.prev=Re.next){case 0:if(mt=Me,!Me.preload){Re.next=6;break}return Re.next=4,Me.preload();case 4:mt=Re.sent,mt=mt.default||mt;case 6:if(xt=w(w({isServer:!1,match:Ue==null?void 0:Ue.match,history:Ue==null?void 0:Ue.history,route:we},fe.getInitialPropsCtx||{}),Ke),!((tt=mt)===null||tt===void 0?void 0:tt.getInitialProps)){Re.next=15;break}return Re.next=10,fe.plugin.applyPlugins({key:"ssr.modifyGetInitialPropsCtx",type:m.ApplyPluginsType.modify,initialValue:xt,async:!0});case 10:return Xt=Re.sent,Re.next=13,mt.getInitialProps(Xt||xt);case 13:vt=Re.sent,Xe(vt);case 15:case"end":return Re.stop()}},Et)}));return function(){return lt.apply(this,arguments)}}();window.g_initialProps||ht()},[window.location.pathname,window.location.search]),S.default.createElement(Me,D({},Ue,it))}return ze.wrapInitialPropsLoaded=!0,ze.displayName="ComponentWithInitialPropsFetch",ze}function _e(we){var fe=we.route,pe=we.opts,Ke=we.props,Me=oe(w(w({},pe),{},{routes:fe.routes||[],rootRoutes:pe.rootRoutes}),{location:Ke.location}),ze=fe.component,Ue=fe.wrappers;if(ze){var He=pe.isServer?{}:window.g_initialProps,Ne=w(w(w(w({},Ke),pe.extraProps),pe.pageInitialProps||He),{},{route:fe,routes:pe.rootRoutes}),it=S.default.createElement(ze,Ne,Me);if(Ue)for(var Xe=Ue.length-1;Xe>=0;)it=O.createElement(Ue[Xe],Ne,it),Xe-=1;return it}else return Me}function he(we){var fe=we.route,pe=we.index,Ke=we.opts,Me={key:fe.key||pe,exact:fe.exact,strict:fe.strict,sensitive:fe.sensitive,path:fe.path};if(fe.redirect)return S.default.createElement(m.Redirect,D({},Me,{from:fe.path,to:fe.redirect}));var ze,Ue,He;return Ke.ssrProps&&!Ke.isServer&&!((ze=fe.component)===null||ze===void 0?void 0:ze.wrapInitialPropsLoaded)&&(((Ue=fe.component)===null||Ue===void 0?void 0:Ue.getInitialProps)||((He=fe.component)===null||He===void 0?void 0:He.preload))&&(fe.component=te(fe,Ke)),S.default.createElement(G,D({},Me,{render:function(it){return _e({route:fe,opts:Ke,props:it})}}))}function oe(we){var fe=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return we.routes?S.default.createElement(W,fe,we.routes.map(function(pe,Ke){return he({route:pe,index:Ke,opts:w(w({},we),{},{rootRoutes:we.rootRoutes||we.routes})})})):null}var ge=["history"];function me(we){var fe=we.history,pe=F(we,ge);return O.useEffect(function(){window.g_useSSR&&(window.g_initialProps=null);function Ke(Me,ze){var Ue=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,He=k.matchRoutes(we.routes,Me.pathname);typeof document!="undefined"&&pe.defaultTitle!==void 0&&(document.title=He.length&&He[He.length-1].route.title||pe.defaultTitle||""),we.plugin.applyPlugins({key:"onRouteChange",type:m.ApplyPluginsType.event,args:{routes:we.routes,matchedRoutes:He,location:Me,action:ze,isFirst:Ue}})}return Ke(fe.location,"POP",!0),fe.listen(Ke)},[fe]),S.default.createElement(m.Router,{history:fe},oe(pe))}function Z(we){return we.plugin.applyPlugins({type:m.ApplyPluginsType.modify,key:"rootContainer",initialValue:S.default.createElement(me,{history:we.history,routes:we.routes,plugin:we.plugin,ssrProps:we.ssrProps,defaultTitle:we.defaultTitle}),args:{history:we.history,routes:we.routes,plugin:we.plugin}})}function xe(we){return Ee.apply(this,arguments)}function Ee(){return Ee=T(E().mark(function we(fe){var pe,Ke,Me,ze,Ue,He,Ne,it,Xe=arguments;return E().wrap(function(lt){for(;;)switch(lt.prev=lt.next){case 0:pe=Xe.length>1&&Xe[1]!==void 0?Xe[1]:window.location.pathname,Ke=k.matchRoutes(fe,pe),Me=ie(Ke),lt.prev=3,Me.s();case 5:if((ze=Me.n()).done){lt.next=19;break}if(He=ze.value,Ne=He.route,!(typeof Ne.component!="string"&&((Ue=Ne.component)===null||Ue===void 0?void 0:Ue.preload))){lt.next=13;break}return lt.next=11,Ne.component.preload();case 11:it=lt.sent,Ne.component=it.default||it;case 13:if(!Ne.routes){lt.next=17;break}return lt.next=16,xe(Ne.routes,pe);case 16:Ne.routes=lt.sent;case 17:lt.next=5;break;case 19:lt.next=24;break;case 21:lt.prev=21,lt.t0=lt.catch(3),Me.e(lt.t0);case 24:return lt.prev=24,Me.f(),lt.finish(24);case 27:return lt.abrupt("return",fe);case 28:case"end":return lt.stop()}},we,null,[[3,21,24,27]])})),Ee.apply(this,arguments)}function Le(we){var fe=Z(we);if(we.rootElement){var pe=typeof we.rootElement=="string"?document.getElementById(we.rootElement):we.rootElement,Ke=we.callback||function(){};window.g_useSSR?we.dynamicImport?xe(we.routes).then(function(){C.hydrate(fe,pe,Ke)}):C.hydrate(fe,pe,Ke):C.render(fe,pe,Ke)}else return fe}R.renderClient=Le,R.renderRoutes=oe},zoYe:function(ce,R,l){var E=l("nmnc"),m=l("eUgh"),O=l("Z0cm"),C=l("/9aa"),k=1/0,A=E?E.prototype:void 0,S=A?A.toString:void 0;function y(w){if(typeof w=="string")return w;if(O(w))return m(w,y)+"";if(C(w))return S?S.call(w):"";var x=w+"";return x=="0"&&1/w==-k?"-0":x}ce.exports=y},"zpY+":function(ce,R,l){"use strict";function E(m){for(var O=0,C,k=0,A=m.length;A>=4;++k,A-=4)C=m.charCodeAt(k)&255|(m.charCodeAt(++k)&255)<<8|(m.charCodeAt(++k)&255)<<16|(m.charCodeAt(++k)&255)<<24,C=(C&65535)*1540483477+((C>>>16)*59797<<16),C^=C>>>24,O=(C&65535)*1540483477+((C>>>16)*59797<<16)^(O&65535)*1540483477+((O>>>16)*59797<<16);switch(A){case 3:O^=(m.charCodeAt(k+2)&255)<<16;case 2:O^=(m.charCodeAt(k+1)&255)<<8;case 1:O^=m.charCodeAt(k)&255,O=(O&65535)*1540483477+((O>>>16)*59797<<16)}return O^=O>>>13,O=(O&65535)*1540483477+((O>>>16)*59797<<16),((O^O>>>15)>>>0).toString(36)}R.a=E},zqxM:function(ce,R,l){var E=l("LqpT"),m=l("XGnz"),O=l("EA7m"),C=l("3L66"),k=O(function(A,S){return C(A)?E(A,m(S,1,C,!0)):[]});ce.exports=k},zs7G:function(ce,R,l){"use strict";var E=l("VTBJ"),m=l("q1tI"),O={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 00188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 00492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z"}}]},name:"double-right",theme:"outlined"},C=O,k=l("6VBw"),A=function(w,x){return m.createElement(k.a,Object(E.a)(Object(E.a)({},w),{},{ref:x,icon:C}))};A.displayName="DoubleRightOutlined";var S=R.a=m.forwardRef(A)},zsCH:function(ce,R,l){var E=l("MMxC"),m=l("tSXo"),O=l("f1E4"),C=l("jtLI"),k=l("g8rt"),A=l("Acmb");function S(y,w){var x=arguments.length<3?y:arguments[2],T,j;if(O(y)===x)return y[w];if(T=k.f(y,w))return C(T,"value")?T.value:T.get===void 0?void 0:T.get.call(x);if(m(j=A(y)))return S(j,w,x)}E({target:"Reflect",stat:!0},{get:S})},zueq:function(ce,R,l){"use strict";var E=l("VTBJ"),m=l("q1tI"),O={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"}}]},name:"info-circle",theme:"filled"},C=O,k=l("6VBw"),A=function(w,x){return m.createElement(k.a,Object(E.a)(Object(E.a)({},w),{},{ref:x,icon:C}))};A.displayName="InfoCircleFilled";var S=R.a=m.forwardRef(A)},zv1X:function(ce,R,l){var E=l("7BAe"),m=l("EzR6"),O=l("cTDu"),C=l("oa35"),k=l("nMuc"),A=[].push,S=function(y){var w=y==1,x=y==2,T=y==3,j=y==4,D=y==6,N=y==5||D;return function(F,B,U,J){for(var $=O(F),X=m($),ee=E(B,U,3),ie=C(X.length),G=0,Q=J||k,W=w?Q(F,ie):x?Q(F,0):void 0,ne,te;ie>G;G++)if((N||G in X)&&(ne=X[G],te=ee(ne,G,$),y)){if(w)W[G]=te;else if(te)switch(y){case 3:return!0;case 5:return ne;case 6:return G;case 2:A.call(W,ne)}else if(j)return!1}return D?-1:T||j?j:W}};ce.exports={forEach:S(0),map:S(1),filter:S(2),some:S(3),every:S(4),find:S(5),findIndex:S(6)}},zvFY:function(ce,R,l){"use strict";l.d(R,"a",function(){return we});var E=l("wx14"),m=l("rePB"),O=l("ODXe"),C=l("U8pU"),k=l("TSYQ"),A=l.n(k),S=l("Ya77"),y=l("q1tI"),w=l.n(y),x=l("H84U"),T=l("caoh"),j=l("3Nzz"),D=l("+f9I"),N=l("0n0R"),F=l("CWQg"),B=l("g0mS"),U=function(Me,ze){var Ue={};for(var He in Me)Object.prototype.hasOwnProperty.call(Me,He)&&ze.indexOf(He)<0&&(Ue[He]=Me[He]);if(Me!=null&&typeof Object.getOwnPropertySymbols=="function")for(var Ne=0,He=Object.getOwnPropertySymbols(Me);Ne*{line-height:1}.anticon svg{display:inline-block}.anticon:before{display:none}.anticon .anticon-icon{display:block}.anticon>.anticon{line-height:0;vertical-align:0}.anticon[tabindex]{cursor:pointer}.anticon-spin,.anticon-spin:before{display:inline-block;animation:loadingCircle 1s linear infinite}.ant-fade-appear,.ant-fade-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-fade-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-fade-appear.ant-fade-appear-active,.ant-fade-enter.ant-fade-enter-active{animation-name:antFadeIn;animation-play-state:running}.ant-fade-leave.ant-fade-leave-active{animation-name:antFadeOut;animation-play-state:running;pointer-events:none}.ant-fade-appear,.ant-fade-enter{opacity:0;animation-timing-function:linear}.ant-fade-leave{animation-timing-function:linear}@keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@keyframes antFadeOut{0%{opacity:1}to{opacity:0}}.ant-move-up-appear,.ant-move-up-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-up-appear.ant-move-up-appear-active,.ant-move-up-enter.ant-move-up-enter-active{animation-name:antMoveUpIn;animation-play-state:running}.ant-move-up-leave.ant-move-up-leave-active{animation-name:antMoveUpOut;animation-play-state:running;pointer-events:none}.ant-move-up-appear,.ant-move-up-enter{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-up-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-down-appear,.ant-move-down-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-down-appear.ant-move-down-appear-active,.ant-move-down-enter.ant-move-down-enter-active{animation-name:antMoveDownIn;animation-play-state:running}.ant-move-down-leave.ant-move-down-leave-active{animation-name:antMoveDownOut;animation-play-state:running;pointer-events:none}.ant-move-down-appear,.ant-move-down-enter{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-down-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-left-appear,.ant-move-left-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-left-appear.ant-move-left-appear-active,.ant-move-left-enter.ant-move-left-enter-active{animation-name:antMoveLeftIn;animation-play-state:running}.ant-move-left-leave.ant-move-left-leave-active{animation-name:antMoveLeftOut;animation-play-state:running;pointer-events:none}.ant-move-left-appear,.ant-move-left-enter{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-left-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-right-appear,.ant-move-right-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-right-appear.ant-move-right-appear-active,.ant-move-right-enter.ant-move-right-enter-active{animation-name:antMoveRightIn;animation-play-state:running}.ant-move-right-leave.ant-move-right-leave-active{animation-name:antMoveRightOut;animation-play-state:running;pointer-events:none}.ant-move-right-appear,.ant-move-right-enter{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-right-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@keyframes antMoveDownIn{0%{transform:translateY(100%);transform-origin:0 0;opacity:0}to{transform:translateY(0);transform-origin:0 0;opacity:1}}@keyframes antMoveDownOut{0%{transform:translateY(0);transform-origin:0 0;opacity:1}to{transform:translateY(100%);transform-origin:0 0;opacity:0}}@keyframes antMoveLeftIn{0%{transform:translateX(-100%);transform-origin:0 0;opacity:0}to{transform:translateX(0);transform-origin:0 0;opacity:1}}@keyframes antMoveLeftOut{0%{transform:translateX(0);transform-origin:0 0;opacity:1}to{transform:translateX(-100%);transform-origin:0 0;opacity:0}}@keyframes antMoveRightIn{0%{transform:translateX(100%);transform-origin:0 0;opacity:0}to{transform:translateX(0);transform-origin:0 0;opacity:1}}@keyframes antMoveRightOut{0%{transform:translateX(0);transform-origin:0 0;opacity:1}to{transform:translateX(100%);transform-origin:0 0;opacity:0}}@keyframes antMoveUpIn{0%{transform:translateY(-100%);transform-origin:0 0;opacity:0}to{transform:translateY(0);transform-origin:0 0;opacity:1}}@keyframes antMoveUpOut{0%{transform:translateY(0);transform-origin:0 0;opacity:1}to{transform:translateY(-100%);transform-origin:0 0;opacity:0}}@keyframes loadingCircle{to{transform:rotate(1turn)}}[ant-click-animating-without-extra-node=true],[ant-click-animating=true]{position:relative}html{--antd-wave-shadow-color:#296df3;--scroll-bar:0}.ant-click-animating-node,[ant-click-animating-without-extra-node=true]:after{position:absolute;top:0;right:0;bottom:0;left:0;display:block;border-radius:inherit;box-shadow:0 0 0 0 #296df3;box-shadow:0 0 0 0 var(--antd-wave-shadow-color);opacity:.2;animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation-fill-mode:forwards;content:"";pointer-events:none}@keyframes waveEffect{to{box-shadow:0 0 0 #296df3;box-shadow:0 0 0 6px #296df3;box-shadow:0 0 0 6px var(--antd-wave-shadow-color)}}@keyframes fadeEffect{to{opacity:0}}.ant-slide-up-appear,.ant-slide-up-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-up-appear.ant-slide-up-appear-active,.ant-slide-up-enter.ant-slide-up-enter-active{animation-name:antSlideUpIn;animation-play-state:running}.ant-slide-up-leave.ant-slide-up-leave-active{animation-name:antSlideUpOut;animation-play-state:running;pointer-events:none}.ant-slide-up-appear,.ant-slide-up-enter{transform:scale(0);transform-origin:0 0;opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-up-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-down-appear,.ant-slide-down-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-down-appear.ant-slide-down-appear-active,.ant-slide-down-enter.ant-slide-down-enter-active{animation-name:antSlideDownIn;animation-play-state:running}.ant-slide-down-leave.ant-slide-down-leave-active{animation-name:antSlideDownOut;animation-play-state:running;pointer-events:none}.ant-slide-down-appear,.ant-slide-down-enter{transform:scale(0);transform-origin:0 0;opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-down-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-left-appear,.ant-slide-left-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-left-appear.ant-slide-left-appear-active,.ant-slide-left-enter.ant-slide-left-enter-active{animation-name:antSlideLeftIn;animation-play-state:running}.ant-slide-left-leave.ant-slide-left-leave-active{animation-name:antSlideLeftOut;animation-play-state:running;pointer-events:none}.ant-slide-left-appear,.ant-slide-left-enter{transform:scale(0);transform-origin:0 0;opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-left-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-right-appear,.ant-slide-right-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-right-appear.ant-slide-right-appear-active,.ant-slide-right-enter.ant-slide-right-enter-active{animation-name:antSlideRightIn;animation-play-state:running}.ant-slide-right-leave.ant-slide-right-leave-active{animation-name:antSlideRightOut;animation-play-state:running;pointer-events:none}.ant-slide-right-appear,.ant-slide-right-enter{transform:scale(0);transform-origin:0 0;opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-right-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@keyframes antSlideUpIn{0%{transform:scaleY(.8);transform-origin:0 0;opacity:0}to{transform:scaleY(1);transform-origin:0 0;opacity:1}}@keyframes antSlideUpOut{0%{transform:scaleY(1);transform-origin:0 0;opacity:1}to{transform:scaleY(.8);transform-origin:0 0;opacity:0}}@keyframes antSlideDownIn{0%{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}to{transform:scaleY(1);transform-origin:100% 100%;opacity:1}}@keyframes antSlideDownOut{0%{transform:scaleY(1);transform-origin:100% 100%;opacity:1}to{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}}@keyframes antSlideLeftIn{0%{transform:scaleX(.8);transform-origin:0 0;opacity:0}to{transform:scaleX(1);transform-origin:0 0;opacity:1}}@keyframes antSlideLeftOut{0%{transform:scaleX(1);transform-origin:0 0;opacity:1}to{transform:scaleX(.8);transform-origin:0 0;opacity:0}}@keyframes antSlideRightIn{0%{transform:scaleX(.8);transform-origin:100% 0;opacity:0}to{transform:scaleX(1);transform-origin:100% 0;opacity:1}}@keyframes antSlideRightOut{0%{transform:scaleX(1);transform-origin:100% 0;opacity:1}to{transform:scaleX(.8);transform-origin:100% 0;opacity:0}}.ant-zoom-appear,.ant-zoom-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-appear.ant-zoom-appear-active,.ant-zoom-enter.ant-zoom-enter-active{animation-name:antZoomIn;animation-play-state:running}.ant-zoom-leave.ant-zoom-leave-active{animation-name:antZoomOut;animation-play-state:running;pointer-events:none}.ant-zoom-appear,.ant-zoom-enter{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-appear-prepare,.ant-zoom-enter-prepare{transform:none}.ant-zoom-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-appear,.ant-zoom-big-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-appear.ant-zoom-big-appear-active,.ant-zoom-big-enter.ant-zoom-big-enter-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-leave.ant-zoom-big-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-appear,.ant-zoom-big-enter{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-big-appear-prepare,.ant-zoom-big-enter-prepare{transform:none}.ant-zoom-big-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-fast-appear,.ant-zoom-big-fast-enter{animation-duration:.1s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-fast-leave{animation-duration:.1s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active,.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-fast-appear,.ant-zoom-big-fast-enter{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-big-fast-appear-prepare,.ant-zoom-big-fast-enter-prepare{transform:none}.ant-zoom-big-fast-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-up-appear,.ant-zoom-up-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-up-appear.ant-zoom-up-appear-active,.ant-zoom-up-enter.ant-zoom-up-enter-active{animation-name:antZoomUpIn;animation-play-state:running}.ant-zoom-up-leave.ant-zoom-up-leave-active{animation-name:antZoomUpOut;animation-play-state:running;pointer-events:none}.ant-zoom-up-appear,.ant-zoom-up-enter{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-up-appear-prepare,.ant-zoom-up-enter-prepare{transform:none}.ant-zoom-up-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-down-appear,.ant-zoom-down-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-down-appear.ant-zoom-down-appear-active,.ant-zoom-down-enter.ant-zoom-down-enter-active{animation-name:antZoomDownIn;animation-play-state:running}.ant-zoom-down-leave.ant-zoom-down-leave-active{animation-name:antZoomDownOut;animation-play-state:running;pointer-events:none}.ant-zoom-down-appear,.ant-zoom-down-enter{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-down-appear-prepare,.ant-zoom-down-enter-prepare{transform:none}.ant-zoom-down-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-left-appear,.ant-zoom-left-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-left-appear.ant-zoom-left-appear-active,.ant-zoom-left-enter.ant-zoom-left-enter-active{animation-name:antZoomLeftIn;animation-play-state:running}.ant-zoom-left-leave.ant-zoom-left-leave-active{animation-name:antZoomLeftOut;animation-play-state:running;pointer-events:none}.ant-zoom-left-appear,.ant-zoom-left-enter{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-left-appear-prepare,.ant-zoom-left-enter-prepare{transform:none}.ant-zoom-left-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-right-appear,.ant-zoom-right-enter{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-right-appear.ant-zoom-right-appear-active,.ant-zoom-right-enter.ant-zoom-right-enter-active{animation-name:antZoomRightIn;animation-play-state:running}.ant-zoom-right-leave.ant-zoom-right-leave-active{animation-name:antZoomRightOut;animation-play-state:running;pointer-events:none}.ant-zoom-right-appear,.ant-zoom-right-enter{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-right-appear-prepare,.ant-zoom-right-enter-prepare{transform:none}.ant-zoom-right-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}@keyframes antZoomIn{0%{transform:scale(.2);opacity:0}to{transform:scale(1);opacity:1}}@keyframes antZoomOut{0%{transform:scale(1)}to{transform:scale(.2);opacity:0}}@keyframes antZoomBigIn{0%{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes antZoomBigOut{0%{transform:scale(1)}to{transform:scale(.8);opacity:0}}@keyframes antZoomUpIn{0%{transform:scale(.8);transform-origin:50% 0;opacity:0}to{transform:scale(1);transform-origin:50% 0}}@keyframes antZoomUpOut{0%{transform:scale(1);transform-origin:50% 0}to{transform:scale(.8);transform-origin:50% 0;opacity:0}}@keyframes antZoomLeftIn{0%{transform:scale(.8);transform-origin:0 50%;opacity:0}to{transform:scale(1);transform-origin:0 50%}}@keyframes antZoomLeftOut{0%{transform:scale(1);transform-origin:0 50%}to{transform:scale(.8);transform-origin:0 50%;opacity:0}}@keyframes antZoomRightIn{0%{transform:scale(.8);transform-origin:100% 50%;opacity:0}to{transform:scale(1);transform-origin:100% 50%}}@keyframes antZoomRightOut{0%{transform:scale(1);transform-origin:100% 50%}to{transform:scale(.8);transform-origin:100% 50%;opacity:0}}@keyframes antZoomDownIn{0%{transform:scale(.8);transform-origin:50% 100%;opacity:0}to{transform:scale(1);transform-origin:50% 100%}}@keyframes antZoomDownOut{0%{transform:scale(1);transform-origin:50% 100%}to{transform:scale(.8);transform-origin:50% 100%;opacity:0}}.ant-motion-collapse-legacy{overflow:hidden}.ant-motion-collapse-legacy-active{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1)!important}.ant-motion-collapse{overflow:hidden;transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1)!important}.ant-btn{line-height:1.5715;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;box-shadow:0 2px 0 rgba(0,0,0,.015);cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;padding:4px 16px;font-size:14px;border-radius:4px;color:rgba(0,10,36,.65);border:1px solid rgba(0,0,0,.15);background:#fff}.ant-btn>.anticon{line-height:1}.ant-btn,.ant-btn:active,.ant-btn:focus{outline:0}.ant-btn:not([disabled]):hover{text-decoration:none}.ant-btn:not([disabled]):active{outline:0;box-shadow:none}.ant-btn[disabled]{cursor:not-allowed}.ant-btn[disabled]>*{pointer-events:none}.ant-btn-lg{height:40px;padding:6.4px 16px;font-size:16px;border-radius:4px}.ant-btn-sm{height:24px;padding:0 8px;font-size:14px;border-radius:4px}.ant-btn>a:only-child{color:currentcolor}.ant-btn>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn:focus,.ant-btn:hover{color:#5493ff;border-color:#5493ff;background:#fff}.ant-btn:focus>a:only-child,.ant-btn:hover>a:only-child{color:currentcolor}.ant-btn:focus>a:only-child:after,.ant-btn:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn:active{color:#184ecc;border-color:#184ecc;background:#fff}.ant-btn:active>a:only-child{color:currentcolor}.ant-btn:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn[disabled],.ant-btn[disabled]:active,.ant-btn[disabled]:focus,.ant-btn[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn[disabled]:active>a:only-child,.ant-btn[disabled]:focus>a:only-child,.ant-btn[disabled]:hover>a:only-child,.ant-btn[disabled]>a:only-child{color:currentcolor}.ant-btn[disabled]:active>a:only-child:after,.ant-btn[disabled]:focus>a:only-child:after,.ant-btn[disabled]:hover>a:only-child:after,.ant-btn[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn:active,.ant-btn:focus,.ant-btn:hover{text-decoration:none;background:#fff}.ant-btn>span{display:inline-block}.ant-btn-primary{color:#fff;border-color:#296df3;background:#296df3;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px 0 rgba(0,0,0,.045)}.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-primary>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-primary:focus,.ant-btn-primary:hover{color:#fff;border-color:#5493ff;background:#5493ff}.ant-btn-primary:focus>a:only-child,.ant-btn-primary:hover>a:only-child{color:currentcolor}.ant-btn-primary:focus>a:only-child:after,.ant-btn-primary:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-primary:active{color:#fff;border-color:#184ecc;background:#184ecc}.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-primary:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-primary[disabled],.ant-btn-primary[disabled]:active,.ant-btn-primary[disabled]:focus,.ant-btn-primary[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-primary[disabled]>a:only-child{color:currentcolor}.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-primary[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child){border-right-color:#4e86f5;border-left-color:#4e86f5}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled{border-color:rgba(0,0,0,.15)}.ant-btn-group .ant-btn-primary:first-child:not(:last-child){border-right-color:#4e86f5}.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:rgba(0,0,0,.15)}.ant-btn-group .ant-btn-primary+.ant-btn-primary,.ant-btn-group .ant-btn-primary:last-child:not(:first-child){border-left-color:#4e86f5}.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled],.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:rgba(0,0,0,.15)}.ant-btn-ghost{color:rgba(0,10,36,.85);border-color:#d9d9d9;background:transparent}.ant-btn-ghost>a:only-child{color:currentcolor}.ant-btn-ghost>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-ghost:focus,.ant-btn-ghost:hover{color:#5493ff;border-color:#5493ff;background:transparent}.ant-btn-ghost:focus>a:only-child,.ant-btn-ghost:hover>a:only-child{color:currentcolor}.ant-btn-ghost:focus>a:only-child:after,.ant-btn-ghost:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-ghost:active{color:#184ecc;border-color:#184ecc;background:transparent}.ant-btn-ghost:active>a:only-child{color:currentcolor}.ant-btn-ghost:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-ghost[disabled],.ant-btn-ghost[disabled]:active,.ant-btn-ghost[disabled]:focus,.ant-btn-ghost[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-ghost[disabled]:active>a:only-child,.ant-btn-ghost[disabled]:focus>a:only-child,.ant-btn-ghost[disabled]:hover>a:only-child,.ant-btn-ghost[disabled]>a:only-child{color:currentcolor}.ant-btn-ghost[disabled]:active>a:only-child:after,.ant-btn-ghost[disabled]:focus>a:only-child:after,.ant-btn-ghost[disabled]:hover>a:only-child:after,.ant-btn-ghost[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed{color:rgba(0,10,36,.65);border-color:rgba(0,0,0,.15);background:#fff;border-style:dashed}.ant-btn-dashed>a:only-child{color:currentcolor}.ant-btn-dashed>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed:focus,.ant-btn-dashed:hover{color:#5493ff;border-color:#5493ff;background:#fff}.ant-btn-dashed:focus>a:only-child,.ant-btn-dashed:hover>a:only-child{color:currentcolor}.ant-btn-dashed:focus>a:only-child:after,.ant-btn-dashed:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed:active{color:#184ecc;border-color:#184ecc;background:#fff}.ant-btn-dashed:active>a:only-child{color:currentcolor}.ant-btn-dashed:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed[disabled],.ant-btn-dashed[disabled]:active,.ant-btn-dashed[disabled]:focus,.ant-btn-dashed[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-dashed[disabled]:active>a:only-child,.ant-btn-dashed[disabled]:focus>a:only-child,.ant-btn-dashed[disabled]:hover>a:only-child,.ant-btn-dashed[disabled]>a:only-child{color:currentcolor}.ant-btn-dashed[disabled]:active>a:only-child:after,.ant-btn-dashed[disabled]:focus>a:only-child:after,.ant-btn-dashed[disabled]:hover>a:only-child:after,.ant-btn-dashed[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger{color:#fff;border-color:#ef4872;background:#ef4872;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px 0 rgba(0,0,0,.045)}.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-danger>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger:focus,.ant-btn-danger:hover{color:#fff;border-color:#fc7492;background:#fc7492}.ant-btn-danger:focus>a:only-child,.ant-btn-danger:hover>a:only-child{color:currentcolor}.ant-btn-danger:focus>a:only-child:after,.ant-btn-danger:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger:active{color:#fff;border-color:#c9325d;background:#c9325d}.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-danger:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger[disabled],.ant-btn-danger[disabled]:active,.ant-btn-danger[disabled]:focus,.ant-btn-danger[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-danger[disabled]>a:only-child{color:currentcolor}.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-danger[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link{color:#296df3;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-link>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link:focus,.ant-btn-link:hover{color:#5493ff;border-color:#5493ff;background:transparent}.ant-btn-link:focus>a:only-child,.ant-btn-link:hover>a:only-child{color:currentcolor}.ant-btn-link:focus>a:only-child:after,.ant-btn-link:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link:active{color:#184ecc;border-color:#184ecc;background:transparent}.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-link:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link[disabled],.ant-btn-link[disabled]:active,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04)}.ant-btn-link:hover{background:transparent}.ant-btn-link:active,.ant-btn-link:focus,.ant-btn-link:hover{border-color:transparent}.ant-btn-link[disabled],.ant-btn-link[disabled]:active,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:hover{color:rgba(0,0,0,.25);border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-link[disabled]:active>a:only-child,.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-link[disabled]>a:only-child{color:currentcolor}.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-link[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-text{color:rgba(0,10,36,.85);border-color:transparent;background:transparent;box-shadow:none}.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-text>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-text:focus,.ant-btn-text:hover{color:#5493ff;border-color:#5493ff;background:transparent}.ant-btn-text:focus>a:only-child,.ant-btn-text:hover>a:only-child{color:currentcolor}.ant-btn-text:focus>a:only-child:after,.ant-btn-text:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-text:active{color:#184ecc;border-color:#184ecc;background:transparent}.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-text:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-text[disabled],.ant-btn-text[disabled]:active,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04)}.ant-btn-text:focus,.ant-btn-text:hover{color:rgba(0,10,36,.85);background:rgba(0,0,0,.018);border-color:transparent}.ant-btn-text:active{color:rgba(0,10,36,.85);background:rgba(0,0,0,.028);border-color:transparent}.ant-btn-text[disabled],.ant-btn-text[disabled]:active,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:hover{color:rgba(0,0,0,.25);border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-text[disabled]:active>a:only-child,.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-text[disabled]>a:only-child{color:currentcolor}.ant-btn-text[disabled]:active>a:only-child:after,.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-text[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous{color:#ef4872;border-color:#ef4872;background:#fff}.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-dangerous>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous:focus,.ant-btn-dangerous:hover{color:#fc7492;border-color:#fc7492;background:#fff}.ant-btn-dangerous:focus>a:only-child,.ant-btn-dangerous:hover>a:only-child{color:currentcolor}.ant-btn-dangerous:focus>a:only-child:after,.ant-btn-dangerous:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous:active{color:#c9325d;border-color:#c9325d;background:#fff}.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-dangerous:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous[disabled],.ant-btn-dangerous[disabled]:active,.ant-btn-dangerous[disabled]:focus,.ant-btn-dangerous[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-dangerous[disabled]:active>a:only-child,.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-dangerous[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous[disabled]:active>a:only-child:after,.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-dangerous[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary{color:#fff;border-color:#ef4872;background:#ef4872;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px 0 rgba(0,0,0,.045)}.ant-btn-dangerous.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary:focus,.ant-btn-dangerous.ant-btn-primary:hover{color:#fff;border-color:#fc7492;background:#fc7492}.ant-btn-dangerous.ant-btn-primary:focus>a:only-child,.ant-btn-dangerous.ant-btn-primary:hover>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-primary:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary:active{color:#fff;border-color:#c9325d;background:#c9325d}.ant-btn-dangerous.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary[disabled],.ant-btn-dangerous.ant-btn-primary[disabled]:active,.ant-btn-dangerous.ant-btn-primary[disabled]:focus,.ant-btn-dangerous.ant-btn-primary[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link{color:#ef4872;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link:focus,.ant-btn-dangerous.ant-btn-link:hover{color:#5493ff;border-color:#5493ff}.ant-btn-dangerous.ant-btn-link:active{color:#184ecc;border-color:#184ecc}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:active,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04)}.ant-btn-dangerous.ant-btn-link:focus,.ant-btn-dangerous.ant-btn-link:hover{color:#fc7492;border-color:transparent;background:transparent}.ant-btn-dangerous.ant-btn-link:focus>a:only-child,.ant-btn-dangerous.ant-btn-link:hover>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link:active{color:#c9325d;border-color:transparent;background:transparent}.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:active,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:hover{color:rgba(0,0,0,.25);border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text{color:#ef4872;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-dangerous.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text:focus,.ant-btn-dangerous.ant-btn-text:hover{color:#5493ff;border-color:#5493ff;background:transparent}.ant-btn-dangerous.ant-btn-text:active{color:#184ecc;border-color:#184ecc;background:transparent}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:active,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04)}.ant-btn-dangerous.ant-btn-text:focus,.ant-btn-dangerous.ant-btn-text:hover{color:#fc7492;border-color:transparent;background:rgba(0,0,0,.018)}.ant-btn-dangerous.ant-btn-text:focus>a:only-child,.ant-btn-dangerous.ant-btn-text:hover>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-text:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text:active{color:#c9325d;border-color:transparent;background:rgba(0,0,0,.028)}.ant-btn-dangerous.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:active,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:hover{color:rgba(0,0,0,.25);border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-icon-only{width:32px;height:32px;padding:2.4px 0;font-size:16px;border-radius:4px;vertical-align:-3px}.ant-btn-icon-only>*{font-size:16px}.ant-btn-icon-only.ant-btn-lg{width:40px;height:40px;padding:4.9px 0;font-size:18px;border-radius:4px}.ant-btn-icon-only.ant-btn-lg>*{font-size:18px}.ant-btn-icon-only.ant-btn-sm{width:24px;height:24px;padding:0;font-size:14px;border-radius:4px}.ant-btn-icon-only.ant-btn-sm>*{font-size:14px}.ant-btn-icon-only>.anticon{display:flex;justify-content:center}.ant-btn-icon-only .anticon-loading{padding:0!important}a.ant-btn-icon-only{vertical-align:-1px}a.ant-btn-icon-only>.anticon{display:inline}.ant-btn-round{height:32px;padding:4px 16px;font-size:14px;border-radius:32px}.ant-btn-round.ant-btn-lg{height:40px;padding:6.4px 20px;font-size:16px;border-radius:40px}.ant-btn-round.ant-btn-sm{height:24px;padding:0 12px;font-size:14px;border-radius:24px}.ant-btn-round.ant-btn-icon-only{width:auto}.ant-btn-circle{min-width:32px;padding-right:0;padding-left:0;text-align:center;border-radius:50%}.ant-btn-circle.ant-btn-lg{min-width:40px;border-radius:50%}.ant-btn-circle.ant-btn-sm{min-width:24px;border-radius:50%}.ant-btn:before{position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;z-index:1;display:none;background:#fff;border-radius:inherit;opacity:.35;transition:opacity .2s;content:"";pointer-events:none}.ant-btn .anticon{transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-btn .anticon.anticon-minus>svg,.ant-btn .anticon.anticon-plus>svg{shape-rendering:optimizespeed}.ant-btn.ant-btn-loading{position:relative;cursor:default}.ant-btn.ant-btn-loading:before{display:block}.ant-btn>.ant-btn-loading-icon{transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-btn>.ant-btn-loading-icon .anticon{padding-right:8px;animation:none}.ant-btn>.ant-btn-loading-icon .anticon svg{animation:loadingCircle 1s linear infinite}.ant-btn-group{position:relative;display:inline-flex}.ant-btn-group>.ant-btn,.ant-btn-group>span>.ant-btn{position:relative}.ant-btn-group>.ant-btn:active,.ant-btn-group>.ant-btn:focus,.ant-btn-group>.ant-btn:hover,.ant-btn-group>span>.ant-btn:active,.ant-btn-group>span>.ant-btn:focus,.ant-btn-group>span>.ant-btn:hover{z-index:2}.ant-btn-group>.ant-btn[disabled],.ant-btn-group>span>.ant-btn[disabled]{z-index:0}.ant-btn-group .ant-btn-icon-only{font-size:14px}.ant-btn+.ant-btn-group,.ant-btn-group+.ant-btn,.ant-btn-group+.ant-btn-group,.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group .ant-btn+span,.ant-btn-group>span+span,.ant-btn-group span+.ant-btn{margin-left:-1px}.ant-btn-group .ant-btn-primary+.ant-btn:not(.ant-btn-primary):not([disabled]){border-left-color:transparent}.ant-btn-group .ant-btn{border-radius:0}.ant-btn-group>.ant-btn:first-child,.ant-btn-group>span:first-child>.ant-btn{margin-left:0}.ant-btn-group>.ant-btn:only-child{border-radius:4px}.ant-btn-group>span:only-child>.ant-btn{border-radius:4px}.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-btn-group-sm>.ant-btn:only-child{border-radius:4px}.ant-btn-group-sm>span:only-child>.ant-btn{border-radius:4px}.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-btn-group>.ant-btn-group{float:left}.ant-btn-group>.ant-btn-group:not(:first-child):not(:last-child)>.ant-btn{border-radius:0}.ant-btn-group>.ant-btn-group:first-child:not(:last-child)>.ant-btn:last-child{padding-right:8px;border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-group>.ant-btn-group:last-child:not(:first-child)>.ant-btn:first-child{padding-left:8px;border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-group-rtl.ant-btn+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group+.ant-btn,.ant-btn-group-rtl.ant-btn-group+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group-rtl.ant-btn-group .ant-btn+span,.ant-btn-group-rtl.ant-btn-group>span+span,.ant-btn-group-rtl.ant-btn-group span+.ant-btn,.ant-btn-rtl.ant-btn+.ant-btn-group,.ant-btn-rtl.ant-btn-group+.ant-btn,.ant-btn-rtl.ant-btn-group+.ant-btn-group,.ant-btn-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-rtl.ant-btn-group .ant-btn+span,.ant-btn-rtl.ant-btn-group>span+span,.ant-btn-rtl.ant-btn-group span+.ant-btn{margin-right:-1px;margin-left:auto}.ant-btn-group.ant-btn-group-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-radius:0 4px 4px 0}.ant-btn-group-rtl.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-radius:4px 0 0 4px}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-radius:0 4px 4px 0}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-radius:4px 0 0 4px}.ant-btn:active>span,.ant-btn:focus>span{position:relative}.ant-btn>.anticon+span,.ant-btn>span+.anticon{margin-left:8px}.ant-btn.ant-btn-background-ghost{color:#fff;border-color:#fff}.ant-btn.ant-btn-background-ghost,.ant-btn.ant-btn-background-ghost:active,.ant-btn.ant-btn-background-ghost:focus,.ant-btn.ant-btn-background-ghost:hover{background:transparent}.ant-btn.ant-btn-background-ghost:focus,.ant-btn.ant-btn-background-ghost:hover{color:#5493ff;border-color:#5493ff}.ant-btn.ant-btn-background-ghost:active{color:#184ecc;border-color:#184ecc}.ant-btn.ant-btn-background-ghost[disabled]{color:rgba(0,0,0,.25);background:transparent;border-color:rgba(0,0,0,.15)}.ant-btn-background-ghost.ant-btn-primary{color:#296df3;border-color:#296df3;text-shadow:none}.ant-btn-background-ghost.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary:focus,.ant-btn-background-ghost.ant-btn-primary:hover{color:#5493ff;border-color:#5493ff}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary:active{color:#184ecc;border-color:#184ecc}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary[disabled],.ant-btn-background-ghost.ant-btn-primary[disabled]:active,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger{color:#ef4872;border-color:#ef4872;text-shadow:none}.ant-btn-background-ghost.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger:focus,.ant-btn-background-ghost.ant-btn-danger:hover{color:#fc7492;border-color:#fc7492}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger:active{color:#c9325d;border-color:#c9325d}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger[disabled],.ant-btn-background-ghost.ant-btn-danger[disabled]:active,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous{color:#ef4872;border-color:#ef4872;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous:focus,.ant-btn-background-ghost.ant-btn-dangerous:hover{color:#fc7492;border-color:#fc7492}.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous:active{color:#c9325d;border-color:#c9325d}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous[disabled],.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link{color:#ef4872;border-color:transparent;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover{color:#fc7492;border-color:transparent}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active{color:#c9325d;border-color:transparent}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover{color:rgba(0,10,36,.25);border-color:rgba(0,10,36,.15);background:rgba(0,10,36,.04);text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-two-chinese-chars:first-letter{letter-spacing:.34em}.ant-btn-two-chinese-chars>:not(.anticon){margin-right:-.34em;letter-spacing:.34em}.ant-btn.ant-btn-block{width:100%}.ant-btn:empty{display:inline-block;width:0;visibility:hidden;content:"\a0"}a.ant-btn{padding-top:.01px!important;line-height:30px}a.ant-btn-disabled{cursor:not-allowed}a.ant-btn-disabled>*{pointer-events:none}a.ant-btn-disabled,a.ant-btn-disabled:active,a.ant-btn-disabled:focus,a.ant-btn-disabled:hover{color:rgba(0,10,36,.25);border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}a.ant-btn-disabled:active>a:only-child,a.ant-btn-disabled:focus>a:only-child,a.ant-btn-disabled:hover>a:only-child,a.ant-btn-disabled>a:only-child{color:currentcolor}a.ant-btn-disabled:active>a:only-child:after,a.ant-btn-disabled:focus>a:only-child:after,a.ant-btn-disabled:hover>a:only-child:after,a.ant-btn-disabled>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}a.ant-btn-lg{line-height:38px}a.ant-btn-sm{line-height:22px}.ant-btn-compact-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl){margin-right:-1px}.ant-btn-compact-item:not(.ant-btn-compact-last-item).ant-btn-compact-item-rtl{margin-left:-1px}.ant-btn-compact-item:active,.ant-btn-compact-item:focus,.ant-btn-compact-item:hover{z-index:2}.ant-btn-compact-item[disabled]{z-index:0}.ant-btn-compact-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-last-item).ant-btn{border-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-first-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-last-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-first-item:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-last-item:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-icon-only.ant-btn-compact-item{flex:none}.ant-btn-compact-item.ant-btn-primary:not([disabled])+.ant-btn-compact-item.ant-btn-primary:not([disabled]){position:relative}.ant-btn-compact-item.ant-btn-primary:not([disabled])+.ant-btn-compact-item.ant-btn-primary:not([disabled]):after{position:absolute;top:-1px;left:-1px;display:inline-block;width:1px;height:calc(100% + 2px);background-color:#4e86f5;content:" "}.ant-btn-compact-item-rtl.ant-btn-compact-first-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item-rtl.ant-btn-compact-last-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-first-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-last-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item-rtl.ant-btn-primary:not([disabled])+.ant-btn-compact-item-rtl.ant-btn-primary:not([disabled]):after{right:-1px}.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-last-item){margin-bottom:-1px}.ant-btn-compact-vertical-item:active,.ant-btn-compact-vertical-item:focus,.ant-btn-compact-vertical-item:hover{z-index:2}.ant-btn-compact-vertical-item[disabled]{z-index:0}.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-first-item):not(.ant-btn-compact-vertical-last-item){border-radius:0}.ant-btn-compact-vertical-item.ant-btn-compact-vertical-first-item:not(.ant-btn-compact-vertical-last-item){border-bottom-right-radius:0;border-bottom-left-radius:0}.ant-btn-compact-vertical-item.ant-btn-compact-vertical-last-item:not(.ant-btn-compact-vertical-first-item){border-top-left-radius:0;border-top-right-radius:0}.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled])+.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]){position:relative}.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled])+.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]):after{position:absolute;top:-1px;left:-1px;display:inline-block;width:calc(100% + 2px);height:1px;background-color:#4e86f5;content:" "}.ant-btn-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary,.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child){border-right-color:#4e86f5;border-left-color:rgba(0,0,0,.15)}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled],.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled]{border-right-color:rgba(0,0,0,.15);border-left-color:#4e86f5}.ant-btn-rtl.ant-btn>.ant-btn-loading-icon .anticon{padding-right:0;padding-left:8px}.ant-btn-rtl.ant-btn>.anticon+span,.ant-btn-rtl.ant-btn>span+.anticon{margin-right:8px;margin-left:0}.ant-notification{box-sizing:border-box;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:fixed;z-index:1010;margin:0 24px 0 0}.ant-notification-close-icon{font-size:14px;cursor:pointer}.ant-notification-hook-holder{position:relative}.ant-notification-notice{position:relative;width:384px;max-width:calc(100vw - 48px);margin-bottom:16px;margin-left:auto;padding:16px 24px;overflow:hidden;line-height:1.5715;word-wrap:break-word;background:#fff;border-radius:4px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}.ant-notification-bottom .ant-notification-notice,.ant-notification-top .ant-notification-notice{margin-right:auto;margin-left:auto}.ant-notification-bottomLeft .ant-notification-notice,.ant-notification-topLeft .ant-notification-notice{margin-right:auto;margin-left:0}.ant-notification-notice-message{margin-bottom:8px;color:rgba(0,10,36,.85);font-size:16px;line-height:24px}.ant-notification-notice-message-single-line-auto-margin{display:block;width:calc(264px - 100%);max-width:4px;background-color:transparent;pointer-events:none}.ant-notification-notice-message-single-line-auto-margin:before{display:block;content:""}.ant-notification-notice-description{font-size:14px}.ant-notification-notice-closable .ant-notification-notice-message{padding-right:24px}.ant-notification-notice-with-icon .ant-notification-notice-message{margin-bottom:4px;margin-left:48px;font-size:16px}.ant-notification-notice-with-icon .ant-notification-notice-description{margin-left:48px;font-size:14px}.ant-notification-notice-icon{position:absolute;margin-left:4px;font-size:24px;line-height:24px}.anticon.ant-notification-notice-icon-success{color:#26c992}.anticon.ant-notification-notice-icon-info{color:#296df3}.anticon.ant-notification-notice-icon-warning{color:#ffb924}.anticon.ant-notification-notice-icon-error{color:#ef4872}.ant-notification-notice-close{position:absolute;top:16px;right:22px;color:rgba(0,10,36,.65);outline:none}.ant-notification-notice-close:hover{color:rgba(0,4,15,.79)}.ant-notification-notice-btn{float:right;margin-top:16px}.ant-notification .notification-fade-effect{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both}.ant-notification-fade-appear,.ant-notification-fade-enter{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both;opacity:0;animation-play-state:paused}.ant-notification-fade-leave{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both;animation-duration:.2s;animation-play-state:paused}.ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationFadeIn;animation-play-state:running}.ant-notification-fade-leave.ant-notification-fade-leave-active{animation-name:NotificationFadeOut;animation-play-state:running}@keyframes NotificationFadeIn{0%{left:384px;opacity:0}to{left:0;opacity:1}}@keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.ant-notification-rtl{direction:rtl}.ant-notification-rtl .ant-notification-notice-closable .ant-notification-notice-message{padding-right:0;padding-left:24px}.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-message{margin-right:48px;margin-left:0}.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-description{margin-right:48px;margin-left:0}.ant-notification-rtl .ant-notification-notice-icon{margin-right:4px;margin-left:0}.ant-notification-rtl .ant-notification-notice-close{right:auto;left:22px}.ant-notification-rtl .ant-notification-notice-btn{float:left}.ant-notification-bottom,.ant-notification-top{margin-right:0;margin-left:0}.ant-notification-top .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-top .ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationTopFadeIn}.ant-notification-bottom .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottom .ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationBottomFadeIn}.ant-notification-bottomLeft,.ant-notification-topLeft{margin-right:0;margin-left:24px}.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active{animation-name:NotificationLeftFadeIn}@keyframes NotificationTopFadeIn{0%{margin-top:-100%;opacity:0}to{margin-top:0;opacity:1}}@keyframes NotificationBottomFadeIn{0%{margin-bottom:-100%;opacity:0}to{margin-bottom:0;opacity:1}}@keyframes NotificationLeftFadeIn{0%{right:384px;opacity:0}to{right:0;opacity:1}}.ant-message{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:fixed;top:8px;left:0;z-index:1010;width:100%;pointer-events:none}.ant-message-notice{padding:8px;text-align:center}.ant-message-notice-content{display:inline-block;padding:10px 16px;background:#fff;border-radius:4px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05);pointer-events:all}.ant-message-success .anticon{color:#26c992}.ant-message-error .anticon{color:#ef4872}.ant-message-warning .anticon{color:#ffb924}.ant-message-info .anticon,.ant-message-loading .anticon{color:#296df3}.ant-message .anticon{position:relative;top:1px;margin-right:8px;font-size:16px}.ant-message-notice.ant-move-up-leave.ant-move-up-leave-active{animation-name:MessageMoveOut;animation-duration:.3s}@keyframes MessageMoveOut{0%{max-height:150px;padding:8px;opacity:1}to{max-height:0;padding:0;opacity:0}}.ant-message-rtl{direction:rtl}.ant-message-rtl span{direction:rtl}.ant-message-rtl .anticon{margin-right:0;margin-left:8px}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger{color:#ef4872}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger:hover{color:#fff;background-color:#ef4872}.ant-dropdown{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;display:block}.ant-dropdown:before{position:absolute;top:-4px;right:0;bottom:-4px;left:-7px;z-index:-9999;opacity:.0001;content:" "}.ant-dropdown-wrap{position:relative}.ant-dropdown-wrap .ant-btn>.anticon-down{font-size:10px}.ant-dropdown-wrap .anticon-down:before{transition:transform .2s}.ant-dropdown-wrap-open .anticon-down:before{transform:rotate(180deg)}.ant-dropdown-hidden,.ant-dropdown-menu-hidden,.ant-dropdown-menu-submenu-hidden{display:none}.ant-dropdown-show-arrow.ant-dropdown-placement-top,.ant-dropdown-show-arrow.ant-dropdown-placement-topLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-topRight{padding-bottom:15.3137085px}.ant-dropdown-show-arrow.ant-dropdown-placement-bottom,.ant-dropdown-show-arrow.ant-dropdown-placement-bottomLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-bottomRight{padding-top:15.3137085px}.ant-dropdown-arrow{position:absolute;z-index:1;display:block;width:11.3137085px;height:11.3137085px;border-radius:0 0 2px;pointer-events:none}.ant-dropdown-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-dropdown-placement-top>.ant-dropdown-arrow,.ant-dropdown-placement-topLeft>.ant-dropdown-arrow,.ant-dropdown-placement-topRight>.ant-dropdown-arrow{bottom:10px;box-shadow:3px 3px 7px -3px rgba(0,0,0,.1);transform:rotate(45deg)}.ant-dropdown-placement-top>.ant-dropdown-arrow{left:50%;transform:translateX(-50%) rotate(45deg)}.ant-dropdown-placement-topLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-topRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-placement-bottom>.ant-dropdown-arrow,.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow,.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{top:9.41421356px;box-shadow:2px 2px 5px -2px rgba(0,0,0,.1);transform:rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottom>.ant-dropdown-arrow{left:50%;transform:translateX(-50%) rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-menu{position:relative;margin:0;padding:4px 0;text-align:left;list-style-type:none;background-color:#fff;background-clip:padding-box;border-radius:4px;outline:none;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}.ant-dropdown-menu-item-group-title{padding:5px 12px;color:rgba(0,10,36,.65);transition:all .3s}.ant-dropdown-menu-submenu-popup{position:absolute;z-index:1050;background:transparent;box-shadow:none;transform-origin:0 0}.ant-dropdown-menu-submenu-popup li,.ant-dropdown-menu-submenu-popup ul{list-style:none}.ant-dropdown-menu-submenu-popup ul{margin-right:.3em;margin-left:.3em}.ant-dropdown-menu-item{position:relative;display:flex;align-items:center}.ant-dropdown-menu-item-icon{min-width:12px;margin-right:8px;font-size:12px}.ant-dropdown-menu-title-content{flex:auto}.ant-dropdown-menu-title-content>a{color:inherit;transition:all .3s}.ant-dropdown-menu-title-content>a:hover{color:inherit}.ant-dropdown-menu-title-content>a:after{position:absolute;top:0;right:0;bottom:0;left:0;content:""}.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title{clear:both;margin:0;padding:5px 12px;color:rgba(0,10,36,.85);font-weight:400;font-size:14px;line-height:22px;cursor:pointer;transition:all .3s}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-submenu-title-selected{color:#296df3;background-color:#e3ecfd}.ant-dropdown-menu-item.ant-dropdown-menu-item-active,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-active,.ant-dropdown-menu-item:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-active,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-active,.ant-dropdown-menu-submenu-title:hover{background-color:#f5f5f5}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled a,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled a,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled a,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled a{pointer-events:none}.ant-dropdown-menu-item-divider,.ant-dropdown-menu-submenu-title-divider{height:1px;margin:4px 0;overflow:hidden;line-height:0;background-color:#f0f0f0}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{position:absolute;right:8px}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{margin-right:0!important;color:rgba(0,10,36,.65);font-size:10px;font-style:normal}.ant-dropdown-menu-item-group-list{margin:0 8px;padding:0;list-style:none}.ant-dropdown-menu-submenu-title{padding-right:24px}.ant-dropdown-menu-submenu-vertical{position:relative}.ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{position:absolute;top:0;left:100%;min-width:100%;margin-left:4px;transform-origin:0 0}.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-submenu-selected .ant-dropdown-menu-submenu-title{color:#296df3}.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomRight,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topRight,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-dropdown-button>.anticon.anticon-down,.ant-dropdown-link>.anticon.anticon-down,.ant-dropdown-trigger>.anticon.anticon-down{font-size:10px;vertical-align:baseline}.ant-dropdown-button{white-space:nowrap}.ant-dropdown-button.ant-btn-group>.ant-btn-loading,.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn{cursor:default;pointer-events:none}.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn:before{display:block}.ant-dropdown-button.ant-btn-group>.ant-btn:last-child:not(:first-child):not(.ant-btn-icon-only){padding-right:8px;padding-left:8px}.ant-dropdown-menu-dark,.ant-dropdown-menu-dark .ant-dropdown-menu{background:#001529}.ant-dropdown-menu-dark .ant-dropdown-menu-item,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title{color:hsla(0,0%,100%,.65)}.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after{color:hsla(0,0%,100%,.65)}.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover{color:#fff;background:transparent}.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected>a{color:#fff;background:#296df3}.ant-dropdown-rtl{direction:rtl}.ant-dropdown-rtl.ant-dropdown:before{right:-7px;left:0}.ant-dropdown-menu.ant-dropdown-menu-rtl{direction:rtl;text-align:right}.ant-dropdown-menu-submenu-rtl .ant-dropdown-menu-item-group-title,.ant-dropdown-rtl .ant-dropdown-menu-item-group-title{direction:rtl;text-align:right}.ant-dropdown-menu-submenu-popup.ant-dropdown-menu-submenu-rtl{transform-origin:100% 0}.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup li,.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup ul{text-align:right}.ant-dropdown-rtl .ant-dropdown-menu-item,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{text-align:right}.ant-dropdown-rtl .ant-dropdown-menu-item>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-item>span>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>span>.anticon:first-child{margin-right:0;margin-left:8px}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{right:auto;left:8px}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{margin-left:0!important;transform:scaleX(-1)}.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{padding-right:12px;padding-left:24px}.ant-dropdown-rtl .ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{right:100%;left:0;margin-right:4px;margin-left:0}.ant-menu-item-danger.ant-menu-item{color:#ef4872}.ant-menu-item-danger.ant-menu-item-active,.ant-menu-item-danger.ant-menu-item:hover{color:#ef4872}.ant-menu-item-danger.ant-menu-item:active{background:#fff1f0}.ant-menu-item-danger.ant-menu-item-selected{color:#ef4872}.ant-menu-item-danger.ant-menu-item-selected>a,.ant-menu-item-danger.ant-menu-item-selected>a:hover{color:#ef4872}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{background-color:#fff1f0}.ant-menu-inline .ant-menu-item-danger.ant-menu-item:after{border-right-color:#ef4872}.ant-menu-dark .ant-menu-item-danger.ant-menu-item,.ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover,.ant-menu-dark .ant-menu-item-danger.ant-menu-item>a{color:#ef4872}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{color:#fff;background-color:#ef4872}.ant-menu{box-sizing:border-box;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum","tnum";margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;line-height:0;text-align:left;list-style:none;background:#fff;outline:none;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05);transition:background .3s,width .3s cubic-bezier(.2,0,0,1) 0s}.ant-menu:before{display:table;content:""}.ant-menu:after{display:table;clear:both;content:""}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #bed2fb}.ant-menu ol,.ant-menu ul{margin:0;padding:0;list-style:none}.ant-menu-overflow{display:flex}.ant-menu-overflow-item{flex:none}.ant-menu-hidden,.ant-menu-submenu-hidden{display:none}.ant-menu-item-group-title{height:1.5715;padding:8px 16px;color:rgba(0,10,36,.65);font-size:14px;line-height:1.5715;transition:all .3s}.ant-menu-horizontal .ant-menu-submenu{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu,.ant-menu-submenu-inline{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-selected{color:#296df3}.ant-menu-item:active,.ant-menu-submenu-title:active{background:#e3ecfd}.ant-menu-submenu .ant-menu-sub{cursor:auto;transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-title-content{transition:color .3s}.ant-menu-item a{color:rgba(0,10,36,.85)}.ant-menu-item a:hover{color:#296df3}.ant-menu-item a:before{position:absolute;top:0;right:0;bottom:0;left:0;background-color:transparent;content:""}.ant-menu-item>.ant-badge a{color:rgba(0,10,36,.85)}.ant-menu-item>.ant-badge a:hover{color:#296df3}.ant-menu-item-divider{overflow:hidden;line-height:0;border:solid #f0f0f0;border-width:1px 0 0}.ant-menu-item-divider-dashed{border-style:dashed}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu{margin-top:-1px}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu .ant-menu-submenu-title:hover{background-color:transparent}.ant-menu-item-selected{color:#296df3}.ant-menu-item-selected a,.ant-menu-item-selected a:hover{color:#296df3}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#e3ecfd}.ant-menu-inline,.ant-menu-vertical,.ant-menu-vertical-left{border-right:1px solid #f0f0f0}.ant-menu-vertical-right{border-left:1px solid #f0f0f0}.ant-menu-vertical-left.ant-menu-sub,.ant-menu-vertical-right.ant-menu-sub,.ant-menu-vertical.ant-menu-sub{min-width:160px;max-height:calc(100vh - 100px);padding:0;overflow:hidden;border-right:0}.ant-menu-vertical-left.ant-menu-sub:not([class*=-active]),.ant-menu-vertical-right.ant-menu-sub:not([class*=-active]),.ant-menu-vertical.ant-menu-sub:not([class*=-active]){overflow-x:hidden;overflow-y:auto}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item,.ant-menu-vertical.ant-menu-sub .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical.ant-menu-sub .ant-menu-item:after{border-right:0}.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu{transform-origin:0 0}.ant-menu-horizontal.ant-menu-sub{min-width:114px}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu-title{transition:border-color .3s,background .3s}.ant-menu-item,.ant-menu-submenu-title{position:relative;display:block;margin:0;padding:0 20px;white-space:nowrap;cursor:pointer;transition:border-color .3s,background .3s,padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-item .ant-menu-item-icon,.ant-menu-item .anticon,.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-submenu-title .anticon{min-width:14px;font-size:14px;transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1),color .3s}.ant-menu-item .ant-menu-item-icon+span,.ant-menu-item .anticon+span,.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu-submenu-title .anticon+span{margin-left:10px;opacity:1;transition:opacity .3s cubic-bezier(.645,.045,.355,1),margin .3s,color .3s}.ant-menu-item .ant-menu-item-icon.svg,.ant-menu-submenu-title .ant-menu-item-icon.svg{vertical-align:-.125em}.ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-submenu-title.ant-menu-item-only-child>.anticon{margin-right:0}.ant-menu-item:not(.ant-menu-item-disabled):focus-visible,.ant-menu-submenu-title:not(.ant-menu-item-disabled):focus-visible{box-shadow:0 0 0 2px #bed2fb}.ant-menu>.ant-menu-item-divider{margin:1px 0;padding:0}.ant-menu-submenu-popup{position:absolute;z-index:1050;background:transparent;border-radius:4px;box-shadow:none;transform-origin:0 0}.ant-menu-submenu-popup:before{position:absolute;top:-7px;right:0;bottom:0;left:0;z-index:-1;width:100%;height:100%;opacity:.0001;content:" "}.ant-menu-submenu-placement-rightTop:before{top:0;left:-7px}.ant-menu-submenu>.ant-menu{background-color:#fff;border-radius:4px}.ant-menu-submenu>.ant-menu-submenu-title:after{transition:transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-popup>.ant-menu{background-color:#fff}.ant-menu-submenu-arrow,.ant-menu-submenu-expand-icon{position:absolute;top:50%;right:16px;width:10px;color:rgba(0,10,36,.85);transform:translateY(-50%);transition:transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-arrow:after,.ant-menu-submenu-arrow:before{position:absolute;width:6px;height:1.5px;background-color:currentcolor;border-radius:2px;transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);content:""}.ant-menu-submenu-arrow:before{transform:rotate(45deg) translateY(-2.5px)}.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translateY(2.5px)}.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-expand-icon{color:#296df3}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:before,.ant-menu-submenu-inline .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translateX(2.5px)}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline .ant-menu-submenu-arrow:after{transform:rotate(45deg) translateX(-2.5px)}.ant-menu-submenu-horizontal .ant-menu-submenu-arrow{display:none}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow{transform:translateY(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translateX(-2.5px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{transform:rotate(45deg) translateX(2.5px)}.ant-menu-vertical-left .ant-menu-submenu-selected,.ant-menu-vertical-right .ant-menu-submenu-selected,.ant-menu-vertical .ant-menu-submenu-selected{color:#296df3}.ant-menu-horizontal{line-height:46px;border:0;border-bottom:1px solid #f0f0f0;box-shadow:none}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu{margin-top:-1px;margin-bottom:0;padding:0 20px}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover{color:#296df3}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover:after{border-bottom:2px solid #296df3}.ant-menu-horizontal>.ant-menu-item,.ant-menu-horizontal>.ant-menu-submenu{position:relative;top:1px;display:inline-block;vertical-align:bottom}.ant-menu-horizontal>.ant-menu-item:after,.ant-menu-horizontal>.ant-menu-submenu:after{position:absolute;right:20px;bottom:0;left:20px;border-bottom:2px solid transparent;transition:border-color .3s cubic-bezier(.645,.045,.355,1);content:""}.ant-menu-horizontal>.ant-menu-submenu>.ant-menu-submenu-title{padding:0}.ant-menu-horizontal>.ant-menu-item a{color:rgba(0,10,36,.85)}.ant-menu-horizontal>.ant-menu-item a:hover{color:#296df3}.ant-menu-horizontal>.ant-menu-item a:before{bottom:-2px}.ant-menu-horizontal>.ant-menu-item-selected a{color:#296df3}.ant-menu-horizontal:after{display:block;clear:both;height:0;content:"\20"}.ant-menu-inline .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item,.ant-menu-vertical .ant-menu-item{position:relative}.ant-menu-inline .ant-menu-item:after,.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-vertical .ant-menu-item:after{position:absolute;top:0;right:0;bottom:0;border-right:3px solid #296df3;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1);content:""}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-vertical-right .ant-menu-item,.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-item,.ant-menu-vertical .ant-menu-submenu-title{height:40px;margin-top:4px;margin-bottom:4px;padding:0 16px;overflow:hidden;line-height:40px;text-overflow:ellipsis}.ant-menu-inline .ant-menu-submenu,.ant-menu-vertical-left .ant-menu-submenu,.ant-menu-vertical-right .ant-menu-submenu,.ant-menu-vertical .ant-menu-submenu{padding-bottom:.02px}.ant-menu-inline .ant-menu-item:not(:last-child),.ant-menu-vertical-left .ant-menu-item:not(:last-child),.ant-menu-vertical-right .ant-menu-item:not(:last-child),.ant-menu-vertical .ant-menu-item:not(:last-child){margin-bottom:8px}.ant-menu-inline>.ant-menu-item,.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-left>.ant-menu-item,.ant-menu-vertical-left>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-right>.ant-menu-item,.ant-menu-vertical-right>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical>.ant-menu-item,.ant-menu-vertical>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px}.ant-menu-vertical .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline{width:100%}.ant-menu-inline .ant-menu-item-selected:after,.ant-menu-inline .ant-menu-selected:after{transform:scaleY(1);opacity:1;transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title{width:calc(100% + 1px)}.ant-menu-inline .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-inline .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline.ant-menu-root .ant-menu-item,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title{display:flex;align-items:center;transition:border-color .3s,background .3s,padding .1s cubic-bezier(.215,.61,.355,1)}.ant-menu-inline.ant-menu-root .ant-menu-item>.ant-menu-title-content,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>.ant-menu-title-content{flex:auto;min-width:0;overflow:hidden;text-overflow:ellipsis}.ant-menu-inline.ant-menu-root .ant-menu-item>*,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>*{flex:none}.ant-menu.ant-menu-inline-collapsed{width:80px}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title{left:0;padding:0 calc(50% - 8px);text-overflow:clip}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:0}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon{margin:0;font-size:16px;line-height:40px}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span{display:inline-block;opacity:0}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed .anticon{display:inline-block}.ant-menu.ant-menu-inline-collapsed-tooltip{pointer-events:none}.ant-menu.ant-menu-inline-collapsed-tooltip .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed-tooltip .anticon{display:none}.ant-menu.ant-menu-inline-collapsed-tooltip a{color:hsla(0,0%,100%,.85)}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-group-title{padding-right:4px;padding-left:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-menu-item-group-list{margin:0;padding:0}.ant-menu-item-group-list .ant-menu-item,.ant-menu-item-group-list .ant-menu-submenu-title{padding:0 16px 0 28px}.ant-menu-root.ant-menu-inline,.ant-menu-root.ant-menu-vertical,.ant-menu-root.ant-menu-vertical-left,.ant-menu-root.ant-menu-vertical-right{box-shadow:none}.ant-menu-root.ant-menu-inline-collapsed .ant-menu-item>.ant-menu-inline-collapsed-noicon,.ant-menu-root.ant-menu-inline-collapsed .ant-menu-submenu .ant-menu-submenu-title>.ant-menu-inline-collapsed-noicon{font-size:16px;text-align:center}.ant-menu-sub.ant-menu-inline{padding:0;background:#fafafa;border-radius:0;box-shadow:none}.ant-menu-sub.ant-menu-inline>.ant-menu-item,.ant-menu-sub.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px;list-style-position:inside;list-style-type:disc}.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:32px}.ant-menu-item-disabled,.ant-menu-submenu-disabled{color:rgba(0,0,0,.25)!important;background:none;cursor:not-allowed}.ant-menu-item-disabled:after,.ant-menu-submenu-disabled:after{border-color:transparent!important}.ant-menu-item-disabled a,.ant-menu-submenu-disabled a{color:rgba(0,0,0,.25)!important;pointer-events:none}.ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-submenu-disabled>.ant-menu-submenu-title{color:rgba(0,0,0,.25)!important;cursor:not-allowed}.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:rgba(0,0,0,.25)!important}.ant-layout-header .ant-menu{line-height:inherit}.ant-menu-inline-collapsed-tooltip a,.ant-menu-inline-collapsed-tooltip a:hover{color:#fff}.ant-menu-light .ant-menu-item-active,.ant-menu-light .ant-menu-item:hover,.ant-menu-light .ant-menu-submenu-active,.ant-menu-light .ant-menu-submenu-title:hover,.ant-menu-light .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open{color:#296df3}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #0d57e8}.ant-menu-dark .ant-menu-item:focus-visible,.ant-menu-dark .ant-menu-submenu-title:focus-visible{box-shadow:0 0 0 2px #0d57e8}.ant-menu-dark .ant-menu-sub,.ant-menu.ant-menu-dark,.ant-menu.ant-menu-dark .ant-menu-sub{color:hsla(0,0%,100%,.65);background:#001529}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:.45;transition:all .3s}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark.ant-menu-submenu-popup{background:transparent}.ant-menu-dark .ant-menu-inline.ant-menu-sub{background:#000c17}.ant-menu-dark.ant-menu-horizontal{border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{top:0;margin-top:0;padding:0 20px;border-color:#001529;border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item:hover{background-color:#296df3}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>a:before{bottom:0}.ant-menu-dark .ant-menu-item,.ant-menu-dark .ant-menu-item-group-title,.ant-menu-dark .ant-menu-item>a,.ant-menu-dark .ant-menu-item>span>a{color:hsla(0,0%,100%,.65)}.ant-menu-dark.ant-menu-inline,.ant-menu-dark.ant-menu-vertical,.ant-menu-dark.ant-menu-vertical-left,.ant-menu-dark.ant-menu-vertical-right{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item,.ant-menu-dark.ant-menu-vertical .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical .ant-menu-item:after{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title{width:100%}.ant-menu-dark .ant-menu-item-active,.ant-menu-dark .ant-menu-item:hover,.ant-menu-dark .ant-menu-submenu-active,.ant-menu-dark .ant-menu-submenu-open,.ant-menu-dark .ant-menu-submenu-selected,.ant-menu-dark .ant-menu-submenu-title:hover{color:#fff;background-color:transparent}.ant-menu-dark .ant-menu-item-active>a,.ant-menu-dark .ant-menu-item-active>span>a,.ant-menu-dark .ant-menu-item:hover>a,.ant-menu-dark .ant-menu-item:hover>span>a,.ant-menu-dark .ant-menu-submenu-active>a,.ant-menu-dark .ant-menu-submenu-active>span>a,.ant-menu-dark .ant-menu-submenu-open>a,.ant-menu-dark .ant-menu-submenu-open>span>a,.ant-menu-dark .ant-menu-submenu-selected>a,.ant-menu-dark .ant-menu-submenu-selected>span>a,.ant-menu-dark .ant-menu-submenu-title:hover>a,.ant-menu-dark .ant-menu-submenu-title:hover>span>a{color:#fff}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{opacity:1}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark .ant-menu-item:hover{background-color:transparent}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#296df3}.ant-menu-dark .ant-menu-item-selected{color:#fff;border-right:0}.ant-menu-dark .ant-menu-item-selected:after{border-right:0}.ant-menu-dark .ant-menu-item-selected>a,.ant-menu-dark .ant-menu-item-selected>a:hover,.ant-menu-dark .ant-menu-item-selected>span>a,.ant-menu-dark .ant-menu-item-selected>span>a:hover{color:#fff}.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon,.ant-menu-dark .ant-menu-item-selected .anticon{color:#fff}.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon+span,.ant-menu-dark .ant-menu-item-selected .anticon+span{color:#fff}.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected,.ant-menu.ant-menu-dark .ant-menu-item-selected{background-color:#296df3}.ant-menu-dark .ant-menu-item-disabled,.ant-menu-dark .ant-menu-item-disabled>a,.ant-menu-dark .ant-menu-item-disabled>span>a,.ant-menu-dark .ant-menu-submenu-disabled,.ant-menu-dark .ant-menu-submenu-disabled>a,.ant-menu-dark .ant-menu-submenu-disabled>span>a{color:hsla(0,0%,100%,.35)!important;opacity:.8}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title{color:hsla(0,0%,100%,.35)!important}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:hsla(0,0%,100%,.35)!important}.ant-menu.ant-menu-rtl{direction:rtl;text-align:right}.ant-menu-rtl .ant-menu-item-group-title{text-align:right}.ant-menu-rtl.ant-menu-inline,.ant-menu-rtl.ant-menu-vertical{border-right:none;border-left:1px solid #f0f0f0}.ant-menu-rtl.ant-menu-dark.ant-menu-inline,.ant-menu-rtl.ant-menu-dark.ant-menu-vertical{border-left:none}.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu{transform-origin:top right}.ant-menu-rtl .ant-menu-item .ant-menu-item-icon,.ant-menu-rtl .ant-menu-item .anticon,.ant-menu-rtl .ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title .anticon{margin-right:auto;margin-left:10px}.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.anticon{margin-left:0}.ant-menu-submenu-rtl.ant-menu-submenu-popup{transform-origin:100% 0}.ant-menu-rtl .ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow{right:auto;left:16px}.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translateY(-2px)}.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{transform:rotate(45deg) translateY(2px)}.ant-menu-rtl.ant-menu-inline .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical .ant-menu-item:after{right:auto;left:0}.ant-menu-rtl.ant-menu-inline .ant-menu-item,.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical .ant-menu-item,.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title{text-align:right}.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title{padding-right:0;padding-left:34px}.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title{padding-right:16px;padding-left:34px}.ant-menu-rtl.ant-menu-inline-collapsed.ant-menu-vertical .ant-menu-submenu-title{padding:0 calc(50% - 8px)}.ant-menu-rtl .ant-menu-item-group-list .ant-menu-item,.ant-menu-rtl .ant-menu-item-group-list .ant-menu-submenu-title{padding:0 28px 0 16px}.ant-menu-sub.ant-menu-inline{border:0}.ant-menu-rtl.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-right:32px;padding-left:0}.ant-tooltip{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:absolute;z-index:1070;display:block;width:-webkit-max-content;width:-moz-max-content;width:max-content;width:intrinsic;max-width:250px;visibility:visible}.ant-tooltip-content{position:relative}.ant-tooltip-hidden{display:none}.ant-tooltip-placement-top,.ant-tooltip-placement-topLeft,.ant-tooltip-placement-topRight{padding-bottom:14.3137085px}.ant-tooltip-placement-right,.ant-tooltip-placement-rightBottom,.ant-tooltip-placement-rightTop{padding-left:14.3137085px}.ant-tooltip-placement-bottom,.ant-tooltip-placement-bottomLeft,.ant-tooltip-placement-bottomRight{padding-top:14.3137085px}.ant-tooltip-placement-left,.ant-tooltip-placement-leftBottom,.ant-tooltip-placement-leftTop{padding-right:14.3137085px}.ant-tooltip-inner{min-width:30px;min-height:32px;padding:6px 8px;color:#fff;text-align:left;text-decoration:none;word-wrap:break-word;background-color:rgba(0,0,0,.75);border-radius:4px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}.ant-tooltip-arrow{position:absolute;z-index:2;display:block;width:22px;height:22px;overflow:hidden;background:transparent;pointer-events:none}.ant-tooltip-arrow-content{--antd-arrow-background-color:linear-gradient(to right bottom,rgba(0,0,0,0.65),rgba(0,0,0,0.75));position:absolute;top:0;right:0;bottom:0;left:0;display:block;width:11.3137085px;height:11.3137085px;margin:auto;content:"";pointer-events:auto;border-radius:0 0 2px;pointer-events:none}.ant-tooltip-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-tooltip-placement-top .ant-tooltip-arrow,.ant-tooltip-placement-topLeft .ant-tooltip-arrow,.ant-tooltip-placement-topRight .ant-tooltip-arrow{bottom:0;transform:translateY(100%)}.ant-tooltip-placement-top .ant-tooltip-arrow-content,.ant-tooltip-placement-topLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-topRight .ant-tooltip-arrow-content{box-shadow:3px 3px 7px rgba(0,0,0,.07);transform:translateY(-11px) rotate(45deg)}.ant-tooltip-placement-top .ant-tooltip-arrow{left:50%;transform:translateY(100%) translateX(-50%)}.ant-tooltip-placement-topLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-topRight .ant-tooltip-arrow{right:13px}.ant-tooltip-placement-right .ant-tooltip-arrow,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow,.ant-tooltip-placement-rightTop .ant-tooltip-arrow{left:0;transform:translateX(-100%)}.ant-tooltip-placement-right .ant-tooltip-arrow-content,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow-content,.ant-tooltip-placement-rightTop .ant-tooltip-arrow-content{box-shadow:-3px 3px 7px rgba(0,0,0,.07);transform:translateX(11px) rotate(135deg)}.ant-tooltip-placement-right .ant-tooltip-arrow{top:50%;transform:translateX(-100%) translateY(-50%)}.ant-tooltip-placement-rightTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-left .ant-tooltip-arrow,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow,.ant-tooltip-placement-leftTop .ant-tooltip-arrow{right:0;transform:translateX(100%)}.ant-tooltip-placement-left .ant-tooltip-arrow-content,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow-content,.ant-tooltip-placement-leftTop .ant-tooltip-arrow-content{box-shadow:3px -3px 7px rgba(0,0,0,.07);transform:translateX(-11px) rotate(315deg)}.ant-tooltip-placement-left .ant-tooltip-arrow{top:50%;transform:translateX(100%) translateY(-50%)}.ant-tooltip-placement-leftTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-bottom .ant-tooltip-arrow,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{top:0;transform:translateY(-100%)}.ant-tooltip-placement-bottom .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow-content{box-shadow:-3px -3px 7px rgba(0,0,0,.07);transform:translateY(11px) rotate(225deg)}.ant-tooltip-placement-bottom .ant-tooltip-arrow{left:50%;transform:translateY(-100%) translateX(-50%)}.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{right:13px}.ant-tooltip-pink .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-pink .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-magenta .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-magenta .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-red .ant-tooltip-inner{background-color:#f5222d}.ant-tooltip-red .ant-tooltip-arrow-content:before{background:#f5222d}.ant-tooltip-volcano .ant-tooltip-inner{background-color:#fa541c}.ant-tooltip-volcano .ant-tooltip-arrow-content:before{background:#fa541c}.ant-tooltip-orange .ant-tooltip-inner{background-color:#fa8c16}.ant-tooltip-orange .ant-tooltip-arrow-content:before{background:#fa8c16}.ant-tooltip-yellow .ant-tooltip-inner{background-color:#fadb14}.ant-tooltip-yellow .ant-tooltip-arrow-content:before{background:#fadb14}.ant-tooltip-gold .ant-tooltip-inner{background-color:#ffb924}.ant-tooltip-gold .ant-tooltip-arrow-content:before{background:#ffb924}.ant-tooltip-cyan .ant-tooltip-inner{background-color:#13c2c2}.ant-tooltip-cyan .ant-tooltip-arrow-content:before{background:#13c2c2}.ant-tooltip-lime .ant-tooltip-inner{background-color:#a0d911}.ant-tooltip-lime .ant-tooltip-arrow-content:before{background:#a0d911}.ant-tooltip-green .ant-tooltip-inner{background-color:#26c992}.ant-tooltip-green .ant-tooltip-arrow-content:before{background:#26c992}.ant-tooltip-blue .ant-tooltip-inner{background-color:#296df3}.ant-tooltip-blue .ant-tooltip-arrow-content:before{background:#296df3}.ant-tooltip-geekblue .ant-tooltip-inner{background-color:#2f54eb}.ant-tooltip-geekblue .ant-tooltip-arrow-content:before{background:#2f54eb}.ant-tooltip-purple .ant-tooltip-inner{background-color:#722ed1}.ant-tooltip-purple .ant-tooltip-arrow-content:before{background:#722ed1}.ant-tooltip-rtl{direction:rtl}.ant-tooltip-rtl .ant-tooltip-inner{text-align:right}.ant-space{display:inline-flex}.ant-space-vertical{flex-direction:column}.ant-space-align-center{align-items:center}.ant-space-align-start{align-items:flex-start}.ant-space-align-end{align-items:flex-end}.ant-space-align-baseline{align-items:baseline}.ant-space-item:empty{display:none}.ant-space-compact{display:inline-flex}.ant-space-compact-block{display:flex;width:100%}.ant-space-compact-vertical{flex-direction:column}.ant-space-rtl{direction:rtl}.ant-space-compact-rtl{direction:rtl}.ant-spin{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:absolute;display:none;color:#296df3;font-size:0;text-align:center;vertical-align:middle;opacity:0;transition:transform .3s cubic-bezier(.78,.14,.15,.86)}.ant-spin-spinning{position:static;display:inline-block;opacity:1}.ant-spin-nested-loading{position:relative}.ant-spin-nested-loading>div>.ant-spin{position:absolute;top:0;left:0;z-index:4;display:block;width:100%;height:100%;max-height:400px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot{position:absolute;top:50%;left:50%;margin:-10px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-text{position:absolute;top:50%;width:100%;padding-top:5px;font-size:14px;text-shadow:0 1px 2px #fff}.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot{margin-top:-20px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot{margin:-7px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text{padding-top:2px}.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot{margin-top:-17px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot{margin:-16px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text{padding-top:11px}.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot{margin-top:-26px}.ant-spin-container{position:relative;transition:opacity .3s}.ant-spin-container:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:none\9;width:100%;height:100%;background:#fff;opacity:0;transition:all .3s;content:"";pointer-events:none}.ant-spin-blur{clear:both;opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.ant-spin-blur:after{opacity:.4;pointer-events:auto}.ant-spin-tip{color:rgba(0,10,36,.65)}.ant-spin-dot{position:relative;display:inline-block;font-size:20px;width:1em;height:1em}.ant-spin-dot-item{position:absolute;display:block;width:9px;height:9px;background-color:#296df3;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s linear infinite alternate}.ant-spin-dot-item:first-child{top:0;left:0}.ant-spin-dot-item:nth-child(2){top:0;right:0;animation-delay:.4s}.ant-spin-dot-item:nth-child(3){right:0;bottom:0;animation-delay:.8s}.ant-spin-dot-item:nth-child(4){bottom:0;left:0;animation-delay:1.2s}.ant-spin-dot-spin{transform:rotate(0deg);animation:antRotate 1.2s linear infinite}.ant-spin-sm .ant-spin-dot{font-size:14px}.ant-spin-sm .ant-spin-dot i{width:6px;height:6px}.ant-spin-lg .ant-spin-dot{font-size:32px}.ant-spin-lg .ant-spin-dot i{width:14px;height:14px}.ant-spin.ant-spin-show-text .ant-spin-text{display:block}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.ant-spin-blur{background:#fff;opacity:.5}}@keyframes antSpinMove{to{opacity:1}}@keyframes antRotate{to{transform:rotate(1turn)}}.ant-spin-rtl{direction:rtl}.ant-spin-rtl .ant-spin-dot-spin{transform:rotate(-45deg);animation-name:antRotateRtl}@keyframes antRotateRtl{to{transform:rotate(-405deg)}}.container___1Rq3A>*{background-color:#fff;border-radius:4px;box-shadow:0 6px 16px -8px rgba(0,0,0,.08),0 9px 28px 0 rgba(0,0,0,.05),0 12px 48px 16px rgba(0,0,0,.03)}@media screen and (max-width:480px){.container___1Rq3A{width:100%!important}.container___1Rq3A>*{border-radius:0!important}}.menu___1L63y .anticon{margin-right:8px}.menu___1L63y .ant-dropdown-menu-item{min-width:160px}.right___3L8KG{display:flex;float:right;height:48px;margin-left:auto;overflow:hidden}.right___3L8KG .action___LP4_P{display:flex;align-items:center;height:48px;padding:0 12px;cursor:pointer;transition:all .3s}.right___3L8KG .action___LP4_P>span{vertical-align:middle}.right___3L8KG .action___LP4_P:hover{background:rgba(0,0,0,.025)}.right___3L8KG .action___LP4_P.opened{background:rgba(0,0,0,.025)}.right___3L8KG .search___2W0sJ{padding:0 12px}.right___3L8KG .search___2W0sJ:hover{background:transparent}.right___3L8KG .account___6HXOq .avatar___2cOWV{margin-right:8px;color:#296df3;vertical-align:top;background:hsla(0,0%,100%,.85)}.dark___1NwCY .action___LP4_P .download___3EyS7{display:flex;align-items:center}.dark___1NwCY .action___LP4_P .menuName___avsrP{margin-left:5px;color:#fff;font-size:13px}.dark___1NwCY .action___LP4_P:hover{background:#296df3}.dark___1NwCY .action___LP4_P.opened{background:#252a3d}.actionIcon___29O_9{font-size:20px}.tooltip___OioLL{padding-top:0!important;font-size:12px!important}.tooltip___OioLL .ant-tooltip-arrow{display:none}.tooltip___OioLL .ant-tooltip-inner{min-height:0!important;padding:3px 6px!important}.ant-avatar{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:inline-block;overflow:hidden;color:#fff;white-space:nowrap;text-align:center;vertical-align:middle;background:#ccc;width:32px;height:32px;line-height:32px;border-radius:50%}.ant-avatar-image{background:transparent}.ant-avatar .ant-image-img{display:block}.ant-avatar-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar.ant-avatar-icon{font-size:18px}.ant-avatar.ant-avatar-icon>.anticon{margin:0}.ant-avatar-lg{width:40px;height:40px;line-height:40px;border-radius:50%}.ant-avatar-lg-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar-lg.ant-avatar-icon{font-size:24px}.ant-avatar-lg.ant-avatar-icon>.anticon{margin:0}.ant-avatar-sm{width:24px;height:24px;line-height:24px;border-radius:50%}.ant-avatar-sm-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar-sm.ant-avatar-icon{font-size:14px}.ant-avatar-sm.ant-avatar-icon>.anticon{margin:0}.ant-avatar-square{border-radius:4px}.ant-avatar>img{display:block;width:100%;height:100%;object-fit:cover}.ant-avatar-group{display:inline-flex}.ant-avatar-group .ant-avatar{border:1px solid #fff}.ant-avatar-group .ant-avatar:not(:first-child){margin-left:-8px}.ant-avatar-group-popover .ant-avatar+.ant-avatar{margin-left:3px}.ant-avatar-group-rtl .ant-avatar:not(:first-child){margin-right:-8px;margin-left:0}.ant-avatar-group-popover.ant-popover-rtl .ant-avatar+.ant-avatar{margin-right:3px;margin-left:0}.ant-popover{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:absolute;top:0;left:0;z-index:1030;max-width:100vw;font-weight:400;white-space:normal;text-align:left;cursor:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ant-popover-content{position:relative}.ant-popover:after{position:absolute;background:hsla(0,0%,100%,.01);content:""}.ant-popover-hidden{display:none}.ant-popover-placement-top,.ant-popover-placement-topLeft,.ant-popover-placement-topRight{padding-bottom:15.3137085px}.ant-popover-placement-right,.ant-popover-placement-rightBottom,.ant-popover-placement-rightTop{padding-left:15.3137085px}.ant-popover-placement-bottom,.ant-popover-placement-bottomLeft,.ant-popover-placement-bottomRight{padding-top:15.3137085px}.ant-popover-placement-left,.ant-popover-placement-leftBottom,.ant-popover-placement-leftTop{padding-right:15.3137085px}.ant-popover-inner{background-color:#fff;background-clip:padding-box;border-radius:4px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.ant-popover-inner{box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}}.ant-popover-title{min-width:177px;min-height:32px;margin:0;padding:5px 16px 4px;color:rgba(0,10,36,.85);font-weight:500;border-bottom:1px solid #f0f0f0}.ant-popover-inner-content{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;padding:12px 16px;color:rgba(0,10,36,.85)}.ant-popover-message{display:flex;padding:4px 0 12px;color:rgba(0,10,36,.85);font-size:14px}.ant-popover-message-icon{display:inline-block;margin-right:8px;color:#ffb924;font-size:14px}.ant-popover-buttons{margin-bottom:4px;text-align:right}.ant-popover-buttons button:not(:first-child){margin-left:8px}.ant-popover-arrow{position:absolute;display:block;width:22px;height:22px;overflow:hidden;background:transparent;pointer-events:none}.ant-popover-arrow-content{--antd-arrow-background-color:#fff;position:absolute;top:0;right:0;bottom:0;left:0;display:block;width:11.3137085px;height:11.3137085px;margin:auto;content:"";pointer-events:auto;border-radius:0 0 2px;pointer-events:none}.ant-popover-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-popover-placement-top .ant-popover-arrow,.ant-popover-placement-topLeft .ant-popover-arrow,.ant-popover-placement-topRight .ant-popover-arrow{bottom:0;transform:translateY(100%)}.ant-popover-placement-top .ant-popover-arrow-content,.ant-popover-placement-topLeft .ant-popover-arrow-content,.ant-popover-placement-topRight .ant-popover-arrow-content{box-shadow:3px 3px 7px rgba(0,0,0,.07);transform:translateY(-11px) rotate(45deg)}.ant-popover-placement-top .ant-popover-arrow{left:50%;transform:translateY(100%) translateX(-50%)}.ant-popover-placement-topLeft .ant-popover-arrow{left:16px}.ant-popover-placement-topRight .ant-popover-arrow{right:16px}.ant-popover-placement-right .ant-popover-arrow,.ant-popover-placement-rightBottom .ant-popover-arrow,.ant-popover-placement-rightTop .ant-popover-arrow{left:0;transform:translateX(-100%)}.ant-popover-placement-right .ant-popover-arrow-content,.ant-popover-placement-rightBottom .ant-popover-arrow-content,.ant-popover-placement-rightTop .ant-popover-arrow-content{box-shadow:3px 3px 7px rgba(0,0,0,.07);transform:translateX(11px) rotate(135deg)}.ant-popover-placement-right .ant-popover-arrow{top:50%;transform:translateX(-100%) translateY(-50%)}.ant-popover-placement-rightTop .ant-popover-arrow{top:12px}.ant-popover-placement-rightBottom .ant-popover-arrow{bottom:12px}.ant-popover-placement-bottom .ant-popover-arrow,.ant-popover-placement-bottomLeft .ant-popover-arrow,.ant-popover-placement-bottomRight .ant-popover-arrow{top:0;transform:translateY(-100%)}.ant-popover-placement-bottom .ant-popover-arrow-content,.ant-popover-placement-bottomLeft .ant-popover-arrow-content,.ant-popover-placement-bottomRight .ant-popover-arrow-content{box-shadow:2px 2px 5px rgba(0,0,0,.06);transform:translateY(11px) rotate(-135deg)}.ant-popover-placement-bottom .ant-popover-arrow{left:50%;transform:translateY(-100%) translateX(-50%)}.ant-popover-placement-bottomLeft .ant-popover-arrow{left:16px}.ant-popover-placement-bottomRight .ant-popover-arrow{right:16px}.ant-popover-placement-left .ant-popover-arrow,.ant-popover-placement-leftBottom .ant-popover-arrow,.ant-popover-placement-leftTop .ant-popover-arrow{right:0;transform:translateX(100%)}.ant-popover-placement-left .ant-popover-arrow-content,.ant-popover-placement-leftBottom .ant-popover-arrow-content,.ant-popover-placement-leftTop .ant-popover-arrow-content{box-shadow:3px 3px 7px rgba(0,0,0,.07);transform:translateX(-11px) rotate(-45deg)}.ant-popover-placement-left .ant-popover-arrow{top:50%;transform:translateX(100%) translateY(-50%)}.ant-popover-placement-leftTop .ant-popover-arrow{top:12px}.ant-popover-placement-leftBottom .ant-popover-arrow{bottom:12px}.ant-popover-pink .ant-popover-inner{background-color:#eb2f96}.ant-popover-pink .ant-popover-arrow-content{background-color:#eb2f96}.ant-popover-magenta .ant-popover-inner{background-color:#eb2f96}.ant-popover-magenta .ant-popover-arrow-content{background-color:#eb2f96}.ant-popover-red .ant-popover-inner{background-color:#f5222d}.ant-popover-red .ant-popover-arrow-content{background-color:#f5222d}.ant-popover-volcano .ant-popover-inner{background-color:#fa541c}.ant-popover-volcano .ant-popover-arrow-content{background-color:#fa541c}.ant-popover-orange .ant-popover-inner{background-color:#fa8c16}.ant-popover-orange .ant-popover-arrow-content{background-color:#fa8c16}.ant-popover-yellow .ant-popover-inner{background-color:#fadb14}.ant-popover-yellow .ant-popover-arrow-content{background-color:#fadb14}.ant-popover-gold .ant-popover-inner{background-color:#ffb924}.ant-popover-gold .ant-popover-arrow-content{background-color:#ffb924}.ant-popover-cyan .ant-popover-inner{background-color:#13c2c2}.ant-popover-cyan .ant-popover-arrow-content{background-color:#13c2c2}.ant-popover-lime .ant-popover-inner{background-color:#a0d911}.ant-popover-lime .ant-popover-arrow-content{background-color:#a0d911}.ant-popover-green .ant-popover-inner{background-color:#26c992}.ant-popover-green .ant-popover-arrow-content{background-color:#26c992}.ant-popover-blue .ant-popover-inner{background-color:#296df3}.ant-popover-blue .ant-popover-arrow-content{background-color:#296df3}.ant-popover-geekblue .ant-popover-inner{background-color:#2f54eb}.ant-popover-geekblue .ant-popover-arrow-content{background-color:#2f54eb}.ant-popover-purple .ant-popover-inner{background-color:#722ed1}.ant-popover-purple .ant-popover-arrow-content{background-color:#722ed1}.ant-popover-rtl{direction:rtl;text-align:right}.ant-popover-rtl .ant-popover-message-icon{margin-right:0;margin-left:8px}.ant-popover-rtl .ant-popover-message-title{padding-left:16px}.ant-popover-rtl .ant-popover-buttons{text-align:left}.ant-popover-rtl .ant-popover-buttons button{margin-right:8px;margin-left:0}@font-face{font-family:"iconfont";src:url(static/iconfont.0ac2d58a.woff2) format("woff2"),url(static/iconfont.0de60a33.woff) format("woff"),url(static/iconfont.7ae6e4e0.ttf) format("truetype"),url(static/iconfont.92a3f736.svg#iconfont) format("svg")}.iconfont___1fcw4{font-family:"iconfont"!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.iconbaobiaokanban___DR4U5:before{content:"\e66b"}.iconkanban___IWq2H:before{content:"\e638"}.iconyunyingkanban___14Q9Y:before{content:"\e608"}.iconshujukanban1___16Nzt:before{content:"\eb66"}.iconjingqingqidai01___310Aa:before{content:"\e607"}.icontouzi___381YH:before{content:"\e67a"}.iconriqi___2aj5n:before{content:"\e609"}.iconyinleren____3AoFi:before{content:"\e606"}.icondapan___3Qdzn:before{content:"\e668"}.iconbangdan___fr8LR:before{content:"\e669"}.iconshujuwajue___1s5Ck:before{content:"\e667"}.iconshoucang1___2lxZQ:before{content:"\e600"}.icontianjiazhibiao___1oZVf:before{content:"\e632"}.icontianjiafenzu___2ond3:before{content:"\e666"}.iconyouxiajiaogouxuan___3Z1by:before{content:"\e8b7"}.iconxiaoshouzhibiaoshezhi___1TLhk:before{content:"\e665"}.iconyingyongbiaoge___3zN8L:before{content:"\e6ae"}.iconzhibiao____6qJe:before{content:"\e66a"}.iconsearch___1joAc:before{content:"\e7c9"}.iconfactory-color___2JEj0:before{content:"\e69d"}.iconportray-color___7pSrY:before{content:"\e69e"}.iconvisualize-color___zOv2M:before{content:"\e69f"}.iconamount-color___Jji4q:before{content:"\e68f"}.iconapi-color___397Gu:before{content:"\e690"}.iconcontent-color___2Qofk:before{content:"\e691"}.iconbox-color___1pb-b:before{content:"\e692"}.iconchat-color___25UvW:before{content:"\e693"}.iconclient-color___W3t54:before{content:"\e694"}.icondata-process___3Flot:before{content:"\e695"}.iconbi-color___3Yki1:before{content:"\e696"}.iconfiled-color___1bkOK:before{content:"\e697"}.iconinvoking-color___jnm66:before{content:"\e698"}.iconissue-color___1D8Jy:before{content:"\e699"}.iconplatform-color___39LXE:before{content:"\e69a"}.iconfile-color___1pueQ:before{content:"\e69b"}.iconname-color___pm4p9:before{content:"\e69c"}.icondraft___2wSyM:before{content:"\e605"}.iconunknown___29KoO:before{content:"\e604"}.iconnormal___39WGI:before{content:"\e603"}.iconfreezed___3HYp5:before{content:"\e602"}.iconlogowenzi___1Cqhp:before{content:"\e660"}.iconlogobiaoshi___2hx1_:before{content:"\e664"}.iconchaoyinshuxitonglogo___1AMzn:before{content:"\e663"}.iconzanwuquanxiandianjishenqing_1___1SBfE:before{content:"\e662"}.iconqingchuangjianmuluhuokanban___1norf:before{content:"\e661"}.iconzichan___3twqW:before{content:"\e65f"}.iconhangweifenxi___3n1jk:before{content:"\e65e"}.iconshujuzichan___1iKwI:before{content:"\e65d"}.iconshujukanban___4BASP:before{content:"\e659"}.iconshujujieru___1l_6a:before{content:"\e65a"}.iconshujutansuo___3Iy5X:before{content:"\e65b"}.iconminjiefenxi___CRxBx:before{content:"\e65c"}.iconyanfagongju___1oGmZ:before{content:"\e658"}.iconshujuanquan___22tW_:before{content:"\e614"}.iconCE___2mRLn:before{content:"\e601"}.iconkanbantu-shuaxin___16YQf:before{content:"\e657"}.icondaohang-sousuo___1wNGK:before{content:"\e63e"}.icondaohang-bangzhu___1KLsE:before{content:"\e63f"}.iconkanbantu-fenxiang___3WwdQ:before{content:"\e640"}.iconquanju-riqi___A41DI:before{content:"\e641"}.icondaohang-shezhi___1ljpY:before{content:"\e642"}.icondaohang-zichangouwuche___k4UwW:before{content:"\e643"}.iconquanju-xiazai___2X4jV:before{content:"\e644"}.iconkanbantu-quanping___2DvgF:before{content:"\e645"}.iconshujuzichan-yewushujuzichan___3Hzfq:before{content:"\e646"}.iconshujukanban-tianjiakanban___2q82r:before{content:"\e647"}.iconqingkong___2Xgqr:before{content:"\e648"}.iconshujuzichan-jishushujuzichan___3bZh5:before{content:"\e649"}.iconshujuzichan-zichanfaxian___3T4LE:before{content:"\e64a"}.icontishi-beizhu1___10Rgg:before{content:"\e64b"}.iconshujukanban-tianjiamulu___17x-o:before{content:"\e64c"}.icontubiao-zhuzhuangtu___3HRWi:before{content:"\e64d"}.icondaohang-xiaoxitishi___1cqbc:before{content:"\e64e"}.icontubiao-bingtu___1ZnTb:before{content:"\e64f"}.icontishi-beizhu2___1T1U0:before{content:"\e650"}.iconshezhi-quanxianshezhi___33vY2:before{content:"\e651"}.iconhangweifenxi-mokuaifenxi___3wDS8:before{content:"\e652"}.icontubiao-loudoutu___3VAKj:before{content:"\e653"}.icontubiao-zhexiantu___3Rs-l:before{content:"\e654"}.icontubiao-biaoge___14GNX:before{content:"\e655"}.iconhangweifenxi-baobiaoliebiao___1cwXt:before{content:"\e656"}.s2icon___10AEz{line-height:1}@media screen and (max-width:480px){.umi-plugin-layout-container{width:100%!important}.umi-plugin-layout-container>*{border-radius:0!important}}.umi-plugin-layout-menu :global(.anticon){margin-right:8px}.umi-plugin-layout-menu :global(.ant-dropdown-menu-item){min-width:160px}.umi-plugin-layout-right{display:flex;float:right;height:100%;margin-left:auto;overflow:hidden}.umi-plugin-layout-right .umi-plugin-layout-action{display:flex;align-items:center;height:100%;padding:0 12px;cursor:pointer;transition:all .3s}.umi-plugin-layout-right .umi-plugin-layout-action>i{color:rgba(0,10,36,.85);vertical-align:middle}.umi-plugin-layout-right .umi-plugin-layout-action:hover{background:rgba(0,0,0,.025)}.umi-plugin-layout-right .umi-plugin-layout-action:global(.opened){background:rgba(0,0,0,.025)}.umi-plugin-layout-right .umi-plugin-layout-search{padding:0 12px}.umi-plugin-layout-right .umi-plugin-layout-search:hover{background:transparent}.umi-plugin-layout-name{margin-left:8px}.ant-result{padding:48px 32px}.ant-result-success .ant-result-icon>.anticon{color:#26c992}.ant-result-error .ant-result-icon>.anticon{color:#ef4872}.ant-result-info .ant-result-icon>.anticon{color:#296df3}.ant-result-warning .ant-result-icon>.anticon{color:#ffb924}.ant-result-image{width:250px;height:295px;margin:auto}.ant-result-icon{margin-bottom:24px;text-align:center}.ant-result-icon>.anticon{font-size:72px}.ant-result-title{color:rgba(0,10,36,.85);font-size:24px;line-height:1.8;text-align:center}.ant-result-subtitle{color:rgba(0,10,36,.65);font-size:14px;line-height:1.6;text-align:center}.ant-result-extra{margin:24px 0 0;text-align:center}.ant-result-extra>*{margin-right:8px}.ant-result-extra>:last-child{margin-right:0}.ant-result-content{margin-top:24px;padding:24px 40px;background-color:#fafafa}.ant-result-rtl{direction:rtl}.ant-result-rtl .ant-result-extra>*{margin-right:0;margin-left:8px}.ant-result-rtl .ant-result-extra>:last-child{margin-left:0}.ant-affix{position:fixed;z-index:10}.ant-page-header{box-sizing:border-box;margin:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;padding:16px 24px;background-color:#fff}.ant-page-header-ghost{background-color:inherit}.ant-page-header.has-breadcrumb{padding-top:12px}.ant-page-header.has-footer{padding-bottom:0}.ant-page-header-back{margin-right:16px;font-size:16px;line-height:1}.ant-page-header-back-button{color:#296df3;outline:none;cursor:pointer;transition:color .3s;color:#000}.ant-page-header-back-button:focus-visible,.ant-page-header-back-button:hover{color:#5493ff}.ant-page-header-back-button:active{color:#184ecc}.ant-page-header .ant-divider-vertical{height:14px;margin:0 12px;vertical-align:middle}.ant-breadcrumb+.ant-page-header-heading{margin-top:8px}.ant-page-header-heading{display:flex;justify-content:space-between}.ant-page-header-heading-left{display:flex;align-items:center;margin:4px 0;overflow:hidden}.ant-page-header-heading-title{margin-right:12px;margin-bottom:0;color:rgba(0,10,36,.85);font-weight:600;font-size:20px;line-height:32px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-page-header-heading .ant-avatar{margin-right:12px}.ant-page-header-heading-sub-title{margin-right:12px;color:rgba(0,10,36,.65);font-size:14px;line-height:1.5715;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-page-header-heading-extra{margin:4px 0;white-space:nowrap}.ant-page-header-heading-extra>*{white-space:unset}.ant-page-header-content{padding-top:12px}.ant-page-header-footer{margin-top:16px}.ant-page-header-footer .ant-tabs>.ant-tabs-nav{margin:0}.ant-page-header-footer .ant-tabs>.ant-tabs-nav:before{border:none}.ant-page-header-footer .ant-tabs .ant-tabs-tab{padding-top:8px;padding-bottom:8px;font-size:16px}.ant-page-header-compact .ant-page-header-heading{flex-wrap:wrap}.ant-page-header-rtl{direction:rtl}.ant-page-header-rtl .ant-page-header-back{float:right;margin-right:0;margin-left:16px}.ant-page-header-rtl .ant-page-header-heading-title{margin-right:0;margin-left:12px}.ant-page-header-rtl .ant-page-header-heading .ant-avatar{margin-right:0;margin-left:12px}.ant-page-header-rtl .ant-page-header-heading-sub-title{float:right;margin-right:0;margin-left:12px}.ant-page-header-rtl .ant-page-header-heading-tags{float:right}.ant-page-header-rtl .ant-page-header-heading-extra{float:left}.ant-page-header-rtl .ant-page-header-heading-extra>*{margin-right:12px;margin-left:0}.ant-page-header-rtl .ant-page-header-heading-extra>:first-child{margin-right:0}.ant-page-header-rtl .ant-page-header-footer .ant-tabs-bar .ant-tabs-nav{float:right}.ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";color:rgba(0,10,36,.65);font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb ol{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none}.ant-breadcrumb a{color:rgba(0,10,36,.65);transition:color .3s}.ant-breadcrumb a:hover{color:rgba(0,10,36,.85)}.ant-breadcrumb li:last-child{color:rgba(0,10,36,.85)}.ant-breadcrumb li:last-child a{color:rgba(0,10,36,.85)}li:last-child>.ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:rgba(0,10,36,.65)}.ant-breadcrumb-link>.anticon+a,.ant-breadcrumb-link>.anticon+span{margin-left:4px}.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{display:table;content:""}.ant-breadcrumb-rtl:after{display:table;clear:both;content:""}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span{margin-right:4px;margin-left:0}.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-right:4px;margin-left:0}.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{padding:8px 0;font-size:14px}.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{padding:16px 0;font-size:16px}.ant-tabs-card.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{padding:6px 16px}.ant-tabs-card.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{padding:7px 16px 6px}.ant-tabs-rtl{direction:rtl}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab:last-of-type{margin-left:0}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .anticon{margin-right:0;margin-left:12px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove{margin-right:8px;margin-left:-4px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-nav{order:1}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-content-holder{order:0}.ant-tabs-rtl.ant-tabs-right>.ant-tabs-nav{order:0}.ant-tabs-rtl.ant-tabs-right>.ant-tabs-content-holder{order:1}.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-right:2px;margin-left:0}.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-add{margin-right:2px;margin-left:0}.ant-tabs-dropdown-rtl{direction:rtl}.ant-tabs-dropdown-rtl .ant-tabs-dropdown-menu-item{text-align:right}.ant-tabs-bottom,.ant-tabs-top{flex-direction:column}.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav,.ant-tabs-top>.ant-tabs-nav,.ant-tabs-top>div>.ant-tabs-nav{margin:0 0 16px}.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav:before,.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav:before{position:absolute;right:0;left:0;border-bottom:1px solid #f0f0f0;content:""}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar{height:2px}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:width .3s,left .3s,right .3s}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{top:0;bottom:0;width:30px}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{left:0;box-shadow:inset 10px 0 8px -8px rgba(0,0,0,.08)}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{right:0;box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.08)}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before{opacity:1}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after{opacity:1}.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav:before{bottom:0}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar{bottom:0}.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav{order:1;margin-top:16px;margin-bottom:0}.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav:before{top:0}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar{top:0}.ant-tabs-bottom>.ant-tabs-content-holder,.ant-tabs-bottom>div>.ant-tabs-content-holder{order:0}.ant-tabs-left>.ant-tabs-nav,.ant-tabs-left>div>.ant-tabs-nav,.ant-tabs-right>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{flex-direction:column;min-width:50px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{padding:8px 24px;text-align:center}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin:16px 0 0}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap{flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{right:0;left:0;height:30px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{top:0;box-shadow:inset 0 10px 8px -8px rgba(0,0,0,.08)}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{bottom:0;box-shadow:inset 0 -10px 8px -8px rgba(0,0,0,.08)}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before{opacity:1}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after{opacity:1}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{width:2px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:height .3s,top .3s}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-operations{flex:1 0 auto;flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar{right:0}.ant-tabs-left>.ant-tabs-content-holder,.ant-tabs-left>div>.ant-tabs-content-holder{margin-left:-1px;border-left:1px solid #f0f0f0}.ant-tabs-left>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-left>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-left:24px}.ant-tabs-right>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{order:1}.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{left:0}.ant-tabs-right>.ant-tabs-content-holder,.ant-tabs-right>div>.ant-tabs-content-holder{order:0;margin-right:-1px;border-right:1px solid #f0f0f0}.ant-tabs-right>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-right>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-right:24px}.ant-tabs-dropdown{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;display:block}.ant-tabs-dropdown-hidden{display:none}.ant-tabs-dropdown-menu{max-height:200px;margin:0;padding:4px 0;overflow-x:hidden;overflow-y:auto;text-align:left;list-style-type:none;background-color:#fff;background-clip:padding-box;border-radius:4px;outline:none;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}.ant-tabs-dropdown-menu-item{display:flex;align-items:center;min-width:120px;margin:0;padding:5px 12px;overflow:hidden;color:rgba(0,10,36,.85);font-weight:400;font-size:14px;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:all .3s}.ant-tabs-dropdown-menu-item>span{flex:1 1;white-space:nowrap}.ant-tabs-dropdown-menu-item-remove{flex:none;margin-left:12px;color:rgba(0,10,36,.65);font-size:12px;background:transparent;border:0;cursor:pointer}.ant-tabs-dropdown-menu-item-remove:hover{color:#4e86f5}.ant-tabs-dropdown-menu-item:hover{background:#f5f5f5}.ant-tabs-dropdown-menu-item-disabled,.ant-tabs-dropdown-menu-item-disabled:hover{color:rgba(0,0,0,.25);background:transparent;cursor:not-allowed}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{margin:0;padding:8px 16px;background:#fafafa;border:1px solid #f0f0f0;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{color:#296df3;background:#fff}.ant-tabs-card>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-ink-bar{visibility:hidden}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-left:2px}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab{border-radius:4px 4px 0 0}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab-active{border-bottom-color:#fff}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 0 4px 4px}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab-active{border-top-color:#fff}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-top:2px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab{border-radius:4px 0 0 4px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab-active{border-right-color:#fff}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 4px 4px 0}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab-active{border-left-color:#fff}.ant-tabs{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:flex}.ant-tabs>.ant-tabs-nav,.ant-tabs>div>.ant-tabs-nav{position:relative;display:flex;flex:none;align-items:center}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap{position:relative;display:inline-block;display:flex;flex:auto;align-self:stretch;overflow:hidden;white-space:nowrap;transform:translate(0)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{position:absolute;z-index:1;opacity:0;transition:opacity .3s;content:"";pointer-events:none}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-list{position:relative;display:flex;transition:transform .3s}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations{display:flex;align-self:stretch}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations-hidden,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations-hidden{position:absolute;visibility:hidden;pointer-events:none}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more{position:relative;padding:8px 16px;background:transparent;border:0}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more:after{position:absolute;right:0;bottom:0;left:0;height:5px;transform:translateY(100%);content:""}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add{min-width:40px;margin-left:2px;padding:0 8px;background:#fafafa;border:1px solid #f0f0f0;border-radius:4px 4px 0 0;outline:none;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:hover,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:hover{color:#4e86f5}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:focus,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:focus{color:#0d57e8}.ant-tabs-extra-content{flex:none}.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*=ant-tabs-nav-wrap-ping]),.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*=ant-tabs-nav-wrap-ping]){justify-content:center}.ant-tabs-ink-bar{position:absolute;background:#296df3;pointer-events:none}.ant-tabs-tab{position:relative;display:inline-flex;align-items:center;padding:12px 0;font-size:14px;background:transparent;border:0;outline:none;cursor:pointer}.ant-tabs-tab-btn:active,.ant-tabs-tab-btn:focus,.ant-tabs-tab-remove:active,.ant-tabs-tab-remove:focus{color:#0d57e8}.ant-tabs-tab-btn{outline:none;transition:all .3s}.ant-tabs-tab-remove{flex:none;margin-right:-4px;margin-left:8px;color:rgba(0,10,36,.65);font-size:12px;background:transparent;border:none;outline:none;cursor:pointer;transition:all .3s}.ant-tabs-tab-remove:hover{color:rgba(0,10,36,.85)}.ant-tabs-tab:hover{color:#4e86f5}.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn{color:#296df3;text-shadow:0 0 .25px currentcolor}.ant-tabs-tab.ant-tabs-tab-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:active,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:focus,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:active,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:focus{color:rgba(0,0,0,.25)}.ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-tab .anticon{margin-right:12px}.ant-tabs-tab+.ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-content{position:relative;width:100%}.ant-tabs-content-holder{flex:auto;min-width:0;min-height:0}.ant-tabs-tabpane{outline:none}.ant-tabs-tabpane-hidden{display:none}.ant-tabs-switch-appear,.ant-tabs-switch-enter{transition:none}.ant-tabs-switch-appear-start,.ant-tabs-switch-enter-start{opacity:0}.ant-tabs-switch-appear-active,.ant-tabs-switch-enter-active{opacity:1;transition:opacity .3s}.ant-tabs-switch-leave{position:absolute;transition:none;inset:0}.ant-tabs-switch-leave-start{opacity:1}.ant-tabs-switch-leave-active{opacity:0;transition:opacity .3s}.ant-pro-page-container-children-content{margin:24px 24px 0;padding:inherit}.ant-pro-page-container{background-color:inherit}.ant-pro-page-container-warp{background-color:#fff}.ant-pro-page-container-warp .ant-tabs-nav{margin:0}.ant-pro-page-container-ghost .ant-pro-page-container-warp{background-color:transparent}.ant-pro-page-container-ghost .ant-pro-page-container-children-content{margin-top:0}.ant-pro-page-container-main .ant-pro-page-container-detail{display:flex}.ant-pro-page-container-main .ant-pro-page-container-row{display:flex;width:100%}.ant-pro-page-container-main .ant-pro-page-container-title-content{margin-bottom:16px}.ant-pro-page-container-main .ant-pro-page-container-content,.ant-pro-page-container-main .ant-pro-page-container-title{flex:auto;width:100%}.ant-pro-page-container-main .ant-pro-page-container-extraContent,.ant-pro-page-container-main .ant-pro-page-container-main{flex:0 1 auto}.ant-pro-page-container-main .ant-pro-page-container-main{width:100%}.ant-pro-page-container-main .ant-pro-page-container-title{margin-bottom:16px}.ant-pro-page-container-main .ant-pro-page-container-logo{margin-bottom:16px}.ant-pro-page-container-main .ant-pro-page-container-extraContent{min-width:242px;margin-left:88px;text-align:right}@media screen and (max-width:1200px){.ant-pro-page-container-main .ant-pro-page-container-extraContent{margin-left:44px}}@media screen and (max-width:992px){.ant-pro-page-container-main .ant-pro-page-container-extraContent{margin-left:20px}}@media screen and (max-width:768px){.ant-pro-page-container-main .ant-pro-page-container-row{display:block}.ant-pro-page-container-main .ant-pro-page-container-action,.ant-pro-page-container-main .ant-pro-page-container-extraContent{margin-left:0;text-align:left}}@media screen and (max-width:576px){.ant-pro-page-container-detail{display:block}.ant-pro-page-container-extraContent{margin-left:0}}.ant-pro-grid-content{width:100%}.ant-pro-grid-content.wide{max-width:1200px;margin:0 auto}.ant-pro-footer-bar{position:fixed;right:0;bottom:0;z-index:99;display:flex;align-items:center;width:100%;padding:0 24px;line-height:44px;background:#fff;border-top:1px solid #f0f0f0;box-shadow:0 -6px 16px -8px rgba(0,0,0,.08),0 -9px 28px 0 rgba(0,0,0,.05),0 -12px 48px 16px rgba(0,0,0,.03);transition:width .3s cubic-bezier(.645,.045,.355,1)}.ant-pro-footer-bar-left{flex:1 1}.ant-pro-footer-bar-right>*{margin-right:8px}.ant-pro-footer-bar-right>:last-child{margin:0}.ant-layout{display:flex;flex:auto;flex-direction:column;min-height:0;background:#f0f2f5}.ant-layout,.ant-layout *{box-sizing:border-box}.ant-layout.ant-layout-has-sider{flex-direction:row}.ant-layout.ant-layout-has-sider>.ant-layout,.ant-layout.ant-layout-has-sider>.ant-layout-content{width:0}.ant-layout-footer,.ant-layout-header{flex:0 0 auto}.ant-layout-header{height:64px;padding:0 50px;color:rgba(0,10,36,.85);line-height:64px;background:#001529}.ant-layout-footer{padding:24px 50px;color:rgba(0,10,36,.85);font-size:14px;background:#f0f2f5}.ant-layout-content{flex:auto;min-height:0}.ant-layout-sider{position:relative;min-width:0;background:#001529;transition:all .2s}.ant-layout-sider-children{height:100%;margin-top:-.1px;padding-top:.1px}.ant-layout-sider-children .ant-menu.ant-menu-inline-collapsed{width:auto}.ant-layout-sider-has-trigger{padding-bottom:48px}.ant-layout-sider-right{order:1}.ant-layout-sider-trigger{position:fixed;bottom:0;z-index:1;height:48px;color:#fff;line-height:48px;text-align:center;background:#002140;cursor:pointer;transition:all .2s}.ant-layout-sider-zero-width>*{overflow:hidden}.ant-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;z-index:1;width:36px;height:42px;color:#fff;font-size:18px;line-height:42px;text-align:center;background:#001529;border-radius:0 4px 4px 0;cursor:pointer;transition:background .3s ease}.ant-layout-sider-zero-width-trigger:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;transition:all .3s;content:""}.ant-layout-sider-zero-width-trigger:hover:after{background:hsla(0,0%,100%,.1)}.ant-layout-sider-zero-width-trigger-right{left:-36px;border-radius:4px 0 0 4px}.ant-layout-sider-light{background:#fff}.ant-layout-sider-light .ant-layout-sider-trigger{color:rgba(0,10,36,.85);background:#fff}.ant-layout-sider-light .ant-layout-sider-zero-width-trigger{color:rgba(0,10,36,.85);background:#fff}.ant-layout-rtl{direction:rtl}.ant-pro-basicLayout{display:flex;flex-direction:column;width:100%;min-height:100%}.ant-pro-basicLayout .ant-layout-header.ant-pro-fixed-header{position:fixed;top:0}.ant-pro-basicLayout .ant-layout-header.ant-pro-header-light{background:#fff}.ant-pro-basicLayout-content{position:relative;margin:24px}.ant-pro-basicLayout-content .ant-pro-page-container{margin:-24px -24px 0}.ant-pro-basicLayout-content-disable-margin{margin:0}.ant-pro-basicLayout-content-disable-margin .ant-pro-page-container{margin:0}.ant-pro-basicLayout-content>.ant-layout{max-height:100%}.ant-pro-basicLayout .ant-pro-basicLayout-is-children.ant-pro-basicLayout-fix-siderbar{height:100vh;overflow:hidden;transform:rotate(0)}.ant-pro-basicLayout .ant-pro-basicLayout-has-header .tech-page-container{height:calc(100vh - 48px)}.ant-pro-basicLayout .ant-pro-basicLayout-has-header .ant-pro-basicLayout-is-children.ant-pro-basicLayout-has-header .tech-page-container{height:calc(100vh - 96px)}.ant-pro-basicLayout .ant-pro-basicLayout-has-header .ant-pro-basicLayout-is-children.ant-pro-basicLayout-has-header .ant-pro-basicLayout-is-children{min-height:calc(100vh - 48px)}.ant-pro-basicLayout .ant-pro-basicLayout-has-header .ant-pro-basicLayout-is-children.ant-pro-basicLayout-has-header .ant-pro-basicLayout-is-children.ant-pro-basicLayout-fix-siderbar{height:calc(100vh - 48px)}.ant-pro-fixed-header{z-index:9;width:100%}.ant-pro-fixed-header-action{transition:width .3s cubic-bezier(.645,.045,.355,1)}.ant-pro-header-realDark{box-shadow:0 2px 8px 0 rgba(0,0,0,.65)}.ant-pro-global-header{position:relative;display:flex;align-items:center;height:100%;padding:0 16px;background:#fff;box-shadow:0 1px 4px rgba(0,21,41,.08)}.ant-pro-global-header>*{height:100%}.ant-pro-global-header-collapsed-button{display:flex;align-items:center;margin-left:16px;font-size:20px}.ant-pro-global-header-layout-mix{background-color:#001529}.ant-pro-global-header-layout-mix .ant-pro-global-header-logo h1{color:#fff}.ant-pro-global-header-layout-mix .anticon{color:#fff}.ant-pro-global-header-logo{position:relative;overflow:hidden}.ant-pro-global-header-logo a{display:flex;align-items:center;height:100%}.ant-pro-global-header-logo a img{height:28px}.ant-pro-global-header-logo a h1{height:32px;margin:0 0 0 12px;color:#296df3;font-weight:600;font-size:18px;line-height:32px}.ant-pro-global-header-logo-rtl a h1{margin:0 12px 0 0}.ant-pro-global-header-menu .anticon{margin-right:8px}.ant-pro-global-header-menu .ant-dropdown-menu-item{min-width:160px}.ant-pro-global-header .dark{height:48px}.ant-pro-global-header .dark .action{color:hsla(0,0%,100%,.85)}.ant-pro-global-header .dark .action>i{color:hsla(0,0%,100%,.85)}.ant-pro-global-header .dark .action.opened,.ant-pro-global-header .dark .action:hover{background:#296df3}.ant-pro-global-header .dark .action .ant-badge{color:hsla(0,0%,100%,.85)}.ant-pro-sider{position:relative;background-color:#001529;border-right:0}.ant-pro-sider .ant-menu{background:transparent}.ant-pro-sider.ant-layout-sider-light .ant-menu-item a{color:rgba(0,10,36,.85)}.ant-pro-sider.ant-layout-sider-light .ant-menu-item-selected a,.ant-pro-sider.ant-layout-sider-light .ant-menu-item a:hover{color:#296df3}.ant-pro-sider-logo{position:relative;display:flex;align-items:center;padding:16px;cursor:pointer;transition:padding .3s cubic-bezier(.645,.045,.355,1)}.ant-pro-sider-logo>a{display:flex;align-items:center;justify-content:center;min-height:32px}.ant-pro-sider-logo img{display:inline-block;height:32px;vertical-align:middle}.ant-pro-sider-logo h1{display:inline-block;height:32px;margin:0 0 0 12px;color:#fff;font-weight:600;font-size:18px;line-height:32px;vertical-align:middle;animation:pro-layout-title-hide .3s}.ant-pro-sider-extra{margin-bottom:16px;padding:0 16px}.ant-pro-sider-extra-no-logo{margin-top:16px}.ant-pro-sider-menu{position:relative;z-index:10;min-height:100%;box-shadow:2px 0 6px rgba(0,21,41,.35)}.ant-pro-sider .ant-layout-sider-children{display:flex;flex-direction:column;height:100%}.ant-pro-sider .ant-layout-sider-children ::-webkit-scrollbar{width:6px;height:6px}.ant-pro-sider .ant-layout-sider-children ::-webkit-scrollbar-track{background:hsla(0,0%,100%,.15);border-radius:3px;box-shadow:inset 0 0 5px rgba(37,37,37,.05)}.ant-pro-sider .ant-layout-sider-children ::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.2);border-radius:3px;box-shadow:inset 0 0 5px hsla(0,0%,100%,.05)}.ant-pro-sider.ant-layout-sider-collapsed .ant-menu-inline-collapsed{width:48px}.ant-pro-sider.ant-layout-sider-collapsed .ant-pro-sider-logo{padding:16px 8px}.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed{position:fixed;top:0;left:0;z-index:100;height:100%;overflow:auto;overflow-x:hidden;box-shadow:2px 0 8px 0 rgba(29,35,41,.05)}.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed>.ant-menu-root :not(.ant-pro-sider-link-menu){height:calc(100vh - 48px);overflow-y:auto}.ant-pro-sider-light{background-color:#fff;box-shadow:2px 0 8px 0 rgba(29,35,41,.05)}.ant-pro-sider-light .ant-layout-sider-children ::-webkit-scrollbar-track{background:rgba(0,0,0,.06);border-radius:3px;box-shadow:inset 0 0 5px rgba(0,21,41,.05)}.ant-pro-sider-light .ant-layout-sider-children ::-webkit-scrollbar-thumb{background:rgba(0,0,0,.12);border-radius:3px;box-shadow:inset 0 0 5px rgba(0,21,41,.05)}.ant-pro-sider-light .ant-pro-sider-logo h1{color:#296df3}.ant-pro-sider-light .ant-menu-light{border-right-color:transparent}.ant-pro-sider-light .ant-pro-sider-collapsed-button{border-top:1px solid #f0f0f0}.ant-pro-sider-icon{width:14px;vertical-align:baseline}.ant-pro-sider-links{width:100%}.ant-pro-sider-links ul.ant-menu-root{height:auto}.ant-pro-sider-collapsed-button{border-top:1px solid rgba(0,0,0,.25)}.ant-pro-sider-collapsed-button .anticon{font-size:16px}.ant-pro-sider .top-nav-menu li.ant-menu-item{height:100%;line-height:1}.ant-pro-sider .drawer .drawer-content{background:#001529}@keyframes pro-layout-title-hide{0%{display:none;opacity:0}80%{display:none;opacity:0}to{display:unset;opacity:1}}.ant-skeleton{display:table;width:100%}.ant-skeleton-header{display:table-cell;padding-right:16px;vertical-align:top}.ant-skeleton-header .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:hsla(0,0%,74.5%,.2);width:32px;height:32px;line-height:32px}.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-content{display:table-cell;width:100%;vertical-align:top}.ant-skeleton-content .ant-skeleton-title{width:100%;height:16px;background:hsla(0,0%,74.5%,.2);border-radius:4px}.ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:24px}.ant-skeleton-content .ant-skeleton-paragraph{padding:0}.ant-skeleton-content .ant-skeleton-paragraph>li{width:100%;height:16px;list-style:none;background:hsla(0,0%,74.5%,.2);border-radius:4px}.ant-skeleton-content .ant-skeleton-paragraph>li:last-child:not(:first-child):not(:nth-child(2)){width:61%}.ant-skeleton-content .ant-skeleton-paragraph>li+li{margin-top:16px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title{margin-top:12px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:28px}.ant-skeleton-round .ant-skeleton-content .ant-skeleton-paragraph>li,.ant-skeleton-round .ant-skeleton-content .ant-skeleton-title{border-radius:100px}.ant-skeleton-active .ant-skeleton-avatar,.ant-skeleton-active .ant-skeleton-button,.ant-skeleton-active .ant-skeleton-image,.ant-skeleton-active .ant-skeleton-input,.ant-skeleton-active .ant-skeleton-paragraph>li,.ant-skeleton-active .ant-skeleton-title{position:relative;z-index:0;overflow:hidden;background:transparent}.ant-skeleton-active .ant-skeleton-avatar:after,.ant-skeleton-active .ant-skeleton-button:after,.ant-skeleton-active .ant-skeleton-image:after,.ant-skeleton-active .ant-skeleton-input:after,.ant-skeleton-active .ant-skeleton-paragraph>li:after,.ant-skeleton-active .ant-skeleton-title:after{position:absolute;top:0;right:-150%;bottom:0;left:-150%;background:linear-gradient(90deg,hsla(0,0%,74.5%,.2) 25%,hsla(0,0%,50.6%,.24) 37%,hsla(0,0%,74.5%,.2) 63%);animation:ant-skeleton-loading 1.4s ease infinite;content:""}.ant-skeleton.ant-skeleton-block{width:100%}.ant-skeleton.ant-skeleton-block .ant-skeleton-button{width:100%}.ant-skeleton.ant-skeleton-block .ant-skeleton-input{width:100%}.ant-skeleton-element{display:inline-block;width:auto}.ant-skeleton-element .ant-skeleton-button{display:inline-block;vertical-align:top;background:hsla(0,0%,74.5%,.2);border-radius:4px;width:64px;min-width:64px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-square{width:32px;min-width:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-circle{width:32px;min-width:32px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-round{border-radius:32px}.ant-skeleton-element .ant-skeleton-button-lg{width:80px;min-width:80px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-square{width:40px;min-width:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-circle{width:40px;min-width:40px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-round{border-radius:40px}.ant-skeleton-element .ant-skeleton-button-sm{width:48px;min-width:48px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-square{width:24px;min-width:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-circle{width:24px;min-width:24px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-round{border-radius:24px}.ant-skeleton-element .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:hsla(0,0%,74.5%,.2);width:32px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-input{display:inline-block;vertical-align:top;background:hsla(0,0%,74.5%,.2);width:160px;min-width:160px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-input-lg{width:200px;min-width:200px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-input-sm{width:120px;min-width:120px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-image{display:flex;align-items:center;justify-content:center;vertical-align:top;background:hsla(0,0%,74.5%,.2);width:96px;height:96px;line-height:96px}.ant-skeleton-element .ant-skeleton-image.ant-skeleton-image-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-image-path{fill:#bfbfbf}.ant-skeleton-element .ant-skeleton-image-svg{width:48px;height:48px;line-height:48px;max-width:192px;max-height:192px}.ant-skeleton-element .ant-skeleton-image-svg.ant-skeleton-image-circle{border-radius:50%}@keyframes ant-skeleton-loading{0%{transform:translateX(-37.5%)}to{transform:translateX(37.5%)}}.ant-skeleton-rtl{direction:rtl}.ant-skeleton-rtl .ant-skeleton-header{padding-right:0;padding-left:16px}.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph>li,.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title{animation-name:ant-skeleton-loading-rtl}.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar{animation-name:ant-skeleton-loading-rtl}@keyframes ant-skeleton-loading-rtl{0%{background-position:0 50%}to{background-position:100% 50%}}.ant-pro-top-nav-header{position:relative;width:100%;height:100%;box-shadow:0 1px 4px 0 rgba(0,21,41,.12);transition:background .3s,width .2s}.ant-pro-top-nav-header .ant-menu{background:transparent}.ant-pro-top-nav-header.light{background-color:#fff}.ant-pro-top-nav-header.light .ant-pro-top-nav-header-logo h1{color:rgba(0,10,36,.85)}.ant-pro-top-nav-header.light .anticon{color:inherit}.ant-pro-top-nav-header-main{display:flex;height:100%;padding-left:16px}.ant-pro-top-nav-header-main-left{display:flex;min-width:192px}.ant-pro-top-nav-header .anticon{color:#fff}.ant-pro-top-nav-header-logo{position:relative;min-width:165px;height:100%;overflow:hidden}.ant-pro-top-nav-header-logo a>svg,.ant-pro-top-nav-header-logo img{display:inline-block;height:32px;vertical-align:middle}.ant-pro-top-nav-header-logo h1{display:inline-block;margin:0 0 0 12px;color:#fff;font-size:16px;vertical-align:top}.ant-pro-top-nav-header-menu{min-width:0}.ant-pro-top-nav-header-menu .ant-menu.ant-menu-horizontal{height:100%;border:none}.ant-pro-global-footer{margin:48px 0 24px;padding:0 16px;text-align:center}.ant-pro-global-footer-links{margin-bottom:8px}.ant-pro-global-footer-links a{color:rgba(0,10,36,.65);transition:all .3s}.ant-pro-global-footer-links a:not(:last-child){margin-right:40px}.ant-pro-global-footer-links a:hover{color:rgba(0,10,36,.85)}.ant-pro-global-footer-copyright{color:rgba(0,10,36,.65);font-size:14px}.ant-drawer{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;pointer-events:none}.ant-drawer-inline{position:absolute}.ant-drawer-mask{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1000;background:rgba(0,0,0,.45);pointer-events:auto}.ant-drawer-content-wrapper{position:absolute;z-index:1000;transition:all .3s}.ant-drawer-content-wrapper-hidden{display:none}.ant-drawer-left>.ant-drawer-content-wrapper{top:0;bottom:0;left:0;box-shadow:6px 0 16px -8px rgba(0,0,0,.08),9px 0 28px 0 rgba(0,0,0,.05),12px 0 48px 16px rgba(0,0,0,.03)}.ant-drawer-right>.ant-drawer-content-wrapper{top:0;right:0;bottom:0;box-shadow:-6px 0 16px -8px rgba(0,0,0,.08),-9px 0 28px 0 rgba(0,0,0,.05),-12px 0 48px 16px rgba(0,0,0,.03)}.ant-drawer-top>.ant-drawer-content-wrapper{top:0;right:0;left:0;box-shadow:0 6px 16px -8px rgba(0,0,0,.08),0 9px 28px 0 rgba(0,0,0,.05),0 12px 48px 16px rgba(0,0,0,.03)}.ant-drawer-bottom>.ant-drawer-content-wrapper{right:0;bottom:0;left:0;box-shadow:0 -6px 16px -8px rgba(0,0,0,.08),0 -9px 28px 0 rgba(0,0,0,.05),0 -12px 48px 16px rgba(0,0,0,.03)}.ant-drawer-content{width:100%;height:100%;overflow:auto;background:#fff;pointer-events:auto}.ant-drawer-wrapper-body{display:flex;flex-direction:column;width:100%;height:100%}.ant-drawer-header{display:flex;flex:0 1;align-items:center;padding:16px 24px;font-size:16px;line-height:22px;border-bottom:1px solid #f0f0f0}.ant-drawer-header-title{display:flex;flex:1 1;align-items:center;min-width:0;min-height:0}.ant-drawer-extra{flex:none}.ant-drawer-close{display:inline-block;margin-right:12px;color:rgba(0,10,36,.65);font-weight:700;font-size:16px;font-style:normal;line-height:1;text-align:center;text-transform:none;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;transition:color .3s;text-rendering:auto}.ant-drawer-close:focus,.ant-drawer-close:hover{color:rgba(0,0,0,.75);text-decoration:none}.ant-drawer-title{flex:1 1;margin:0;color:rgba(0,10,36,.85);font-weight:500;font-size:16px;line-height:22px}.ant-drawer-body{flex:1 1;min-width:0;min-height:0;padding:24px;overflow:auto}.ant-drawer-footer{flex-shrink:0;padding:10px 16px;border-top:1px solid #f0f0f0}.panel-motion-appear-start,.panel-motion-enter-start,.panel-motion-leave-start{transition:none}.panel-motion-appear-active,.panel-motion-enter-active,.panel-motion-leave-active{transition:all .3s}.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-enter-active,.ant-drawer-mask-motion-leave-active{transition:all .3s}.ant-drawer-mask-motion-appear,.ant-drawer-mask-motion-enter{opacity:0}.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-enter-active{opacity:1}.ant-drawer-mask-motion-leave{opacity:1}.ant-drawer-mask-motion-leave-active{opacity:0}.ant-drawer-panel-motion-left-appear-start,.ant-drawer-panel-motion-left-enter-start,.ant-drawer-panel-motion-left-leave-start{transition:none}.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-enter-active,.ant-drawer-panel-motion-left-leave-active{transition:all .3s}.ant-drawer-panel-motion-left-appear-start,.ant-drawer-panel-motion-left-enter-start{transform:translateX(-100%)!important}.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-enter-active{transform:translateX(0)}.ant-drawer-panel-motion-left-leave{transform:translateX(0)}.ant-drawer-panel-motion-left-leave-active{transform:translateX(-100%)}.ant-drawer-panel-motion-right-appear-start,.ant-drawer-panel-motion-right-enter-start,.ant-drawer-panel-motion-right-leave-start{transition:none}.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-enter-active,.ant-drawer-panel-motion-right-leave-active{transition:all .3s}.ant-drawer-panel-motion-right-appear-start,.ant-drawer-panel-motion-right-enter-start{transform:translateX(100%)!important}.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-enter-active{transform:translateX(0)}.ant-drawer-panel-motion-right-leave{transform:translateX(0)}.ant-drawer-panel-motion-right-leave-active{transform:translateX(100%)}.ant-drawer-panel-motion-top-appear-start,.ant-drawer-panel-motion-top-enter-start,.ant-drawer-panel-motion-top-leave-start{transition:none}.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-enter-active,.ant-drawer-panel-motion-top-leave-active{transition:all .3s}.ant-drawer-panel-motion-top-appear-start,.ant-drawer-panel-motion-top-enter-start{transform:translateY(-100%)!important}.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-enter-active{transform:translateY(0)}.ant-drawer-panel-motion-top-leave{transform:translateY(0)}.ant-drawer-panel-motion-top-leave-active{transform:translateY(-100%)}.ant-drawer-panel-motion-bottom-appear-start,.ant-drawer-panel-motion-bottom-enter-start,.ant-drawer-panel-motion-bottom-leave-start{transition:none}.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-enter-active,.ant-drawer-panel-motion-bottom-leave-active{transition:all .3s}.ant-drawer-panel-motion-bottom-appear-start,.ant-drawer-panel-motion-bottom-enter-start{transform:translateY(100%)!important}.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-enter-active{transform:translateY(0)}.ant-drawer-panel-motion-bottom-leave{transform:translateY(0)}.ant-drawer-panel-motion-bottom-leave-active{transform:translateY(100%)}.ant-drawer-rtl{direction:rtl}.ant-drawer-rtl .ant-drawer-close{margin-right:0;margin-left:12px}.leftAvatar___jXS-t{display:flex;align-items:center;justify-content:center;width:40px;height:40px;margin-right:6px;color:var(--chat-blue);font-size:40px;background-color:#fff;border-radius:50%}.message___ov1VS .domainName___2DDh-{margin-bottom:2px;margin-left:4px;color:var(--text-color);font-weight:500}.message___ov1VS .messageContent___5HLSN{display:flex;align-items:flex-start}.message___ov1VS .messageContent___5HLSN .messageBody___3Dtin{width:100%}.message___ov1VS .messageContent___5HLSN .messageBody___3Dtin .messageTopBar___9O3GQ{max-width:90%;margin:0 16px;padding:12px 0 8px;overflow:hidden;color:var(--text-color-third);font-size:13px;white-space:nowrap;text-overflow:ellipsis;background-color:#fff}.message___ov1VS .messageContent___5HLSN .avatar___1wuzv{margin-right:4px}.message___ov1VS .messageContent___5HLSN .bubble___2rE8_{box-sizing:border-box;min-width:1px;max-width:100%;padding:8px 16px 10px;background:hsla(0,0%,100%,.8);border:1px solid transparent;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.14),0 0 2px rgba(0,0,0,.12)}.message___ov1VS .messageContent___5HLSN .bubble___2rE8_ .text___2A2KV{line-height:1.5;white-space:pre-wrap;overflow-wrap:break-word;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.message___ov1VS .messageContent___5HLSN .bubble___2rE8_ .textMsg___1Cagn{padding:12px 0 5px}.message___ov1VS .messageContent___5HLSN .bubble___2rE8_ .topBar___3SUj7{display:flex;align-items:center;max-width:100%;padding:4px 0 8px;overflow-x:auto;color:var(--text-color);font-weight:500;font-size:14px;white-space:nowrap;border-bottom:1px solid rgba(0,0,0,.03)}.message___ov1VS .messageContent___5HLSN .bubble___2rE8_ .topBar___3SUj7 .messageTitleWrapper___2nkrf{display:flex;align-items:center}.message___ov1VS .messageContent___5HLSN .bubble___2rE8_ .topBar___3SUj7 .messageTitle___nEuXN{display:flex;align-items:center;color:var(--text-color);font-weight:500;font-size:14px;white-space:nowrap}.message___ov1VS.right___3ioPO .messageContent___5HLSN{flex-direction:row-reverse}.message___ov1VS.right___3ioPO .messageContent___5HLSN .bubble___2rE8_{float:right;box-sizing:border-box;padding:8px 16px;color:#fff;font-size:16px;background:linear-gradient(81.62deg,#2870ea 8.72%,var(--chat-blue) 85.01%);border:1px solid transparent;box-shadow:0 2px 4px rgba(0,0,0,.14),0 0 2px rgba(0,0,0,.12)}.message___ov1VS.right___3ioPO .messageContent___5HLSN .bubble___2rE8_ .text___2A2KV::selection{background:#1ba1f7}.textBubble___ihT3i{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.listenerSex___37uVn{padding-bottom:24px}.listenerArea___3pK5q{padding-top:24px;padding-bottom:12px}.typing___1luaU{width:100%;padding:0 5px}.typing___1luaU .ant-spin-dot{width:100%}.messageEntityName___258Wt{cursor:pointer}.messageEntityName___258Wt:hover{color:var(--primary-color)}.messageAvatar___1Ywwf{margin-right:8px}.dataHolder___u5qE_{position:relative}.subTitle___ck_64{margin-left:20px;color:var(--text-color-third);font-weight:400;font-size:12px}.subTitle___ck_64 .subTitleValue___k_e_P{margin-left:6px;color:var(--text-color);font-size:13px}.avatarPopover___3r5u1 .ant-popover-inner-content{padding:3px 4px!important}.moreOption___1NGcC{display:flex;align-items:center;margin-top:10px;color:var(--text-color-fourth);font-size:12px}.moreOption___1NGcC .selectOthers___2xwh0{color:var(--text-color);cursor:pointer}.moreOption___1NGcC .selectOthers___2xwh0:hover{color:var(--primary-color)}.moreOption___1NGcC .indicators___1jqCq{display:flex;align-items:center;margin-left:12px;grid-column-gap:12px;-webkit-column-gap:12px;column-gap:12px}.moreOption___1NGcC .indicators___1jqCq .indicator___YCPxh{cursor:pointer}.moreOption___1NGcC .indicators___1jqCq .indicator___YCPxh:hover{color:var(--primary-color)}.contentName___211iT{max-width:350px;white-space:nowrap;text-overflow:ellipsis}.aggregatorIndicator___2E_41{color:var(--text-color);font-weight:500;font-size:20px}.entityId___1lmAV{display:flex;align-items:center;margin-left:12px;grid-column-gap:4px;-webkit-column-gap:4px;column-gap:4px}.entityId___1lmAV .idTitle___1jx5q{color:var(--text-color-fourth);font-size:12px}.entityId___1lmAV .idValue___bpiF6{color:var(--text-color-fourth);font-size:13px;cursor:pointer}.entityId___1lmAV .idValue___bpiF6:hover{color:var(--primary-color)}.typingBubble___Q0Uqn{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.quote___3zRsl{margin-bottom:4px;padding:0 4px 0 6px;color:var(--border-color-base);font-size:13px;border-left:4px solid var(--border-color-base);border-top-left-radius:2px;border-bottom-left-radius:2px}.filterSection___22RNx{display:flex;align-items:center;color:var(--text-color-secondary);font-weight:400;font-size:13px}.filterSection___22RNx .filterItem___2-VW0{padding:2px 12px;color:var(--text-color-secondary);background-color:#edf2f2;border-radius:13px}.noPermissionTip___3KH3I{display:flex;align-items:center}.tip___CcPGG{margin-left:6px;color:var(--text-color-third)}.infoBar___2hqGy{display:flex;flex-wrap:wrap;align-items:center;margin-top:20px;grid-column-gap:20px;-webkit-column-gap:20px;column-gap:20px}.mainEntityInfo___7_pqq{display:flex;flex-wrap:wrap;align-items:center;font-size:13px;grid-column-gap:20px;-webkit-column-gap:20px;column-gap:20px}.mainEntityInfo___7_pqq .infoItem___2NwSz{display:flex;align-items:center}.mainEntityInfo___7_pqq .infoItem___2NwSz .infoName___3W7On{color:var(--text-color-fourth)}.mainEntityInfo___7_pqq .infoItem___2NwSz .infoValue___3egki{color:var(--text-color-secondary)}.textWrapper___H89lc{display:flex;align-items:center}.textWrapper___H89lc.rightTextWrapper___yPncY{justify-content:flex-end}.textWrapper___H89lc .rightAvatar___E5la8{margin-left:6px}.chat___2o_TX{height:calc(100vh - 48px)!important;overflow:hidden;background:linear-gradient(180deg,rgba(23,74,228,0) 29.44%,rgba(23,74,228,.06)),linear-gradient(90deg,#f3f3f7,#f3f3f7 20%,#ebf0f9 60%,#f3f3f7 80%,#f3f3f7)}.chat___2o_TX .chatSection___3V3NJ{display:flex;width:100vw!important;height:calc(100vh - 48px)!important;overflow:hidden}.chat___2o_TX .chatApp___16BaS{display:flex;flex-direction:column;width:calc(100vw - 225px);height:calc(100vh - 48px);padding-left:20px;color:rgba(0,0,0,.87)}.chat___2o_TX .chatApp___16BaS .emptyHolder___563Et{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.chat___2o_TX .chatApp___16BaS .navBar___1-YkL{position:relative;z-index:10;display:flex;align-items:center;height:40px;padding:0 10px;background:rgb(243 243 243);border-bottom:1px solid #e4e4e4}.chat___2o_TX .chatApp___16BaS .navBar___1-YkL .conversationNameWrapper___367aO{display:flex;align-items:center}.chat___2o_TX .chatApp___16BaS .navBar___1-YkL .conversationNameWrapper___367aO .conversationName___2BsWh{padding:4px 12px;color:var(--text-color-third)!important;font-size:14px!important;border-radius:4px;cursor:pointer}.chat___2o_TX .chatApp___16BaS .navBar___1-YkL .conversationNameWrapper___367aO .conversationName___2BsWh .editIcon___2Od_L{margin-left:10px;color:var(--text-color-fourth);font-size:14px}.chat___2o_TX .chatApp___16BaS .navBar___1-YkL .conversationNameWrapper___367aO .conversationName___2BsWh:hover{background-color:rgba(0,0,0,.03)}.chat___2o_TX .chatApp___16BaS .navBar___1-YkL .conversationNameWrapper___367aO .divider___n3Yfc{width:1px;height:16px;margin-right:4px;margin-left:12px;background-color:var(--text-color-fourth)}.chat___2o_TX .chatApp___16BaS .navBar___1-YkL .conversationInput___2iw0p{width:300px;color:var(--text-color-third)!important;font-size:14px!important;cursor:default!important}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk{display:flex;flex:1 1;height:100%}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi{display:flex;flex-direction:column;width:100%}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy{position:relative;display:flex;flex:1 1;flex-direction:column;min-height:0;overflow-x:hidden;overflow-y:scroll}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS{display:flex;flex-direction:column;padding:20px 20px 90px 4px;grid-row-gap:10px;row-gap:10px}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf{display:flex;flex-direction:column;grid-row-gap:10px;row-gap:10px}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-table-row{background-color:#fff}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-table-tbody>tr>td{border-bottom:1px solid #f0f0f0;transition:background .2s,border-color .2s}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ss-chat-table-even-row{background-color:#fbfbfb}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-table-wrapper .ant-table-pagination{display:flex;flex-wrap:wrap;justify-content:center;margin:16px 0;grid-row-gap:8px;row-gap:8px}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination .ant-pagination-next,.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination .ant-pagination-prev{display:inline-block;min-width:32px;height:32px;color:rgba(0,0,0,.88);line-height:32px;text-align:center;vertical-align:middle;list-style:none;border-radius:6px;cursor:pointer;transition:all .2s}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination .ant-pagination-next .ant-pagination-item-link,.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination .ant-pagination-prev .ant-pagination-item-link{display:block;width:100%;height:100%;padding:0;font-size:12px;text-align:center;background-color:transparent;border:1px solid transparent;border-radius:6px;outline:none;transition:border .2s}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination-jump-next .ant-pagination-item-link,.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination-jump-prev .ant-pagination-item-link{display:inline-block;min-width:32px;height:32px;color:rgba(0,0,0,.25);line-height:32px;text-align:center;vertical-align:middle;list-style:none;border-radius:6px;cursor:pointer;transition:all .2s}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination-options{display:inline-block;margin-left:16px;vertical-align:middle}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination .ant-pagination-item{display:inline-block;min-width:32px;height:32px;line-height:30px;text-align:center;vertical-align:middle;list-style:none;background-color:transparent;border:1px solid transparent;border-radius:6px;outline:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-margin-end:8px;margin-inline-end:8px}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination .ant-pagination-item-active{font-weight:600;background-color:#fff;border-color:var(--primary-color)}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS .messageItem___rC6Pf .ant-pagination{box-sizing:border-box;margin:0;padding:0;color:#606266;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum","tnum"}.chat___2o_TX .chatApp___16BaS .chatBody___3Qpmk .chatContent___1jNIi .messageContainer___3pMiy .messageList___2A2BS.miniProgramLoading___1Rlat{position:absolute;bottom:10000px;width:100%}.chat___2o_TX.mobile___1qe49{height:100%!important}.chat___2o_TX.mobile___1qe49 .chatSection___3V3NJ{width:100%!important;height:100%!important}.chat___2o_TX.mobile___1qe49 .conversation___2jDz6{height:100%!important}.chat___2o_TX.mobile___1qe49 .chatApp___16BaS{width:calc(100% - 225px)!important;height:100%!important;margin-top:0!important}.mobile___1qe49 .messageList___2A2BS{padding:20px 12px!important}.keyword___1PW1c{color:var(--primary-color)}.messageItem___rC6Pf{margin-top:12px}.messageTime___gu9g5{display:flex;align-items:center;justify-content:center;margin-top:20px;color:#999}.modules___1xbPz{display:flex;align-items:center;height:40px;padding:8px 12px;overflow:hidden;background:#f3f3f3;border-top:1px solid #e4e4e4}.modules___1xbPz .moduleType___3WYlk{width:80px;margin-right:12px}.modules___1xbPz .moduleType___3WYlk .ant-select-selection-item{font-size:13px!important}.modules___1xbPz .moduleType___3WYlk .ant-select-selection-item,.modules___1xbPz .moduleType___3WYlk .ant-select-single:not(.ant-select-customize-input) .ant-select-selector:after{line-height:28px!important}.modules___1xbPz .moduleType___3WYlk .moduleSelect___1DUPs{box-sizing:border-box;width:100%;height:100%;color:rgba(0,0,0,.87);word-break:break-all;border:0;border-radius:20px}.modules___1xbPz .moduleType___3WYlk .moduleSelect___1DUPs .ant-select-selector{height:30px!important;border:1px solid var(--primary-color)!important;border-radius:20px!important}.modules___1xbPz .moduleType___3WYlk .moduleSelect___1DUPs .ant-select-arrow{margin-top:-4px!important}.modules___1xbPz .example___qyX62{margin-right:4px;color:var(--text-color-secondary);font-size:13px}.modules___1xbPz button[ant-click-animating-without-extra-node]:after{border:0;opacity:0;animation:0 1 ease 0 normal none}.modules___1xbPz .iconBtn{color:rgba(0,0,0,.4)!important;background:transparent!important;border:0!important;box-shadow:none!important}.modules___1xbPz .iconBtn .scrollerControlIcon{font-size:12px}.modules___1xbPz .iconBtn:hover{background:rgba(0,0,0,.05)!important}.modules___1xbPz .modulesInner___P640o{display:flex;flex:1 1;overflow-x:scroll;overflow-y:hidden;scroll-behavior:smooth}.modules___1xbPz .modulesInner___P640o::-webkit-scrollbar{display:none}.modules___1xbPz .modulesInner___P640o .moduleItem___2feFt{position:relative;display:flex;align-items:center;margin-left:8px;padding:4px 11px;color:var(--text-color);font-weight:500;font-size:14px;line-height:1.43;white-space:nowrap;background:#fff;border:1px solid #fff;border-radius:20px;cursor:pointer;transition:.15s ease-in-out}.modules___1xbPz .modulesInner___P640o .moduleItem___2feFt:hover{background:rgba(0,0,0,.05);background-clip:padding-box;border-color:rgba(0,0,0,.05)}.modules___1xbPz .modulesInner___P640o .moduleItem___2feFt:first-child{margin-left:0!important}.modules___1xbPz .modulesInner___P640o .moduleItem___2feFt.activeModuleItem___1SjFq{color:var(--primary-color)!important;border-color:var(--primary-color)!important}.modules___1xbPz .modulesInner___P640o .moduleItem___2feFt.cmdItem___3JNP5{font-weight:400;font-size:13px}.optGroupBar___1SdJW{display:flex;align-items:center;justify-content:space-between}.optGroupBar___1SdJW.recentSearchBar___2_mds{padding-top:2px;padding-bottom:5px}.optGroupBar___1SdJW .optGroupTitle___37RjX{color:#333;font-weight:500;font-size:14px}.optGroupBar___1SdJW .recentSearch___22cDn{color:#999;font-weight:400}.optGroupBar___1SdJW .clearSearch___39Pk0{color:#666;font-size:14px;cursor:pointer}.recentSearchOption___56Zak{padding-left:12px!important}.recentSearchOption___56Zak .optionItem___22ifI{display:flex;align-items:center;justify-content:space-between;width:483px}.recentSearchOption___56Zak .optionItem___22ifI .removeRecentMsg___yYKh3{display:none;cursor:pointer}.recentSearchOption___56Zak:hover .removeRecentMsg___yYKh3{display:block}.addConversation___1YYx4{display:flex;align-items:center;margin-left:12px;color:var(--text-color-third);grid-column-gap:4px;-webkit-column-gap:4px;column-gap:4px;cursor:pointer}.addConversation___1YYx4:hover{color:var(--primary-color)}.loadingWords___26Axn{padding:40px 1px}.associateWordsOption___10StO{display:flex;align-items:center;grid-column-gap:10px;-webkit-column-gap:10px;column-gap:10px}.associateWordsOption___10StO .optionContent___1Pc9x{display:flex;align-items:center;min-width:450px;grid-column-gap:10px;-webkit-column-gap:10px;column-gap:10px}.associateWordsOption___10StO .indicatorItem___2Lzo1{min-width:180px}.associateWordsOption___10StO .indicatorItem___2Lzo1 .indicatorLabel___1bkQZ{color:var(--text-color-fourth);font-size:12px}.associateWordsOption___10StO .indicatorItem___2Lzo1 .indicatorValue___2pnTF{margin-left:4px;font-size:13px}.autoCompleteDropdown___wKtOT{width:650px!important;min-width:650px!important;border-radius:10px}.autoCompleteDropdown___wKtOT .ant-select-item{min-height:36px!important;line-height:26px!important}.autoCompleteDropdown___wKtOT .ant-select-item:not(:first-child):hover{background:#f5f5f5!important}.recommendItemTitle___2SKwT{margin-right:14px;padding:4px 12px;background-color:var(--deep-background);border-radius:2px}.refeshQuestions___JlEIo{cursor:pointer}.refeshQuestions___JlEIo .reloadIcon___1X8ml{margin-right:4px}.recommendQuestions___gp_hT{display:flex;align-items:center;justify-content:center;width:54px;height:100%;color:var(--text-color-fourth);font-size:18px;background:hsla(0,0%,100%,.2);cursor:pointer}.recommendQuestions___gp_hT:hover{background:hsla(0,0%,100%,.1)}.currentTool___1xNWw{position:relative;display:flex;align-items:center;justify-content:center;padding:0 24px 0 2px;color:var(--chat-blue);font-weight:500;font-size:16px;background:hsla(0,0%,100%,.2)}.currentTool___1xNWw .removeTool___2WRZr{position:absolute;top:14px;right:6px;color:var(--text-color-fifth);font-size:14px;cursor:pointer}.currentTool___1xNWw .removeTool___2WRZr:hover{color:var(--chat-blue)}.associateOption___3ZTe2{display:flex;align-items:center}.associateOptionAvatar___gUvQm{width:32px;margin-right:10px}.optionContent___1Pc9x{min-width:330px}.optionIndicator___2oWOU{min-width:120px;margin-left:4px;color:var(--text-color-fourth);font-size:12px}.messageLoading___Jehct{margin-top:30px;padding:0 20px}.ss-chat-recommend-options .ant-table-thead .ant-table-cell{padding:8px!important}.ss-chat-recommend-options .ant-table-tbody .ant-table-cell{padding:8px!important;border-bottom:1px solid #f0f0f0}.context___1OCN5{display:flex;flex-direction:column;padding:20px 10px 0;border-top:1px solid #ccc}.context___1OCN5 .title___10GWP{margin-bottom:22px;color:var(--text-color);font-size:16px;line-height:24px}.context___1OCN5 .desc___2-XNh{max-height:350px;margin-top:10px;margin-bottom:10px;overflow-y:auto;color:var(--text-color-third);font-size:13px;line-height:22px}.context___1OCN5 .field___3ejkW{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:10px}.context___1OCN5 .field___3ejkW.columnLayout___2QKpP{flex-direction:column}.context___1OCN5 .field___3ejkW .avatar___1OcVc{margin-right:8px}.context___1OCN5 .filterSection___8VuXR{margin-bottom:12px}.context___1OCN5 .fieldName___dMy48{margin-right:6px;color:var(--text-color);font-weight:500}.context___1OCN5 .fieldValue___1y7ju{max-width:150px;overflow:hidden;color:var(--text-color);white-space:nowrap;text-overflow:ellipsis}.context___1OCN5 .filterValues___R7F2_{display:flex;flex-wrap:wrap;margin-top:10px;font-size:13px;grid-column-gap:4px;-webkit-column-gap:4px;column-gap:4px;grid-row-gap:4px;row-gap:4px}.context___1OCN5 .filterValues___R7F2_ .filterItem___3xOt7{padding:2px 12px;color:var(--text-color-secondary);background-color:var(--body-background);border-radius:13px}.introduction___Vdv6R{display:flex;flex-direction:column;padding:0 10px 4px}.introduction___Vdv6R .title___3aeP6{margin-bottom:22px;color:var(--text-color);font-size:16px;line-height:24px}.introduction___Vdv6R .desc___dHm5v{max-height:350px;margin-top:10px;margin-bottom:10px;overflow-y:auto;color:var(--text-color-third);font-size:13px;line-height:22px}.introduction___Vdv6R .field___2Vyao{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:10px}.introduction___Vdv6R .field___2Vyao.columnLayout___NXrLE{flex-direction:column}.introduction___Vdv6R .field___2Vyao .avatar___1s50O{margin-right:8px}.introduction___Vdv6R .fieldName___2gYEr{margin-right:6px;color:var(--text-color);font-weight:500}.introduction___Vdv6R .fieldValue___3xcNc{color:var(--text-color)}.introduction___Vdv6R .fieldValue___3xcNc.switchField___3C4t3{cursor:pointer}.introduction___Vdv6R .fieldValue___3xcNc.dimensionFieldValue___39Yua{max-width:90px}.introduction___Vdv6R .fieldValue___3xcNc.mainNameFieldValue___OkzeS{max-width:90px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.rightSection___wiZOa{width:225px;height:calc(100vh - 48px);margin-right:12px;padding-bottom:10px;overflow-y:auto}.rightSection___wiZOa .entityInfo___8Dh7w{margin-top:20px}.rightSection___wiZOa .entityInfo___8Dh7w .topInfo___Wm-Z0{margin-bottom:20px;color:var(--text-color-third);font-weight:500;font-size:14px}.domains___2sNnl{margin-top:20px;padding-top:20px;border-top:1px solid #ccc}.domains___2sNnl .titleBar___18_Sr{display:flex;align-items:center;grid-column-gap:4px;-webkit-column-gap:4px;column-gap:4px;margin-bottom:12px}.domains___2sNnl .titleBar___18_Sr .title___vvDMG{padding-left:10px;color:var(--text-color);font-size:16px;line-height:24px}.domains___2sNnl .titleBar___18_Sr .subTitle___3Gezp{font-size:13px;color:var(--text-color-third)}.domains___2sNnl .domainList___2Fuun{display:flex;flex-direction:column}.domains___2sNnl .domainList___2Fuun .domainItem___-Hg_Y{display:flex;align-items:center;padding:4px 10px;font-size:14px;cursor:pointer}.domains___2sNnl .domainList___2Fuun .domainItem___-Hg_Y .loadingIcon___w5OHT{margin-right:6px;color:var(--text-color-fifth);font-size:12px}.domains___2sNnl .domainList___2Fuun .domainItem___-Hg_Y .arrowIcon___1yO5n{margin-right:6px;color:var(--text-color-fifth);font-size:12px}.domains___2sNnl .domainList___2Fuun .domainItem___-Hg_Y .domainIcon___3OrVz{margin-right:6px;color:var(--blue)}.domains___2sNnl .domainList___2Fuun .domainItem___-Hg_Y .domainName___3FZaC{width:150px;overflow:hidden;color:var(--text-color-secondary);white-space:nowrap;text-overflow:ellipsis}.domains___2sNnl .domainList___2Fuun .domainItem___-Hg_Y:hover{background-color:var(--link-hover-bg-color)}.domains___2sNnl .domainList___2Fuun .domainItem___-Hg_Y.activeDomainItem___2i6vy{background-color:var(--link-hover-bg-color)}.conversationHistory___2WtWO{position:absolute;top:0;left:0;z-index:10;display:flex;flex-direction:column;width:100%;height:calc(100vh - 78px);overflow:hidden;background:#f3f3f7;border-right:1px solid var(--border-color-base)}.conversationHistory___2WtWO .header___1iZH9{display:flex;align-items:center;justify-content:space-between;height:50px;padding:0 16px;border-bottom:1px solid #e8e8e8}.conversationHistory___2WtWO .header___1iZH9 .headerTitle___1Yrqd{color:var(--text-color);font-weight:500;font-size:16px}.conversationHistory___2WtWO .header___1iZH9 .headerClose___2UOzu{color:var(--text-color-third);font-size:16px;cursor:pointer}.conversationHistory___2WtWO .header___1iZH9 .headerClose___2UOzu:hover{color:var(--chat-blue)}.conversationHistory___2WtWO .conversationContent___vJ9FX{flex:1 1;overflow:auto}.conversationHistory___2WtWO .conversationContent___vJ9FX .conversationItem___dWcaS{display:flex;flex-direction:column;align-items:flex-start;padding:8px 16px;border-bottom:1px solid var(--border-color-base-bg-5);cursor:pointer;grid-row-gap:2px;row-gap:2px}.conversationHistory___2WtWO .conversationContent___vJ9FX .conversationItem___dWcaS:hover{background:var(--light-blue-background)}.conversationHistory___2WtWO .conversationContent___vJ9FX .conversationItem___dWcaS .conversationName___3nzQA{width:170px;overflow:hidden;color:var(--text-color);font-size:14px;white-space:nowrap;text-overflow:ellipsis}.conversationHistory___2WtWO .conversationContent___vJ9FX .conversationItem___dWcaS .conversationTime___e9w2j{color:var(--text-color-third);font-size:13px}.ant-modal{color:rgba(0,10,36,.85)}.ant-modal-title{color:rgba(0,10,36,.85)}.ant-modal-content{border-radius:4px}.ant-modal-close{color:rgba(0,10,36,.65)}.ant-modal-header{color:rgba(0,10,36,.85);border-radius:4px 4px 0 0}.ant-modal-footer{border-radius:0 0 4px 4px}.ant-modal-confirm-body .ant-modal-confirm-title{color:rgba(0,10,36,.85)}.ant-modal-confirm-body .ant-modal-confirm-content{color:rgba(0,10,36,.85)}.ant-modal-confirm-error .ant-modal-confirm-body>.anticon{color:#ef4872}.ant-modal-confirm-confirm .ant-modal-confirm-body>.anticon,.ant-modal-confirm-warning .ant-modal-confirm-body>.anticon{color:#ffb924}.ant-modal-confirm-info .ant-modal-confirm-body>.anticon{color:#296df3}.ant-modal-confirm-success .ant-modal-confirm-body>.anticon{color:#26c992}.ant-input-affix-wrapper{position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:rgba(0,10,36,.85);font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;transition:all .3s;display:inline-flex}.ant-input-affix-wrapper::-webkit-input-placeholder{color:#bfbfbf;-webkit-user-select:none;user-select:none}.ant-input-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper::-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-affix-wrapper:hover{border-color:#4e86f5;border-right-width:1px}.ant-input-rtl .ant-input-affix-wrapper:hover{border-right-width:0;border-left-width:1px!important}.ant-input-affix-wrapper-focused,.ant-input-affix-wrapper:focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-input-rtl .ant-input-affix-wrapper-focused,.ant-input-rtl .ant-input-affix-wrapper:focus{border-right-width:0;border-left-width:1px!important}.ant-input-affix-wrapper-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper-borderless,.ant-input-affix-wrapper-borderless-disabled,.ant-input-affix-wrapper-borderless-focused,.ant-input-affix-wrapper-borderless:focus,.ant-input-affix-wrapper-borderless:hover,.ant-input-affix-wrapper-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-affix-wrapper{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-affix-wrapper-lg{padding:6.5px 11px;font-size:16px}.ant-input-affix-wrapper-sm{padding:0 7px}.ant-input-affix-wrapper-rtl{direction:rtl}.ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-color:#4e86f5;border-right-width:1px;z-index:1}.ant-input-rtl .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-right-width:0;border-left-width:1px!important}.ant-input-search-with-button .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{z-index:0}.ant-input-affix-wrapper-focused,.ant-input-affix-wrapper:focus{z-index:1}.ant-input-affix-wrapper-disabled .ant-input[disabled]{background:hsla(0,0%,100%,0)}.ant-input-affix-wrapper>.ant-input{font-size:inherit;border:none;outline:none}.ant-input-affix-wrapper>.ant-input:focus{box-shadow:none!important}.ant-input-affix-wrapper>.ant-input:not(textarea){padding:0}.ant-input-affix-wrapper:before{display:inline-block;width:0;visibility:hidden;content:"\a0"}.ant-input-prefix,.ant-input-suffix{display:flex;flex:none;align-items:center}.ant-input-prefix>:not(:last-child),.ant-input-suffix>:not(:last-child){margin-right:8px}.ant-input-show-count-suffix{color:rgba(0,10,36,.65)}.ant-input-show-count-has-suffix{margin-right:2px}.ant-input-prefix{margin-right:4px}.ant-input-suffix{margin-left:4px}.ant-input-clear-icon,.anticon.ant-input-clear-icon{margin:0;color:rgba(0,0,0,.25);font-size:12px;vertical-align:-1px;cursor:pointer;transition:color .3s}.ant-input-clear-icon:hover,.anticon.ant-input-clear-icon:hover{color:rgba(0,10,36,.65)}.ant-input-clear-icon:active,.anticon.ant-input-clear-icon:active{color:rgba(0,10,36,.85)}.ant-input-clear-icon-hidden,.anticon.ant-input-clear-icon-hidden{visibility:hidden}.ant-input-clear-icon-has-suffix,.anticon.ant-input-clear-icon-has-suffix{margin:0 4px}.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn{padding:0}.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn .ant-input-clear-icon{position:absolute;top:8px;right:8px;z-index:1}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#ef4872}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus{border-color:#fc7492;box-shadow:0 0 0 2px rgba(239,72,114,.2);border-right-width:1px;outline:0}.ant-input-status-error .ant-input-prefix{color:#ef4872}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#ffb924}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus{border-color:#ffcc4d;box-shadow:0 0 0 2px rgba(255,185,36,.2);border-right-width:1px;outline:0}.ant-input-status-warning .ant-input-prefix{color:#ffb924}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#ef4872}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus{border-color:#fc7492;box-shadow:0 0 0 2px rgba(239,72,114,.2);border-right-width:1px;outline:0}.ant-input-affix-wrapper-status-error .ant-input-prefix{color:#ef4872}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#ffb924}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus{border-color:#ffcc4d;box-shadow:0 0 0 2px rgba(255,185,36,.2);border-right-width:1px;outline:0}.ant-input-affix-wrapper-status-warning .ant-input-prefix{color:#ffb924}.ant-input-textarea-status-error.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-success.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-validating.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-warning.ant-input-textarea-has-feedback .ant-input{padding-right:24px}.ant-input-group-wrapper-status-error .ant-input-group-addon{color:#ef4872;border-color:#ef4872}.ant-input-group-wrapper-status-warning .ant-input-group-addon{color:#ffb924;border-color:#ffb924}.ant-input{box-sizing:border-box;margin:0;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:rgba(0,10,36,.85);font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;transition:all .3s}.ant-input::-webkit-input-placeholder{color:#bfbfbf;-webkit-user-select:none;user-select:none}.ant-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input::-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input:placeholder-shown{text-overflow:ellipsis}.ant-input:hover{border-color:#4e86f5;border-right-width:1px}.ant-input-rtl .ant-input:hover{border-right-width:0;border-left-width:1px!important}.ant-input-focused,.ant-input:focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-input-rtl .ant-input-focused,.ant-input-rtl .ant-input:focus{border-right-width:0;border-left-width:1px!important}.ant-input-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-borderless,.ant-input-borderless-disabled,.ant-input-borderless-focused,.ant-input-borderless:focus,.ant-input-borderless:hover,.ant-input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-lg{padding:6.5px 11px;font-size:16px}.ant-input-sm{padding:0 7px}.ant-input-rtl{direction:rtl}.ant-input-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:table;width:100%;border-collapse:separate;border-spacing:0}.ant-input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.ant-input-group>[class*=col-]{padding-right:8px}.ant-input-group>[class*=col-]:last-child{padding-right:0}.ant-input-group-addon,.ant-input-group-wrap,.ant-input-group>.ant-input{display:table-cell}.ant-input-group-addon:not(:first-child):not(:last-child),.ant-input-group-wrap:not(:first-child):not(:last-child),.ant-input-group>.ant-input:not(:first-child):not(:last-child){border-radius:0}.ant-input-group-addon,.ant-input-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-group-wrap>*{display:block!important}.ant-input-group .ant-input{float:left;width:100%;margin-bottom:0;text-align:inherit}.ant-input-group .ant-input:focus{z-index:1;border-right-width:1px}.ant-input-group .ant-input:hover{z-index:1;border-right-width:1px}.ant-input-search-with-button .ant-input-group .ant-input:hover{z-index:0}.ant-input-group-addon{position:relative;padding:0 11px;color:rgba(0,10,36,.85);font-weight:400;font-size:14px;text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:4px;transition:all .3s}.ant-input-group-addon .ant-select{margin:-5px -11px}.ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid transparent;box-shadow:none}.ant-input-group-addon .ant-select-focused .ant-select-selector,.ant-input-group-addon .ant-select-open .ant-select-selector{color:#296df3}.ant-input-group-addon .ant-cascader-picker{margin:-9px -12px;background-color:transparent}.ant-input-group-addon .ant-cascader-picker .ant-cascader-input{text-align:left;border:0;box-shadow:none}.ant-input-group-addon:first-child,.ant-input-group>.ant-input:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group-addon:first-child .ant-select .ant-select-selector,.ant-input-group>.ant-input:first-child .ant-select .ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:first-child) .ant-input{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:last-child) .ant-input{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group-addon:first-child{border-right:0}.ant-input-group-addon:last-child{border-left:0}.ant-input-group-addon:last-child,.ant-input-group>.ant-input:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group-addon:last-child .ant-select .ant-select-selector,.ant-input-group>.ant-input:last-child .ant-select .ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group-lg .ant-input,.ant-input-group-lg>.ant-input-group-addon{padding:6.5px 11px;font-size:16px}.ant-input-group-sm .ant-input,.ant-input-group-sm>.ant-input-group-addon{padding:0 7px}.ant-input-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child){border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-input-group .ant-input-affix-wrapper:not(:first-child),.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group.ant-input-group-compact{display:block}.ant-input-group.ant-input-group-compact:before{display:table;content:""}.ant-input-group.ant-input-group-compact:after{display:table;clear:both;content:""}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):focus{z-index:1}.ant-input-group.ant-input-group-compact>*{display:inline-block;float:none;vertical-align:top;border-radius:0}.ant-input-group.ant-input-group-compact>.ant-input-affix-wrapper,.ant-input-group.ant-input-group-compact>.ant-input-number-affix-wrapper,.ant-input-group.ant-input-group-compact>.ant-picker-range{display:inline-flex}.ant-input-group.ant-input-group-compact>:not(:last-child){margin-right:-1px;border-right-width:1px}.ant-input-group.ant-input-group-compact .ant-input{float:none}.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector{border-right-width:1px;border-radius:0}.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:hover{z-index:1}.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:focus{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select-focused{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-arrow{z-index:1}.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>:last-child{border-right-width:1px;border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper{border-radius:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:4px 0 0 4px}.ant-input-group-rtl .ant-input-group-addon:first-child,.ant-input-group>.ant-input-rtl:first-child{border-radius:0 4px 4px 0}.ant-input-group-rtl .ant-input-group-addon:first-child{border-right:1px solid #d9d9d9;border-left:0}.ant-input-group-rtl .ant-input-group-addon:last-child{border-right:0;border-left:1px solid #d9d9d9;border-radius:4px 0 0 4px}.ant-input-group-rtl.ant-input-group-addon:last-child,.ant-input-group-rtl.ant-input-group>.ant-input:last-child{border-radius:4px 0 0 4px}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:first-child){border-radius:4px 0 0 4px}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-radius:0 4px 4px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>:not(:last-child){margin-right:0;margin-left:-1px;border-left-width:1px}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>:first-child{border-radius:0 4px 4px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>:last-child{border-left-width:1px;border-radius:4px 0 0 4px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl+.ant-input-group-wrapper-rtl{margin-right:-1px;margin-left:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:0 4px 4px 0}.ant-input-group-wrapper{display:inline-block;width:100%;text-align:start;vertical-align:top}.ant-input-password-icon.anticon{color:rgba(0,10,36,.65);cursor:pointer;transition:all .3s}.ant-input-password-icon.anticon:hover{color:rgba(0,0,0,.85)}.ant-input[type=color]{height:32px}.ant-input[type=color].ant-input-lg{height:40px}.ant-input[type=color].ant-input-sm{height:24px;padding-top:3px;padding-bottom:3px}.ant-input-textarea-show-count>.ant-input{height:100%}.ant-input-textarea-show-count:after{float:right;color:rgba(0,10,36,.65);white-space:nowrap;content:attr(data-count);pointer-events:none}.ant-input-textarea-show-count.ant-input-textarea-in-form-item:after{margin-bottom:-22px}.ant-input-textarea-suffix{position:absolute;top:0;right:11px;bottom:0;z-index:1;display:inline-flex;align-items:center;margin:auto}.ant-input-compact-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl){margin-right:-1px}.ant-input-compact-item:not(.ant-input-compact-last-item).ant-input-compact-item-rtl{margin-left:-1px}.ant-input-compact-item:active,.ant-input-compact-item:focus,.ant-input-compact-item:hover{z-index:2}.ant-input-compact-item[disabled]{z-index:0}.ant-input-compact-item:not(.ant-input-compact-first-item):not(.ant-input-compact-last-item).ant-input{border-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-first-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-last-item:not(.ant-input-compact-first-item):not(.ant-input-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-first-item:not(.ant-input-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-last-item:not(.ant-input-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input:focus,.ant-input-search .ant-input:hover{border-color:#4e86f5}.ant-input-search .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#4e86f5}.ant-input-search .ant-input-affix-wrapper{border-radius:0}.ant-input-search .ant-input-lg{line-height:1.5713}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child{left:-1px;padding:0;border:0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button{padding-top:0;padding-bottom:0;border-radius:0 4px 4px 0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary){color:rgba(0,10,36,.65)}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary).ant-btn-loading:before{top:0;right:0;bottom:0;left:0}.ant-input-search-button{height:32px}.ant-input-search-button:focus,.ant-input-search-button:hover{z-index:1}.ant-input-search-large .ant-input-search-button{height:40px}.ant-input-search-small .ant-input-search-button{height:24px}.ant-input-search.ant-input-compact-item:not(.ant-input-compact-item-rtl):not(.ant-input-compact-last-item) .ant-input-group-addon .ant-input-search-button{margin-right:-1px;border-radius:0}.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input,.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input-affix-wrapper{border-radius:0}.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:active,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:focus,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:hover,.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:active,.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:focus,.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:hover,.ant-input-search.ant-input-compact-item>.ant-input:active,.ant-input-search.ant-input-compact-item>.ant-input:focus,.ant-input-search.ant-input-compact-item>.ant-input:hover{z-index:2}.ant-input-search.ant-input-compact-item>.ant-input-affix-wrapper-focused{z-index:2}.ant-input-search.ant-input-compact-item-rtl:not(.ant-input-compact-last-item) .ant-input-group-addon:last-child .ant-input-search-button{margin-left:-1px;border-radius:0}.ant-input-group-wrapper-rtl{direction:rtl}.ant-input-group-rtl{direction:rtl}.ant-input-affix-wrapper.ant-input-affix-wrapper-rtl>input.ant-input{border:none;outline:none}.ant-input-affix-wrapper-rtl .ant-input-prefix{margin:0 0 0 4px}.ant-input-affix-wrapper-rtl .ant-input-suffix{margin:0 4px 0 0}.ant-input-textarea-rtl{direction:rtl}.ant-input-textarea-rtl.ant-input-textarea-show-count:after{text-align:left}.ant-input-affix-wrapper-rtl .ant-input-clear-icon-has-suffix{margin-right:0;margin-left:4px}.ant-input-affix-wrapper-rtl .ant-input-clear-icon{right:auto;left:8px}.ant-input-search-rtl{direction:rtl}.ant-input-search-rtl .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search-rtl .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#d9d9d9}.ant-input-search-rtl .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover,.ant-input-search-rtl .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover{border-left-color:#4e86f5}.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper-focused,.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper:hover{border-right-color:#4e86f5}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon:last-child{right:-1px;left:auto}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button{border-radius:4px 0 0 4px}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.ant-input{height:32px}.ant-input-lg{height:40px}.ant-input-sm{height:24px}.ant-input-affix-wrapper>input.ant-input{height:auto}}.ant-form-item .ant-input-number+.ant-form-text{margin-left:8px}.ant-form-inline{display:flex;flex-wrap:wrap}.ant-form-inline .ant-form-item{flex:none;flex-wrap:nowrap;margin-right:16px;margin-bottom:0}.ant-form-inline .ant-form-item-with-help{margin-bottom:24px}.ant-form-inline .ant-form-item>.ant-form-item-control,.ant-form-inline .ant-form-item>.ant-form-item-label{display:inline-block;vertical-align:top}.ant-form-inline .ant-form-item>.ant-form-item-label{flex:none}.ant-form-inline .ant-form-item .ant-form-text{display:inline-block}.ant-form-inline .ant-form-item .ant-form-item-has-feedback{display:inline-block}.ant-form-horizontal .ant-form-item-label{flex-grow:0}.ant-form-horizontal .ant-form-item-control{flex:1 1;min-width:0}.ant-form-horizontal .ant-form-item-label[class$="-24"]+.ant-form-item-control,.ant-form-horizontal .ant-form-item-label[class*="-24 "]+.ant-form-item-control{min-width:unset}.ant-form-vertical .ant-form-item-row{flex-direction:column}.ant-form-vertical .ant-form-item-label>label{height:auto}.ant-form-vertical .ant-form-item .ant-form-item-control{width:100%}.ant-col-24.ant-form-item-label,.ant-col-xl-24.ant-form-item-label,.ant-form-vertical .ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:normal;text-align:left}.ant-col-24.ant-form-item-label>label,.ant-col-xl-24.ant-form-item-label>label,.ant-form-vertical .ant-form-item-label>label{margin:0}.ant-col-24.ant-form-item-label>label:after,.ant-col-xl-24.ant-form-item-label>label:after,.ant-form-vertical .ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-24.ant-form-item-label,.ant-form-rtl.ant-col-xl-24.ant-form-item-label,.ant-form-rtl.ant-form-vertical .ant-form-item-label{text-align:right}@media (max-width:575px){.ant-form-item .ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:normal;text-align:left}.ant-form-item .ant-form-item-label>label{margin:0}.ant-form-item .ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-form-item .ant-form-item-label{text-align:right}.ant-form .ant-form-item{flex-wrap:wrap}.ant-form .ant-form-item .ant-form-item-control,.ant-form .ant-form-item .ant-form-item-label{flex:0 0 100%;max-width:100%}.ant-col-xs-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:normal;text-align:left}.ant-col-xs-24.ant-form-item-label>label{margin:0}.ant-col-xs-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xs-24.ant-form-item-label{text-align:right}}@media (max-width:767px){.ant-col-sm-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:normal;text-align:left}.ant-col-sm-24.ant-form-item-label>label{margin:0}.ant-col-sm-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-sm-24.ant-form-item-label{text-align:right}}@media (max-width:991px){.ant-col-md-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:normal;text-align:left}.ant-col-md-24.ant-form-item-label>label{margin:0}.ant-col-md-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-md-24.ant-form-item-label{text-align:right}}@media (max-width:1199px){.ant-col-lg-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:normal;text-align:left}.ant-col-lg-24.ant-form-item-label>label{margin:0}.ant-col-lg-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-lg-24.ant-form-item-label{text-align:right}}@media (max-width:1599px){.ant-col-xl-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:normal;text-align:left}.ant-col-xl-24.ant-form-item-label>label{margin:0}.ant-col-xl-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xl-24.ant-form-item-label{text-align:right}}.ant-form-item-explain-error{color:#ef4872}.ant-form-item-explain-warning{color:#ffb924}.ant-form-item-has-feedback .ant-switch{margin:2px 0 4px}.ant-form-item-has-warning .ant-form-item-split{color:#ffb924}.ant-form-item-has-error .ant-form-item-split{color:#ef4872}.ant-form{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum"}.ant-form legend{display:block;width:100%;margin-bottom:20px;padding:0;color:rgba(0,10,36,.65);font-size:16px;line-height:inherit;border:0;border-bottom:1px solid #d9d9d9}.ant-form label{font-size:14px}.ant-form input[type=search]{box-sizing:border-box}.ant-form input[type=checkbox],.ant-form input[type=radio]{line-height:normal}.ant-form input[type=file]{display:block}.ant-form input[type=range]{display:block;width:100%}.ant-form select[multiple],.ant-form select[size]{height:auto}.ant-form input[type=checkbox]:focus,.ant-form input[type=file]:focus,.ant-form input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.ant-form output{display:block;padding-top:15px;color:rgba(0,10,36,.85);font-size:14px;line-height:1.5715}.ant-form .ant-form-text{display:inline-block;padding-right:8px}.ant-form-small .ant-form-item-label>label{height:24px}.ant-form-small .ant-form-item-control-input{min-height:24px}.ant-form-large .ant-form-item-label>label{height:40px}.ant-form-large .ant-form-item-control-input{min-height:40px}.ant-form-item{box-sizing:border-box;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";margin:0 0 24px;vertical-align:top}.ant-form-item-with-help{transition:none}.ant-form-item-hidden,.ant-form-item-hidden.ant-row{display:none}.ant-form-item-label{display:inline-block;flex-grow:0;overflow:hidden;white-space:nowrap;text-align:right;vertical-align:middle}.ant-form-item-label-left{text-align:left}.ant-form-item-label-wrap{overflow:unset;line-height:1.3215em;white-space:unset}.ant-form-item-label>label{position:relative;display:inline-flex;align-items:center;max-width:100%;height:32px;color:rgba(0,10,36,.85);font-size:14px}.ant-form-item-label>label>.anticon{font-size:14px;vertical-align:top}.ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{display:inline-block;margin-right:4px;color:#ef4872;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.ant-form-hide-required-mark .ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{display:none}.ant-form-item-label>label .ant-form-item-optional{display:inline-block;margin-left:4px;color:rgba(0,10,36,.65)}.ant-form-hide-required-mark .ant-form-item-label>label .ant-form-item-optional{display:none}.ant-form-item-label>label .ant-form-item-tooltip{color:rgba(0,10,36,.65);cursor:help;-webkit-writing-mode:horizontal-tb;-ms-writing-mode:lr-tb;writing-mode:horizontal-tb;-webkit-margin-start:4px;margin-inline-start:4px}.ant-form-item-label>label:after{content:":";position:relative;top:-.5px;margin:0 8px 0 2px}.ant-form-item-label>label.ant-form-item-no-colon:after{content:" "}.ant-form-item-control{display:flex;flex-direction:column;flex-grow:1}.ant-form-item-control:first-child:not([class^=ant-col-]):not([class*=" ant-col-"]){width:100%}.ant-form-item-control-input{position:relative;display:flex;align-items:center;min-height:32px}.ant-form-item-control-input-content{flex:auto;max-width:100%}.ant-form-item-explain,.ant-form-item-extra{clear:both;color:rgba(0,10,36,.65);font-size:14px;line-height:1.5715;transition:color .3s cubic-bezier(.215,.61,.355,1);padding-top:0}.ant-form-item-explain-connected{width:100%}.ant-form-item-extra{min-height:24px}.ant-form-item-with-help .ant-form-item-explain{height:auto;opacity:1}.ant-form-item-feedback-icon{font-size:14px;text-align:center;visibility:visible;animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);pointer-events:none}.ant-form-item-feedback-icon-success{color:#26c992}.ant-form-item-feedback-icon-error{color:#ef4872}.ant-form-item-feedback-icon-warning{color:#ffb924}.ant-form-item-feedback-icon-validating{color:#296df3}.ant-show-help{transition:opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-show-help-appear,.ant-show-help-enter{opacity:0}.ant-show-help-appear-active,.ant-show-help-enter-active{opacity:1}.ant-show-help-leave{opacity:1}.ant-show-help-leave-active{opacity:0}.ant-show-help-item{overflow:hidden;transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-appear,.ant-show-help-item-enter{transform:translateY(-5px);opacity:0}.ant-show-help-item-appear-active,.ant-show-help-item-enter-active{transform:translateY(0);opacity:1}.ant-show-help-item-leave{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1),transform .2s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-leave-active{transform:translateY(-5px)}@keyframes diffZoomIn1{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes diffZoomIn2{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes diffZoomIn3{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}.ant-form-rtl{direction:rtl}.ant-form-rtl .ant-form-item-label{text-align:left}.ant-form-rtl .ant-form-item-label>label.ant-form-item-required:before{margin-right:0;margin-left:4px}.ant-form-rtl .ant-form-item-label>label:after{margin:0 2px 0 8px}.ant-form-rtl .ant-form-item-label>label .ant-form-item-optional{margin-right:4px;margin-left:0}.ant-col-rtl .ant-form-item-control:first-child{width:100%}.ant-form-rtl .ant-form-item-has-feedback .ant-input{padding-right:11px;padding-left:24px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix{padding-right:11px;padding-left:18px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input{padding:0}.ant-form-rtl .ant-form-item-has-feedback .ant-input-number-affix-wrapper .ant-input-number{padding:0}.ant-form-rtl .ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix{right:auto;left:28px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-number{padding-left:18px}.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-clear{right:auto;left:32px}.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-selection-selected-value{padding-right:0;padding-left:42px}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-arrow{margin-right:0;margin-left:19px}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-clear{right:auto;left:32px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker{padding-right:11px;padding-left:29.2px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker-large{padding-right:11px;padding-left:29.2px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker-small{padding-right:7px;padding-left:25.2px}.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon{right:auto;left:0}.ant-form-rtl.ant-form-inline .ant-form-item{margin-right:0;margin-left:16px}.ant-row{display:flex;flex-flow:row wrap;min-width:0}.ant-row:after,.ant-row:before{display:flex}.ant-row-no-wrap{flex-wrap:nowrap}.ant-row-start{justify-content:flex-start}.ant-row-center{justify-content:center}.ant-row-end{justify-content:flex-end}.ant-row-space-between{justify-content:space-between}.ant-row-space-around{justify-content:space-around}.ant-row-space-evenly{justify-content:space-evenly}.ant-row-top{align-items:flex-start}.ant-row-middle{align-items:center}.ant-row-bottom{align-items:flex-end}.ant-col{position:relative;max-width:100%;min-height:1px}.ant-col-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-push-24{left:100%}.ant-col-pull-24{right:100%}.ant-col-offset-24{margin-left:100%}.ant-col-order-24{order:24}.ant-col-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-push-23{left:95.83333333%}.ant-col-pull-23{right:95.83333333%}.ant-col-offset-23{margin-left:95.83333333%}.ant-col-order-23{order:23}.ant-col-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-push-22{left:91.66666667%}.ant-col-pull-22{right:91.66666667%}.ant-col-offset-22{margin-left:91.66666667%}.ant-col-order-22{order:22}.ant-col-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-push-21{left:87.5%}.ant-col-pull-21{right:87.5%}.ant-col-offset-21{margin-left:87.5%}.ant-col-order-21{order:21}.ant-col-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-push-20{left:83.33333333%}.ant-col-pull-20{right:83.33333333%}.ant-col-offset-20{margin-left:83.33333333%}.ant-col-order-20{order:20}.ant-col-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-push-19{left:79.16666667%}.ant-col-pull-19{right:79.16666667%}.ant-col-offset-19{margin-left:79.16666667%}.ant-col-order-19{order:19}.ant-col-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-push-18{left:75%}.ant-col-pull-18{right:75%}.ant-col-offset-18{margin-left:75%}.ant-col-order-18{order:18}.ant-col-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-push-17{left:70.83333333%}.ant-col-pull-17{right:70.83333333%}.ant-col-offset-17{margin-left:70.83333333%}.ant-col-order-17{order:17}.ant-col-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-push-16{left:66.66666667%}.ant-col-pull-16{right:66.66666667%}.ant-col-offset-16{margin-left:66.66666667%}.ant-col-order-16{order:16}.ant-col-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-push-15{left:62.5%}.ant-col-pull-15{right:62.5%}.ant-col-offset-15{margin-left:62.5%}.ant-col-order-15{order:15}.ant-col-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-push-14{left:58.33333333%}.ant-col-pull-14{right:58.33333333%}.ant-col-offset-14{margin-left:58.33333333%}.ant-col-order-14{order:14}.ant-col-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-push-13{left:54.16666667%}.ant-col-pull-13{right:54.16666667%}.ant-col-offset-13{margin-left:54.16666667%}.ant-col-order-13{order:13}.ant-col-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-push-12{left:50%}.ant-col-pull-12{right:50%}.ant-col-offset-12{margin-left:50%}.ant-col-order-12{order:12}.ant-col-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-push-11{left:45.83333333%}.ant-col-pull-11{right:45.83333333%}.ant-col-offset-11{margin-left:45.83333333%}.ant-col-order-11{order:11}.ant-col-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-push-10{left:41.66666667%}.ant-col-pull-10{right:41.66666667%}.ant-col-offset-10{margin-left:41.66666667%}.ant-col-order-10{order:10}.ant-col-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-push-9{left:37.5%}.ant-col-pull-9{right:37.5%}.ant-col-offset-9{margin-left:37.5%}.ant-col-order-9{order:9}.ant-col-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-push-8{left:33.33333333%}.ant-col-pull-8{right:33.33333333%}.ant-col-offset-8{margin-left:33.33333333%}.ant-col-order-8{order:8}.ant-col-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-push-7{left:29.16666667%}.ant-col-pull-7{right:29.16666667%}.ant-col-offset-7{margin-left:29.16666667%}.ant-col-order-7{order:7}.ant-col-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-push-6{left:25%}.ant-col-pull-6{right:25%}.ant-col-offset-6{margin-left:25%}.ant-col-order-6{order:6}.ant-col-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-push-5{left:20.83333333%}.ant-col-pull-5{right:20.83333333%}.ant-col-offset-5{margin-left:20.83333333%}.ant-col-order-5{order:5}.ant-col-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-push-4{left:16.66666667%}.ant-col-pull-4{right:16.66666667%}.ant-col-offset-4{margin-left:16.66666667%}.ant-col-order-4{order:4}.ant-col-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-push-3{left:12.5%}.ant-col-pull-3{right:12.5%}.ant-col-offset-3{margin-left:12.5%}.ant-col-order-3{order:3}.ant-col-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-push-2{left:8.33333333%}.ant-col-pull-2{right:8.33333333%}.ant-col-offset-2{margin-left:8.33333333%}.ant-col-order-2{order:2}.ant-col-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-push-1{left:4.16666667%}.ant-col-pull-1{right:4.16666667%}.ant-col-offset-1{margin-left:4.16666667%}.ant-col-order-1{order:1}.ant-col-0{display:none}.ant-col-offset-0{margin-left:0}.ant-col-order-0{order:0}.ant-col-offset-0.ant-col-rtl{margin-right:0}.ant-col-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}.ant-col-xs-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xs-push-24{left:100%}.ant-col-xs-pull-24{right:100%}.ant-col-xs-offset-24{margin-left:100%}.ant-col-xs-order-24{order:24}.ant-col-xs-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xs-push-23{left:95.83333333%}.ant-col-xs-pull-23{right:95.83333333%}.ant-col-xs-offset-23{margin-left:95.83333333%}.ant-col-xs-order-23{order:23}.ant-col-xs-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xs-push-22{left:91.66666667%}.ant-col-xs-pull-22{right:91.66666667%}.ant-col-xs-offset-22{margin-left:91.66666667%}.ant-col-xs-order-22{order:22}.ant-col-xs-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xs-push-21{left:87.5%}.ant-col-xs-pull-21{right:87.5%}.ant-col-xs-offset-21{margin-left:87.5%}.ant-col-xs-order-21{order:21}.ant-col-xs-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xs-push-20{left:83.33333333%}.ant-col-xs-pull-20{right:83.33333333%}.ant-col-xs-offset-20{margin-left:83.33333333%}.ant-col-xs-order-20{order:20}.ant-col-xs-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xs-push-19{left:79.16666667%}.ant-col-xs-pull-19{right:79.16666667%}.ant-col-xs-offset-19{margin-left:79.16666667%}.ant-col-xs-order-19{order:19}.ant-col-xs-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xs-push-18{left:75%}.ant-col-xs-pull-18{right:75%}.ant-col-xs-offset-18{margin-left:75%}.ant-col-xs-order-18{order:18}.ant-col-xs-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xs-push-17{left:70.83333333%}.ant-col-xs-pull-17{right:70.83333333%}.ant-col-xs-offset-17{margin-left:70.83333333%}.ant-col-xs-order-17{order:17}.ant-col-xs-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xs-push-16{left:66.66666667%}.ant-col-xs-pull-16{right:66.66666667%}.ant-col-xs-offset-16{margin-left:66.66666667%}.ant-col-xs-order-16{order:16}.ant-col-xs-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xs-push-15{left:62.5%}.ant-col-xs-pull-15{right:62.5%}.ant-col-xs-offset-15{margin-left:62.5%}.ant-col-xs-order-15{order:15}.ant-col-xs-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xs-push-14{left:58.33333333%}.ant-col-xs-pull-14{right:58.33333333%}.ant-col-xs-offset-14{margin-left:58.33333333%}.ant-col-xs-order-14{order:14}.ant-col-xs-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xs-push-13{left:54.16666667%}.ant-col-xs-pull-13{right:54.16666667%}.ant-col-xs-offset-13{margin-left:54.16666667%}.ant-col-xs-order-13{order:13}.ant-col-xs-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xs-push-12{left:50%}.ant-col-xs-pull-12{right:50%}.ant-col-xs-offset-12{margin-left:50%}.ant-col-xs-order-12{order:12}.ant-col-xs-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xs-push-11{left:45.83333333%}.ant-col-xs-pull-11{right:45.83333333%}.ant-col-xs-offset-11{margin-left:45.83333333%}.ant-col-xs-order-11{order:11}.ant-col-xs-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xs-push-10{left:41.66666667%}.ant-col-xs-pull-10{right:41.66666667%}.ant-col-xs-offset-10{margin-left:41.66666667%}.ant-col-xs-order-10{order:10}.ant-col-xs-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xs-push-9{left:37.5%}.ant-col-xs-pull-9{right:37.5%}.ant-col-xs-offset-9{margin-left:37.5%}.ant-col-xs-order-9{order:9}.ant-col-xs-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xs-push-8{left:33.33333333%}.ant-col-xs-pull-8{right:33.33333333%}.ant-col-xs-offset-8{margin-left:33.33333333%}.ant-col-xs-order-8{order:8}.ant-col-xs-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xs-push-7{left:29.16666667%}.ant-col-xs-pull-7{right:29.16666667%}.ant-col-xs-offset-7{margin-left:29.16666667%}.ant-col-xs-order-7{order:7}.ant-col-xs-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xs-push-6{left:25%}.ant-col-xs-pull-6{right:25%}.ant-col-xs-offset-6{margin-left:25%}.ant-col-xs-order-6{order:6}.ant-col-xs-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xs-push-5{left:20.83333333%}.ant-col-xs-pull-5{right:20.83333333%}.ant-col-xs-offset-5{margin-left:20.83333333%}.ant-col-xs-order-5{order:5}.ant-col-xs-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xs-push-4{left:16.66666667%}.ant-col-xs-pull-4{right:16.66666667%}.ant-col-xs-offset-4{margin-left:16.66666667%}.ant-col-xs-order-4{order:4}.ant-col-xs-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xs-push-3{left:12.5%}.ant-col-xs-pull-3{right:12.5%}.ant-col-xs-offset-3{margin-left:12.5%}.ant-col-xs-order-3{order:3}.ant-col-xs-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xs-push-2{left:8.33333333%}.ant-col-xs-pull-2{right:8.33333333%}.ant-col-xs-offset-2{margin-left:8.33333333%}.ant-col-xs-order-2{order:2}.ant-col-xs-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xs-push-1{left:4.16666667%}.ant-col-xs-pull-1{right:4.16666667%}.ant-col-xs-offset-1{margin-left:4.16666667%}.ant-col-xs-order-1{order:1}.ant-col-xs-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xs-push-0{left:auto}.ant-col-xs-pull-0{right:auto}.ant-col-xs-offset-0{margin-left:0}.ant-col-xs-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xs-push-0.ant-col-rtl{right:auto}.ant-col-xs-pull-0.ant-col-rtl{left:auto}.ant-col-xs-offset-0.ant-col-rtl{margin-right:0}.ant-col-xs-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xs-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xs-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xs-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xs-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xs-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xs-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xs-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xs-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xs-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xs-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xs-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xs-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xs-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xs-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xs-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xs-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xs-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xs-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xs-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xs-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xs-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xs-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xs-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xs-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xs-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xs-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xs-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xs-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xs-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xs-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xs-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xs-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xs-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xs-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xs-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xs-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xs-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xs-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xs-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xs-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xs-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xs-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xs-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xs-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xs-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xs-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xs-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xs-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xs-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xs-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xs-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xs-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xs-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xs-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xs-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xs-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xs-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xs-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xs-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xs-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xs-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xs-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xs-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xs-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xs-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xs-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xs-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xs-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xs-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xs-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xs-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}@media (min-width:576px){.ant-col-sm-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-sm-push-24{left:100%}.ant-col-sm-pull-24{right:100%}.ant-col-sm-offset-24{margin-left:100%}.ant-col-sm-order-24{order:24}.ant-col-sm-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-sm-push-23{left:95.83333333%}.ant-col-sm-pull-23{right:95.83333333%}.ant-col-sm-offset-23{margin-left:95.83333333%}.ant-col-sm-order-23{order:23}.ant-col-sm-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-sm-push-22{left:91.66666667%}.ant-col-sm-pull-22{right:91.66666667%}.ant-col-sm-offset-22{margin-left:91.66666667%}.ant-col-sm-order-22{order:22}.ant-col-sm-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-sm-push-21{left:87.5%}.ant-col-sm-pull-21{right:87.5%}.ant-col-sm-offset-21{margin-left:87.5%}.ant-col-sm-order-21{order:21}.ant-col-sm-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-sm-push-20{left:83.33333333%}.ant-col-sm-pull-20{right:83.33333333%}.ant-col-sm-offset-20{margin-left:83.33333333%}.ant-col-sm-order-20{order:20}.ant-col-sm-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-sm-push-19{left:79.16666667%}.ant-col-sm-pull-19{right:79.16666667%}.ant-col-sm-offset-19{margin-left:79.16666667%}.ant-col-sm-order-19{order:19}.ant-col-sm-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-sm-push-18{left:75%}.ant-col-sm-pull-18{right:75%}.ant-col-sm-offset-18{margin-left:75%}.ant-col-sm-order-18{order:18}.ant-col-sm-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-sm-push-17{left:70.83333333%}.ant-col-sm-pull-17{right:70.83333333%}.ant-col-sm-offset-17{margin-left:70.83333333%}.ant-col-sm-order-17{order:17}.ant-col-sm-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-sm-push-16{left:66.66666667%}.ant-col-sm-pull-16{right:66.66666667%}.ant-col-sm-offset-16{margin-left:66.66666667%}.ant-col-sm-order-16{order:16}.ant-col-sm-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-sm-push-15{left:62.5%}.ant-col-sm-pull-15{right:62.5%}.ant-col-sm-offset-15{margin-left:62.5%}.ant-col-sm-order-15{order:15}.ant-col-sm-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-sm-push-14{left:58.33333333%}.ant-col-sm-pull-14{right:58.33333333%}.ant-col-sm-offset-14{margin-left:58.33333333%}.ant-col-sm-order-14{order:14}.ant-col-sm-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-sm-push-13{left:54.16666667%}.ant-col-sm-pull-13{right:54.16666667%}.ant-col-sm-offset-13{margin-left:54.16666667%}.ant-col-sm-order-13{order:13}.ant-col-sm-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-sm-push-12{left:50%}.ant-col-sm-pull-12{right:50%}.ant-col-sm-offset-12{margin-left:50%}.ant-col-sm-order-12{order:12}.ant-col-sm-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-sm-push-11{left:45.83333333%}.ant-col-sm-pull-11{right:45.83333333%}.ant-col-sm-offset-11{margin-left:45.83333333%}.ant-col-sm-order-11{order:11}.ant-col-sm-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-sm-push-10{left:41.66666667%}.ant-col-sm-pull-10{right:41.66666667%}.ant-col-sm-offset-10{margin-left:41.66666667%}.ant-col-sm-order-10{order:10}.ant-col-sm-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-sm-push-9{left:37.5%}.ant-col-sm-pull-9{right:37.5%}.ant-col-sm-offset-9{margin-left:37.5%}.ant-col-sm-order-9{order:9}.ant-col-sm-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-sm-push-8{left:33.33333333%}.ant-col-sm-pull-8{right:33.33333333%}.ant-col-sm-offset-8{margin-left:33.33333333%}.ant-col-sm-order-8{order:8}.ant-col-sm-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-sm-push-7{left:29.16666667%}.ant-col-sm-pull-7{right:29.16666667%}.ant-col-sm-offset-7{margin-left:29.16666667%}.ant-col-sm-order-7{order:7}.ant-col-sm-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-sm-push-6{left:25%}.ant-col-sm-pull-6{right:25%}.ant-col-sm-offset-6{margin-left:25%}.ant-col-sm-order-6{order:6}.ant-col-sm-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-sm-push-5{left:20.83333333%}.ant-col-sm-pull-5{right:20.83333333%}.ant-col-sm-offset-5{margin-left:20.83333333%}.ant-col-sm-order-5{order:5}.ant-col-sm-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-sm-push-4{left:16.66666667%}.ant-col-sm-pull-4{right:16.66666667%}.ant-col-sm-offset-4{margin-left:16.66666667%}.ant-col-sm-order-4{order:4}.ant-col-sm-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-sm-push-3{left:12.5%}.ant-col-sm-pull-3{right:12.5%}.ant-col-sm-offset-3{margin-left:12.5%}.ant-col-sm-order-3{order:3}.ant-col-sm-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-sm-push-2{left:8.33333333%}.ant-col-sm-pull-2{right:8.33333333%}.ant-col-sm-offset-2{margin-left:8.33333333%}.ant-col-sm-order-2{order:2}.ant-col-sm-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-sm-push-1{left:4.16666667%}.ant-col-sm-pull-1{right:4.16666667%}.ant-col-sm-offset-1{margin-left:4.16666667%}.ant-col-sm-order-1{order:1}.ant-col-sm-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-sm-push-0{left:auto}.ant-col-sm-pull-0{right:auto}.ant-col-sm-offset-0{margin-left:0}.ant-col-sm-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-sm-push-0.ant-col-rtl{right:auto}.ant-col-sm-pull-0.ant-col-rtl{left:auto}.ant-col-sm-offset-0.ant-col-rtl{margin-right:0}.ant-col-sm-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-sm-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-sm-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-sm-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-sm-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-sm-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-sm-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-sm-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-sm-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-sm-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-sm-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-sm-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-sm-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-sm-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-sm-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-sm-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-sm-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-sm-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-sm-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-sm-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-sm-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-sm-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-sm-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-sm-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-sm-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-sm-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-sm-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-sm-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-sm-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-sm-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-sm-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-sm-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-sm-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-sm-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-sm-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-sm-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-sm-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-sm-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-sm-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-sm-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-sm-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-sm-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-sm-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-sm-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-sm-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-sm-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-sm-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-sm-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-sm-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-sm-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-sm-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-sm-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-sm-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-sm-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-sm-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-sm-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-sm-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-sm-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-sm-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-sm-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-sm-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-sm-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-sm-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-sm-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-sm-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-sm-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-sm-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-sm-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-sm-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-sm-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-sm-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-sm-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width:768px){.ant-col-md-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-md-push-24{left:100%}.ant-col-md-pull-24{right:100%}.ant-col-md-offset-24{margin-left:100%}.ant-col-md-order-24{order:24}.ant-col-md-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-md-push-23{left:95.83333333%}.ant-col-md-pull-23{right:95.83333333%}.ant-col-md-offset-23{margin-left:95.83333333%}.ant-col-md-order-23{order:23}.ant-col-md-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-md-push-22{left:91.66666667%}.ant-col-md-pull-22{right:91.66666667%}.ant-col-md-offset-22{margin-left:91.66666667%}.ant-col-md-order-22{order:22}.ant-col-md-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-md-push-21{left:87.5%}.ant-col-md-pull-21{right:87.5%}.ant-col-md-offset-21{margin-left:87.5%}.ant-col-md-order-21{order:21}.ant-col-md-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-md-push-20{left:83.33333333%}.ant-col-md-pull-20{right:83.33333333%}.ant-col-md-offset-20{margin-left:83.33333333%}.ant-col-md-order-20{order:20}.ant-col-md-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-md-push-19{left:79.16666667%}.ant-col-md-pull-19{right:79.16666667%}.ant-col-md-offset-19{margin-left:79.16666667%}.ant-col-md-order-19{order:19}.ant-col-md-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-md-push-18{left:75%}.ant-col-md-pull-18{right:75%}.ant-col-md-offset-18{margin-left:75%}.ant-col-md-order-18{order:18}.ant-col-md-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-md-push-17{left:70.83333333%}.ant-col-md-pull-17{right:70.83333333%}.ant-col-md-offset-17{margin-left:70.83333333%}.ant-col-md-order-17{order:17}.ant-col-md-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-md-push-16{left:66.66666667%}.ant-col-md-pull-16{right:66.66666667%}.ant-col-md-offset-16{margin-left:66.66666667%}.ant-col-md-order-16{order:16}.ant-col-md-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-md-push-15{left:62.5%}.ant-col-md-pull-15{right:62.5%}.ant-col-md-offset-15{margin-left:62.5%}.ant-col-md-order-15{order:15}.ant-col-md-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-md-push-14{left:58.33333333%}.ant-col-md-pull-14{right:58.33333333%}.ant-col-md-offset-14{margin-left:58.33333333%}.ant-col-md-order-14{order:14}.ant-col-md-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-md-push-13{left:54.16666667%}.ant-col-md-pull-13{right:54.16666667%}.ant-col-md-offset-13{margin-left:54.16666667%}.ant-col-md-order-13{order:13}.ant-col-md-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-md-push-12{left:50%}.ant-col-md-pull-12{right:50%}.ant-col-md-offset-12{margin-left:50%}.ant-col-md-order-12{order:12}.ant-col-md-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-md-push-11{left:45.83333333%}.ant-col-md-pull-11{right:45.83333333%}.ant-col-md-offset-11{margin-left:45.83333333%}.ant-col-md-order-11{order:11}.ant-col-md-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-md-push-10{left:41.66666667%}.ant-col-md-pull-10{right:41.66666667%}.ant-col-md-offset-10{margin-left:41.66666667%}.ant-col-md-order-10{order:10}.ant-col-md-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-md-push-9{left:37.5%}.ant-col-md-pull-9{right:37.5%}.ant-col-md-offset-9{margin-left:37.5%}.ant-col-md-order-9{order:9}.ant-col-md-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-md-push-8{left:33.33333333%}.ant-col-md-pull-8{right:33.33333333%}.ant-col-md-offset-8{margin-left:33.33333333%}.ant-col-md-order-8{order:8}.ant-col-md-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-md-push-7{left:29.16666667%}.ant-col-md-pull-7{right:29.16666667%}.ant-col-md-offset-7{margin-left:29.16666667%}.ant-col-md-order-7{order:7}.ant-col-md-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-md-push-6{left:25%}.ant-col-md-pull-6{right:25%}.ant-col-md-offset-6{margin-left:25%}.ant-col-md-order-6{order:6}.ant-col-md-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-md-push-5{left:20.83333333%}.ant-col-md-pull-5{right:20.83333333%}.ant-col-md-offset-5{margin-left:20.83333333%}.ant-col-md-order-5{order:5}.ant-col-md-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-md-push-4{left:16.66666667%}.ant-col-md-pull-4{right:16.66666667%}.ant-col-md-offset-4{margin-left:16.66666667%}.ant-col-md-order-4{order:4}.ant-col-md-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-md-push-3{left:12.5%}.ant-col-md-pull-3{right:12.5%}.ant-col-md-offset-3{margin-left:12.5%}.ant-col-md-order-3{order:3}.ant-col-md-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-md-push-2{left:8.33333333%}.ant-col-md-pull-2{right:8.33333333%}.ant-col-md-offset-2{margin-left:8.33333333%}.ant-col-md-order-2{order:2}.ant-col-md-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-md-push-1{left:4.16666667%}.ant-col-md-pull-1{right:4.16666667%}.ant-col-md-offset-1{margin-left:4.16666667%}.ant-col-md-order-1{order:1}.ant-col-md-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-md-push-0{left:auto}.ant-col-md-pull-0{right:auto}.ant-col-md-offset-0{margin-left:0}.ant-col-md-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-md-push-0.ant-col-rtl{right:auto}.ant-col-md-pull-0.ant-col-rtl{left:auto}.ant-col-md-offset-0.ant-col-rtl{margin-right:0}.ant-col-md-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-md-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-md-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-md-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-md-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-md-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-md-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-md-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-md-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-md-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-md-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-md-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-md-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-md-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-md-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-md-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-md-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-md-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-md-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-md-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-md-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-md-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-md-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-md-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-md-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-md-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-md-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-md-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-md-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-md-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-md-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-md-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-md-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-md-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-md-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-md-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-md-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-md-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-md-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-md-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-md-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-md-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-md-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-md-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-md-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-md-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-md-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-md-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-md-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-md-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-md-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-md-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-md-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-md-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-md-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-md-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-md-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-md-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-md-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-md-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-md-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-md-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-md-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-md-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-md-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-md-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-md-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-md-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-md-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-md-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-md-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-md-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width:992px){.ant-col-lg-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-lg-push-24{left:100%}.ant-col-lg-pull-24{right:100%}.ant-col-lg-offset-24{margin-left:100%}.ant-col-lg-order-24{order:24}.ant-col-lg-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-lg-push-23{left:95.83333333%}.ant-col-lg-pull-23{right:95.83333333%}.ant-col-lg-offset-23{margin-left:95.83333333%}.ant-col-lg-order-23{order:23}.ant-col-lg-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-lg-push-22{left:91.66666667%}.ant-col-lg-pull-22{right:91.66666667%}.ant-col-lg-offset-22{margin-left:91.66666667%}.ant-col-lg-order-22{order:22}.ant-col-lg-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-lg-push-21{left:87.5%}.ant-col-lg-pull-21{right:87.5%}.ant-col-lg-offset-21{margin-left:87.5%}.ant-col-lg-order-21{order:21}.ant-col-lg-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-lg-push-20{left:83.33333333%}.ant-col-lg-pull-20{right:83.33333333%}.ant-col-lg-offset-20{margin-left:83.33333333%}.ant-col-lg-order-20{order:20}.ant-col-lg-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-lg-push-19{left:79.16666667%}.ant-col-lg-pull-19{right:79.16666667%}.ant-col-lg-offset-19{margin-left:79.16666667%}.ant-col-lg-order-19{order:19}.ant-col-lg-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-lg-push-18{left:75%}.ant-col-lg-pull-18{right:75%}.ant-col-lg-offset-18{margin-left:75%}.ant-col-lg-order-18{order:18}.ant-col-lg-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-lg-push-17{left:70.83333333%}.ant-col-lg-pull-17{right:70.83333333%}.ant-col-lg-offset-17{margin-left:70.83333333%}.ant-col-lg-order-17{order:17}.ant-col-lg-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-lg-push-16{left:66.66666667%}.ant-col-lg-pull-16{right:66.66666667%}.ant-col-lg-offset-16{margin-left:66.66666667%}.ant-col-lg-order-16{order:16}.ant-col-lg-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-lg-push-15{left:62.5%}.ant-col-lg-pull-15{right:62.5%}.ant-col-lg-offset-15{margin-left:62.5%}.ant-col-lg-order-15{order:15}.ant-col-lg-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-lg-push-14{left:58.33333333%}.ant-col-lg-pull-14{right:58.33333333%}.ant-col-lg-offset-14{margin-left:58.33333333%}.ant-col-lg-order-14{order:14}.ant-col-lg-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-lg-push-13{left:54.16666667%}.ant-col-lg-pull-13{right:54.16666667%}.ant-col-lg-offset-13{margin-left:54.16666667%}.ant-col-lg-order-13{order:13}.ant-col-lg-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-lg-push-12{left:50%}.ant-col-lg-pull-12{right:50%}.ant-col-lg-offset-12{margin-left:50%}.ant-col-lg-order-12{order:12}.ant-col-lg-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-lg-push-11{left:45.83333333%}.ant-col-lg-pull-11{right:45.83333333%}.ant-col-lg-offset-11{margin-left:45.83333333%}.ant-col-lg-order-11{order:11}.ant-col-lg-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-lg-push-10{left:41.66666667%}.ant-col-lg-pull-10{right:41.66666667%}.ant-col-lg-offset-10{margin-left:41.66666667%}.ant-col-lg-order-10{order:10}.ant-col-lg-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-lg-push-9{left:37.5%}.ant-col-lg-pull-9{right:37.5%}.ant-col-lg-offset-9{margin-left:37.5%}.ant-col-lg-order-9{order:9}.ant-col-lg-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-lg-push-8{left:33.33333333%}.ant-col-lg-pull-8{right:33.33333333%}.ant-col-lg-offset-8{margin-left:33.33333333%}.ant-col-lg-order-8{order:8}.ant-col-lg-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-lg-push-7{left:29.16666667%}.ant-col-lg-pull-7{right:29.16666667%}.ant-col-lg-offset-7{margin-left:29.16666667%}.ant-col-lg-order-7{order:7}.ant-col-lg-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-lg-push-6{left:25%}.ant-col-lg-pull-6{right:25%}.ant-col-lg-offset-6{margin-left:25%}.ant-col-lg-order-6{order:6}.ant-col-lg-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-lg-push-5{left:20.83333333%}.ant-col-lg-pull-5{right:20.83333333%}.ant-col-lg-offset-5{margin-left:20.83333333%}.ant-col-lg-order-5{order:5}.ant-col-lg-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-lg-push-4{left:16.66666667%}.ant-col-lg-pull-4{right:16.66666667%}.ant-col-lg-offset-4{margin-left:16.66666667%}.ant-col-lg-order-4{order:4}.ant-col-lg-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-lg-push-3{left:12.5%}.ant-col-lg-pull-3{right:12.5%}.ant-col-lg-offset-3{margin-left:12.5%}.ant-col-lg-order-3{order:3}.ant-col-lg-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-lg-push-2{left:8.33333333%}.ant-col-lg-pull-2{right:8.33333333%}.ant-col-lg-offset-2{margin-left:8.33333333%}.ant-col-lg-order-2{order:2}.ant-col-lg-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-lg-push-1{left:4.16666667%}.ant-col-lg-pull-1{right:4.16666667%}.ant-col-lg-offset-1{margin-left:4.16666667%}.ant-col-lg-order-1{order:1}.ant-col-lg-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-lg-push-0{left:auto}.ant-col-lg-pull-0{right:auto}.ant-col-lg-offset-0{margin-left:0}.ant-col-lg-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-lg-push-0.ant-col-rtl{right:auto}.ant-col-lg-pull-0.ant-col-rtl{left:auto}.ant-col-lg-offset-0.ant-col-rtl{margin-right:0}.ant-col-lg-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-lg-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-lg-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-lg-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-lg-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-lg-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-lg-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-lg-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-lg-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-lg-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-lg-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-lg-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-lg-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-lg-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-lg-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-lg-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-lg-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-lg-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-lg-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-lg-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-lg-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-lg-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-lg-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-lg-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-lg-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-lg-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-lg-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-lg-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-lg-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-lg-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-lg-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-lg-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-lg-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-lg-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-lg-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-lg-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-lg-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-lg-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-lg-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-lg-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-lg-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-lg-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-lg-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-lg-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-lg-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-lg-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-lg-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-lg-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-lg-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-lg-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-lg-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-lg-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-lg-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-lg-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-lg-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-lg-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-lg-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-lg-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-lg-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-lg-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-lg-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-lg-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-lg-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-lg-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-lg-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-lg-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-lg-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-lg-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-lg-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-lg-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-lg-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-lg-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width:1200px){.ant-col-xl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xl-push-24{left:100%}.ant-col-xl-pull-24{right:100%}.ant-col-xl-offset-24{margin-left:100%}.ant-col-xl-order-24{order:24}.ant-col-xl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xl-push-23{left:95.83333333%}.ant-col-xl-pull-23{right:95.83333333%}.ant-col-xl-offset-23{margin-left:95.83333333%}.ant-col-xl-order-23{order:23}.ant-col-xl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xl-push-22{left:91.66666667%}.ant-col-xl-pull-22{right:91.66666667%}.ant-col-xl-offset-22{margin-left:91.66666667%}.ant-col-xl-order-22{order:22}.ant-col-xl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xl-push-21{left:87.5%}.ant-col-xl-pull-21{right:87.5%}.ant-col-xl-offset-21{margin-left:87.5%}.ant-col-xl-order-21{order:21}.ant-col-xl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xl-push-20{left:83.33333333%}.ant-col-xl-pull-20{right:83.33333333%}.ant-col-xl-offset-20{margin-left:83.33333333%}.ant-col-xl-order-20{order:20}.ant-col-xl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xl-push-19{left:79.16666667%}.ant-col-xl-pull-19{right:79.16666667%}.ant-col-xl-offset-19{margin-left:79.16666667%}.ant-col-xl-order-19{order:19}.ant-col-xl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xl-push-18{left:75%}.ant-col-xl-pull-18{right:75%}.ant-col-xl-offset-18{margin-left:75%}.ant-col-xl-order-18{order:18}.ant-col-xl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xl-push-17{left:70.83333333%}.ant-col-xl-pull-17{right:70.83333333%}.ant-col-xl-offset-17{margin-left:70.83333333%}.ant-col-xl-order-17{order:17}.ant-col-xl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xl-push-16{left:66.66666667%}.ant-col-xl-pull-16{right:66.66666667%}.ant-col-xl-offset-16{margin-left:66.66666667%}.ant-col-xl-order-16{order:16}.ant-col-xl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xl-push-15{left:62.5%}.ant-col-xl-pull-15{right:62.5%}.ant-col-xl-offset-15{margin-left:62.5%}.ant-col-xl-order-15{order:15}.ant-col-xl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xl-push-14{left:58.33333333%}.ant-col-xl-pull-14{right:58.33333333%}.ant-col-xl-offset-14{margin-left:58.33333333%}.ant-col-xl-order-14{order:14}.ant-col-xl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xl-push-13{left:54.16666667%}.ant-col-xl-pull-13{right:54.16666667%}.ant-col-xl-offset-13{margin-left:54.16666667%}.ant-col-xl-order-13{order:13}.ant-col-xl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xl-push-12{left:50%}.ant-col-xl-pull-12{right:50%}.ant-col-xl-offset-12{margin-left:50%}.ant-col-xl-order-12{order:12}.ant-col-xl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xl-push-11{left:45.83333333%}.ant-col-xl-pull-11{right:45.83333333%}.ant-col-xl-offset-11{margin-left:45.83333333%}.ant-col-xl-order-11{order:11}.ant-col-xl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xl-push-10{left:41.66666667%}.ant-col-xl-pull-10{right:41.66666667%}.ant-col-xl-offset-10{margin-left:41.66666667%}.ant-col-xl-order-10{order:10}.ant-col-xl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xl-push-9{left:37.5%}.ant-col-xl-pull-9{right:37.5%}.ant-col-xl-offset-9{margin-left:37.5%}.ant-col-xl-order-9{order:9}.ant-col-xl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xl-push-8{left:33.33333333%}.ant-col-xl-pull-8{right:33.33333333%}.ant-col-xl-offset-8{margin-left:33.33333333%}.ant-col-xl-order-8{order:8}.ant-col-xl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xl-push-7{left:29.16666667%}.ant-col-xl-pull-7{right:29.16666667%}.ant-col-xl-offset-7{margin-left:29.16666667%}.ant-col-xl-order-7{order:7}.ant-col-xl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xl-push-6{left:25%}.ant-col-xl-pull-6{right:25%}.ant-col-xl-offset-6{margin-left:25%}.ant-col-xl-order-6{order:6}.ant-col-xl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xl-push-5{left:20.83333333%}.ant-col-xl-pull-5{right:20.83333333%}.ant-col-xl-offset-5{margin-left:20.83333333%}.ant-col-xl-order-5{order:5}.ant-col-xl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xl-push-4{left:16.66666667%}.ant-col-xl-pull-4{right:16.66666667%}.ant-col-xl-offset-4{margin-left:16.66666667%}.ant-col-xl-order-4{order:4}.ant-col-xl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xl-push-3{left:12.5%}.ant-col-xl-pull-3{right:12.5%}.ant-col-xl-offset-3{margin-left:12.5%}.ant-col-xl-order-3{order:3}.ant-col-xl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xl-push-2{left:8.33333333%}.ant-col-xl-pull-2{right:8.33333333%}.ant-col-xl-offset-2{margin-left:8.33333333%}.ant-col-xl-order-2{order:2}.ant-col-xl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xl-push-1{left:4.16666667%}.ant-col-xl-pull-1{right:4.16666667%}.ant-col-xl-offset-1{margin-left:4.16666667%}.ant-col-xl-order-1{order:1}.ant-col-xl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xl-push-0{left:auto}.ant-col-xl-pull-0{right:auto}.ant-col-xl-offset-0{margin-left:0}.ant-col-xl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xl-push-0.ant-col-rtl{right:auto}.ant-col-xl-pull-0.ant-col-rtl{left:auto}.ant-col-xl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xl-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xl-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xl-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xl-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xl-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xl-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xl-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xl-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xl-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xl-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xl-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xl-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xl-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xl-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xl-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xl-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xl-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xl-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xl-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xl-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xl-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xl-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xl-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xl-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xl-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xl-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xl-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xl-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xl-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xl-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xl-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xl-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xl-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xl-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xl-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xl-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xl-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xl-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xl-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xl-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xl-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xl-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xl-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xl-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xl-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xl-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xl-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xl-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xl-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xl-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xl-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xl-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xl-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xl-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xl-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xl-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xl-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xl-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xl-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xl-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xl-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xl-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xl-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xl-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xl-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xl-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xl-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xl-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xl-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xl-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xl-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xl-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width:1600px){.ant-col-xxl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xxl-push-24{left:100%}.ant-col-xxl-pull-24{right:100%}.ant-col-xxl-offset-24{margin-left:100%}.ant-col-xxl-order-24{order:24}.ant-col-xxl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xxl-push-23{left:95.83333333%}.ant-col-xxl-pull-23{right:95.83333333%}.ant-col-xxl-offset-23{margin-left:95.83333333%}.ant-col-xxl-order-23{order:23}.ant-col-xxl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xxl-push-22{left:91.66666667%}.ant-col-xxl-pull-22{right:91.66666667%}.ant-col-xxl-offset-22{margin-left:91.66666667%}.ant-col-xxl-order-22{order:22}.ant-col-xxl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xxl-push-21{left:87.5%}.ant-col-xxl-pull-21{right:87.5%}.ant-col-xxl-offset-21{margin-left:87.5%}.ant-col-xxl-order-21{order:21}.ant-col-xxl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xxl-push-20{left:83.33333333%}.ant-col-xxl-pull-20{right:83.33333333%}.ant-col-xxl-offset-20{margin-left:83.33333333%}.ant-col-xxl-order-20{order:20}.ant-col-xxl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xxl-push-19{left:79.16666667%}.ant-col-xxl-pull-19{right:79.16666667%}.ant-col-xxl-offset-19{margin-left:79.16666667%}.ant-col-xxl-order-19{order:19}.ant-col-xxl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xxl-push-18{left:75%}.ant-col-xxl-pull-18{right:75%}.ant-col-xxl-offset-18{margin-left:75%}.ant-col-xxl-order-18{order:18}.ant-col-xxl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xxl-push-17{left:70.83333333%}.ant-col-xxl-pull-17{right:70.83333333%}.ant-col-xxl-offset-17{margin-left:70.83333333%}.ant-col-xxl-order-17{order:17}.ant-col-xxl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xxl-push-16{left:66.66666667%}.ant-col-xxl-pull-16{right:66.66666667%}.ant-col-xxl-offset-16{margin-left:66.66666667%}.ant-col-xxl-order-16{order:16}.ant-col-xxl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xxl-push-15{left:62.5%}.ant-col-xxl-pull-15{right:62.5%}.ant-col-xxl-offset-15{margin-left:62.5%}.ant-col-xxl-order-15{order:15}.ant-col-xxl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xxl-push-14{left:58.33333333%}.ant-col-xxl-pull-14{right:58.33333333%}.ant-col-xxl-offset-14{margin-left:58.33333333%}.ant-col-xxl-order-14{order:14}.ant-col-xxl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xxl-push-13{left:54.16666667%}.ant-col-xxl-pull-13{right:54.16666667%}.ant-col-xxl-offset-13{margin-left:54.16666667%}.ant-col-xxl-order-13{order:13}.ant-col-xxl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xxl-push-12{left:50%}.ant-col-xxl-pull-12{right:50%}.ant-col-xxl-offset-12{margin-left:50%}.ant-col-xxl-order-12{order:12}.ant-col-xxl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xxl-push-11{left:45.83333333%}.ant-col-xxl-pull-11{right:45.83333333%}.ant-col-xxl-offset-11{margin-left:45.83333333%}.ant-col-xxl-order-11{order:11}.ant-col-xxl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xxl-push-10{left:41.66666667%}.ant-col-xxl-pull-10{right:41.66666667%}.ant-col-xxl-offset-10{margin-left:41.66666667%}.ant-col-xxl-order-10{order:10}.ant-col-xxl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xxl-push-9{left:37.5%}.ant-col-xxl-pull-9{right:37.5%}.ant-col-xxl-offset-9{margin-left:37.5%}.ant-col-xxl-order-9{order:9}.ant-col-xxl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xxl-push-8{left:33.33333333%}.ant-col-xxl-pull-8{right:33.33333333%}.ant-col-xxl-offset-8{margin-left:33.33333333%}.ant-col-xxl-order-8{order:8}.ant-col-xxl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xxl-push-7{left:29.16666667%}.ant-col-xxl-pull-7{right:29.16666667%}.ant-col-xxl-offset-7{margin-left:29.16666667%}.ant-col-xxl-order-7{order:7}.ant-col-xxl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xxl-push-6{left:25%}.ant-col-xxl-pull-6{right:25%}.ant-col-xxl-offset-6{margin-left:25%}.ant-col-xxl-order-6{order:6}.ant-col-xxl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xxl-push-5{left:20.83333333%}.ant-col-xxl-pull-5{right:20.83333333%}.ant-col-xxl-offset-5{margin-left:20.83333333%}.ant-col-xxl-order-5{order:5}.ant-col-xxl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xxl-push-4{left:16.66666667%}.ant-col-xxl-pull-4{right:16.66666667%}.ant-col-xxl-offset-4{margin-left:16.66666667%}.ant-col-xxl-order-4{order:4}.ant-col-xxl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xxl-push-3{left:12.5%}.ant-col-xxl-pull-3{right:12.5%}.ant-col-xxl-offset-3{margin-left:12.5%}.ant-col-xxl-order-3{order:3}.ant-col-xxl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xxl-push-2{left:8.33333333%}.ant-col-xxl-pull-2{right:8.33333333%}.ant-col-xxl-offset-2{margin-left:8.33333333%}.ant-col-xxl-order-2{order:2}.ant-col-xxl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xxl-push-1{left:4.16666667%}.ant-col-xxl-pull-1{right:4.16666667%}.ant-col-xxl-offset-1{margin-left:4.16666667%}.ant-col-xxl-order-1{order:1}.ant-col-xxl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xxl-push-0{left:auto}.ant-col-xxl-pull-0{right:auto}.ant-col-xxl-offset-0{margin-left:0}.ant-col-xxl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-push-0.ant-col-rtl{right:auto}.ant-col-xxl-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xxl-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xxl-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xxl-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xxl-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xxl-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xxl-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xxl-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xxl-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xxl-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xxl-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xxl-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xxl-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xxl-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xxl-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xxl-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xxl-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xxl-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xxl-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xxl-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xxl-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xxl-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xxl-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xxl-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xxl-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xxl-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xxl-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xxl-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xxl-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xxl-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xxl-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xxl-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xxl-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xxl-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xxl-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xxl-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xxl-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xxl-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xxl-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xxl-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xxl-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xxl-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xxl-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xxl-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xxl-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xxl-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xxl-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xxl-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xxl-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xxl-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xxl-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xxl-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xxl-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xxl-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xxl-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xxl-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xxl-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xxl-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xxl-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xxl-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xxl-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xxl-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xxl-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xxl-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xxl-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xxl-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xxl-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xxl-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xxl-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xxl-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xxl-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xxl-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xxl-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}.ant-row-rtl{direction:rtl}.conversation___TJbiP{position:relative;margin-top:30px;padding:0 10px}.conversation___TJbiP .conversationSection___HsioJ{width:100%;height:100%}.conversation___TJbiP .conversationSection___HsioJ .sectionTitle___2tcoL{margin-bottom:12px;color:var(--text-color);font-size:16px;line-height:24px}.conversation___TJbiP .conversationSection___HsioJ .conversationList___1JJCj .conversationItem___3rc1d{cursor:pointer}.conversation___TJbiP .conversationSection___HsioJ .conversationList___1JJCj .conversationItem___3rc1d .conversationItemContent___1Yy3m{display:flex;align-items:center;padding:10px 0;color:var(--text-color-third)}.conversation___TJbiP .conversationSection___HsioJ .conversationList___1JJCj .conversationItem___3rc1d .conversationItemContent___1Yy3m .conversationIcon___31q0k{margin-right:10px;color:var(--text-color-fourth);font-size:20px}.conversation___TJbiP .conversationSection___HsioJ .conversationList___1JJCj .conversationItem___3rc1d .conversationItemContent___1Yy3m .conversationContent___3cv34{width:160px;overflow:hidden;color:var(--text-color-third);white-space:nowrap;text-overflow:ellipsis}.conversation___TJbiP .conversationSection___HsioJ .conversationList___1JJCj .conversationItem___3rc1d.activeConversationItem___7NFEq .conversationContent___3cv34,.conversation___TJbiP .conversationSection___HsioJ .conversationList___1JJCj .conversationItem___3rc1d:hover .conversationContent___3cv34{color:var(--chat-blue)}.ant-select-auto-complete{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum"}.ant-select-auto-complete .ant-select-clear{right:13px}.ant-select-single .ant-select-selector{display:flex}.ant-select-single .ant-select-selector .ant-select-selection-search{position:absolute;top:0;right:11px;bottom:0;left:11px}.ant-select-single .ant-select-selector .ant-select-selection-search-input{width:100%}.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-single .ant-select-selector .ant-select-selection-placeholder{padding:0;line-height:30px;transition:all .3s,visibility 0s}.ant-select-single .ant-select-selector .ant-select-selection-item{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-single .ant-select-selector .ant-select-selection-placeholder{transition:none;pointer-events:none}.ant-select-single .ant-select-selector .ant-select-selection-item:after,.ant-select-single .ant-select-selector .ant-select-selection-placeholder:after,.ant-select-single .ant-select-selector:after{display:inline-block;width:0;visibility:hidden;content:"\a0"}.ant-select-single.ant-select-show-arrow .ant-select-selection-search{right:25px}.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-right:18px}.ant-select-single.ant-select-open .ant-select-selection-item{color:#bfbfbf}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{width:100%;height:32px;padding:0 11px}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{height:30px}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector:after{line-height:30px}.ant-select-single.ant-select-customize-input .ant-select-selector:after{display:none}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search{position:static;width:100%}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder{position:absolute;right:0;left:0;padding:0 11px}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder:after{display:none}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{height:40px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector:after{line-height:38px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:38px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{height:24px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector:after{line-height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search{right:7px;left:7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{padding:0 7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:28px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-right:21px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{padding:0 11px}.ant-select-selection-overflow{position:relative;display:flex;flex:auto;flex-wrap:wrap;max-width:100%}.ant-select-selection-overflow-item{flex:none;align-self:center;max-width:100%}.ant-select-multiple .ant-select-selector{display:flex;flex-wrap:wrap;align-items:center;padding:1px 4px}.ant-select-show-search.ant-select-multiple .ant-select-selector{cursor:text}.ant-select-disabled.ant-select-multiple .ant-select-selector{background:#f5f5f5;cursor:not-allowed}.ant-select-multiple .ant-select-selector:after{display:inline-block;width:0;margin:2px 0;line-height:24px;visibility:hidden;content:"\a0"}.ant-select-multiple.ant-select-allow-clear .ant-select-selector,.ant-select-multiple.ant-select-show-arrow .ant-select-selector{padding-right:24px}.ant-select-multiple .ant-select-selection-item{position:relative;display:flex;flex:none;box-sizing:border-box;max-width:100%;height:24px;margin-top:2px;margin-bottom:2px;line-height:22px;background:#f5f5f5;border:1px solid #f0f0f0;border-radius:4px;cursor:default;transition:font-size .3s,line-height .3s,height .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-margin-end:4px;margin-inline-end:4px;-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:4px;padding-inline-end:4px}.ant-select-disabled.ant-select-multiple .ant-select-selection-item{color:#bfbfbf;border-color:#d9d9d9;cursor:not-allowed}.ant-select-multiple .ant-select-selection-item-content{display:inline-block;margin-right:4px;overflow:hidden;white-space:pre;text-overflow:ellipsis}.ant-select-multiple .ant-select-selection-item-remove{color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;color:rgba(0,10,36,.65);font-weight:700;font-size:10px;line-height:inherit;cursor:pointer}.ant-select-multiple .ant-select-selection-item-remove>*{line-height:1}.ant-select-multiple .ant-select-selection-item-remove svg{display:inline-block}.ant-select-multiple .ant-select-selection-item-remove:before{display:none}.ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon{display:block}.ant-select-multiple .ant-select-selection-item-remove>.anticon{vertical-align:middle}.ant-select-multiple .ant-select-selection-item-remove:hover{color:rgba(0,0,0,.75)}.ant-select-multiple .ant-select-selection-overflow-item+.ant-select-selection-overflow-item .ant-select-selection-search{-webkit-margin-start:0;margin-inline-start:0}.ant-select-multiple .ant-select-selection-search{position:relative;max-width:100%;-webkit-margin-start:7px;margin-inline-start:7px}.ant-select-multiple .ant-select-selection-search-input,.ant-select-multiple .ant-select-selection-search-mirror{height:24px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:24px;transition:all .3s}.ant-select-multiple .ant-select-selection-search-input{width:100%;min-width:4.1px}.ant-select-multiple .ant-select-selection-search-mirror{position:absolute;top:0;left:0;z-index:999;white-space:pre;visibility:hidden}.ant-select-multiple .ant-select-selection-placeholder{position:absolute;top:50%;right:11px;left:11px;transform:translateY(-50%);transition:all .3s}.ant-select-multiple.ant-select-lg .ant-select-selector:after{line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{line-height:30px}.ant-select-multiple.ant-select-lg .ant-select-selection-search{height:32px;line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-search-input,.ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror{height:32px;line-height:30px}.ant-select-multiple.ant-select-sm .ant-select-selector:after{line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-item{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{height:16px;line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-search-input,.ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{left:7px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{-webkit-margin-start:3px;margin-inline-start:3px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{height:32px;line-height:32px}.ant-select-disabled .ant-select-selection-item-remove{display:none}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector{background-color:#fff;border-color:#ef4872!important}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector,.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector{border-color:#fc7492;box-shadow:0 0 0 2px rgba(239,72,114,.2);border-right-width:1px;outline:0}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector{background-color:#fff;border-color:#ffb924!important}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector,.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector{border-color:#ffcc4d;box-shadow:0 0 0 2px rgba(255,185,36,.2);border-right-width:1px;outline:0}.ant-select-status-error.ant-select-has-feedback .ant-select-clear,.ant-select-status-success.ant-select-has-feedback .ant-select-clear,.ant-select-status-validating.ant-select-has-feedback .ant-select-clear,.ant-select-status-warning.ant-select-has-feedback .ant-select-clear{right:32px}.ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value{padding-right:42px}.ant-select{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:inline-block;cursor:pointer}.ant-select:not(.ant-select-customize-input) .ant-select-selector{position:relative;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:pointer}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector{cursor:text}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:auto}.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{color:rgba(0,0,0,.25);background:#f5f5f5;cursor:not-allowed}.ant-select-multiple.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{background:#f5f5f5}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:not-allowed}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{margin:0;padding:0;background:transparent;border:none;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button{display:none;-webkit-appearance:none}.ant-select:not(.ant-select-disabled):hover .ant-select-selector{border-color:#4e86f5;border-right-width:1px}.ant-select-selection-item{flex:1 1;overflow:hidden;font-weight:400;white-space:nowrap;text-overflow:ellipsis}@media (-ms-high-contrast:none){.ant-select-selection-item,.ant-select-selection-item ::-ms-backdrop{flex:auto}}.ant-select-selection-placeholder{flex:1 1;overflow:hidden;color:#bfbfbf;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}@media (-ms-high-contrast:none){.ant-select-selection-placeholder,.ant-select-selection-placeholder ::-ms-backdrop{flex:auto}}.ant-select-arrow{display:inline-block;color:inherit;font-style:normal;line-height:0;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:50%;right:11px;display:flex;align-items:center;height:12px;margin-top:-6px;color:rgba(0,0,0,.25);font-size:12px;line-height:1;text-align:center;pointer-events:none}.ant-select-arrow>*{line-height:1}.ant-select-arrow svg{display:inline-block}.ant-select-arrow:before{display:none}.ant-select-arrow .ant-select-arrow-icon{display:block}.ant-select-arrow .anticon{vertical-align:top;transition:transform .3s}.ant-select-arrow .anticon>svg{vertical-align:top}.ant-select-arrow .anticon:not(.ant-select-suffix){pointer-events:auto}.ant-select-disabled .ant-select-arrow{cursor:not-allowed}.ant-select-arrow>:not(:last-child){-webkit-margin-end:8px;margin-inline-end:8px}.ant-select-clear{position:absolute;top:50%;right:11px;z-index:1;display:inline-block;width:12px;height:12px;margin-top:-6px;color:rgba(0,0,0,.25);font-size:12px;font-style:normal;line-height:1;text-align:center;text-transform:none;background:#fff;cursor:pointer;opacity:0;transition:color .3s ease,opacity .15s ease;text-rendering:auto}.ant-select-clear:before{display:block}.ant-select-clear:hover{color:rgba(0,10,36,.65)}.ant-select:hover .ant-select-clear{opacity:1}.ant-select-dropdown{margin:0;color:rgba(0,10,36,.85);font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum",;position:absolute;top:-9999px;left:-9999px;z-index:1050;box-sizing:border-box;padding:4px 0;overflow:hidden;font-size:14px;font-variant:normal;background-color:#fff;border-radius:4px;outline:none;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpIn}.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft,.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownIn}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpOut}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownOut}.ant-select-dropdown-hidden{display:none}.ant-select-dropdown-empty{color:rgba(0,0,0,.25)}.ant-select-item-empty{position:relative;display:block;min-height:32px;padding:5px 12px;color:rgba(0,10,36,.85);font-weight:400;font-size:14px;line-height:22px;color:rgba(0,0,0,.25)}.ant-select-item{position:relative;display:block;min-height:32px;padding:5px 12px;color:rgba(0,10,36,.85);font-weight:400;font-size:14px;line-height:22px;cursor:pointer;transition:background .3s ease}.ant-select-item-group{color:rgba(0,10,36,.65);font-size:12px;cursor:default}.ant-select-item-option{display:flex}.ant-select-item-option-content{flex:auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-select-item-option-state{flex:none}.ant-select-item-option-active:not(.ant-select-item-option-disabled){background-color:#f5f5f5}.ant-select-item-option-selected:not(.ant-select-item-option-disabled){color:rgba(0,10,36,.85);font-weight:600;background-color:#e3ecfd}.ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state{color:#296df3}.ant-select-item-option-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-item-option-disabled.ant-select-item-option-selected{background-color:#f5f5f5}.ant-select-item-option-grouped{padding-left:24px}.ant-select-lg{font-size:16px}.ant-select-borderless .ant-select-selector{background-color:transparent!important;border-color:transparent!important;box-shadow:none!important}.ant-select.ant-select-in-form-item{width:100%}.ant-select-compact-item:not(.ant-select-compact-last-item){margin-right:-1px}.ant-select-compact-item:not(.ant-select-compact-last-item).ant-select-compact-item-rtl{margin-right:0;margin-left:-1px}.ant-select-compact-item:active>*,.ant-select-compact-item:focus>*,.ant-select-compact-item:hover>*{z-index:2}.ant-select-compact-item.ant-select-focused>*{z-index:2}.ant-select-compact-item[disabled]>*{z-index:0}.ant-select-compact-item:not(.ant-select-compact-first-item):not(.ant-select-compact-last-item).ant-select>.ant-select-selector{border-radius:0}.ant-select-compact-item.ant-select-compact-first-item.ant-select:not(.ant-select-compact-last-item):not(.ant-select-compact-item-rtl)>.ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-select-compact-item.ant-select-compact-last-item.ant-select:not(.ant-select-compact-first-item):not(.ant-select-compact-item-rtl)>.ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-select-compact-item.ant-select.ant-select-compact-first-item.ant-select-compact-item-rtl:not(.ant-select-compact-last-item)>.ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-select-compact-item.ant-select.ant-select-compact-last-item.ant-select-compact-item-rtl:not(.ant-select-compact-first-item)>.ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-select-rtl{direction:rtl}.ant-select-rtl .ant-select-arrow{right:auto;left:11px}.ant-select-rtl .ant-select-clear{right:auto;left:11px}.ant-select-dropdown-rtl{direction:rtl}.ant-select-dropdown-rtl .ant-select-item-option-grouped{padding-right:24px;padding-left:12px}.ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector,.ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector{padding-right:4px;padding-left:24px}.ant-select-rtl.ant-select-multiple .ant-select-selection-item{text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-item-content{margin-right:0;margin-left:4px;text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror{right:0;left:auto}.ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder{right:11px;left:auto}.ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{right:7px}.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder{right:0;left:9px;text-align:right}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search{right:11px;left:25px}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-right:0;padding-left:18px}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:6px}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-right:0;padding-left:21px}.ant-empty{margin:0 8px;font-size:14px;line-height:1.5715;text-align:center}.ant-empty-image{height:100px;margin-bottom:8px}.ant-empty-image img{height:100%}.ant-empty-image svg{height:100%;margin:auto}.ant-empty-footer{margin-top:16px}.ant-empty-normal{margin:32px 0;color:rgba(0,0,0,.25)}.ant-empty-normal .ant-empty-image{height:40px}.ant-empty-small{margin:8px 0;color:rgba(0,0,0,.25)}.ant-empty-small .ant-empty-image{height:35px}.ant-empty-img-default-ellipse{fill:#f5f5f5;fill-opacity:.8}.ant-empty-img-default-path-1{fill:#aeb8c2}.ant-empty-img-default-path-2{fill:url(#linearGradient-1)}.ant-empty-img-default-path-3{fill:#f5f5f7}.ant-empty-img-default-path-4{fill:#dce0e6}.ant-empty-img-default-path-5{fill:#dce0e6}.ant-empty-img-default-g{fill:#fff}.ant-empty-img-simple-ellipse{fill:#f5f5f5}.ant-empty-img-simple-g{stroke:#d9d9d9}.ant-empty-img-simple-path{fill:#fafafa}.ant-empty-rtl{direction:rtl}.ant-tag{box-sizing:border-box;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-block;height:auto;margin:0 8px 0 0;padding:0 7px;font-size:12px;line-height:20px;white-space:nowrap;background:#fafafa;border:1px solid #d9d9d9;border-radius:4px;opacity:1;transition:all .3s}.ant-tag,.ant-tag a,.ant-tag a:hover{color:rgba(0,10,36,.85)}.ant-tag>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag-close-icon{margin-left:3px;color:rgba(0,10,36,.65);font-size:10px;cursor:pointer;transition:all .3s}.ant-tag-close-icon:hover{color:rgba(0,10,36,.85)}.ant-tag-has-color{border-color:transparent}.ant-tag-has-color,.ant-tag-has-color .anticon-close,.ant-tag-has-color .anticon-close:hover,.ant-tag-has-color a,.ant-tag-has-color a:hover{color:#fff}.ant-tag-checkable{background-color:transparent;border-color:transparent;cursor:pointer}.ant-tag-checkable:not(.ant-tag-checkable-checked):hover{color:#296df3}.ant-tag-checkable-checked,.ant-tag-checkable:active{color:#fff}.ant-tag-checkable-checked{background-color:#296df3}.ant-tag-checkable:active{background-color:#0d57e8}.ant-tag-hidden{display:none}.ant-tag-pink{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-pink-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-magenta{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-magenta-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-red{color:#cf1322;background:#fff1f0;border-color:#ffa39e}.ant-tag-red-inverse{color:#fff;background:#f5222d;border-color:#f5222d}.ant-tag-volcano{color:#d4380d;background:#fff2e8;border-color:#ffbb96}.ant-tag-volcano-inverse{color:#fff;background:#fa541c;border-color:#fa541c}.ant-tag-orange{color:#d46b08;background:#fff7e6;border-color:#ffd591}.ant-tag-orange-inverse{color:#fff;background:#fa8c16;border-color:#fa8c16}.ant-tag-yellow{color:#d4b106;background:#feffe6;border-color:#fffb8f}.ant-tag-yellow-inverse{color:#fff;background:#fadb14;border-color:#fadb14}.ant-tag-gold{color:#d99414;background:#fffdf0;border-color:#ffea9e}.ant-tag-gold-inverse{color:#fff;background:#ffb924;border-color:#ffb924}.ant-tag-cyan{color:#08979c;background:#e6fffb;border-color:#87e8de}.ant-tag-cyan-inverse{color:#fff;background:#13c2c2;border-color:#13c2c2}.ant-tag-lime{color:#7cb305;background:#fcffe6;border-color:#eaff8f}.ant-tag-lime-inverse{color:#fff;background:#a0d911;border-color:#a0d911}.ant-tag-green{color:#17a379;background:#f0fff7;border-color:#a1f0cd}.ant-tag-green-inverse{color:#fff;background:#26c992;border-color:#26c992}.ant-tag-blue{color:#184ecc;background:#f0f7ff;border-color:#a6ccff}.ant-tag-blue-inverse{color:#fff;background:#296df3;border-color:#296df3}.ant-tag-geekblue{color:#1d39c4;background:#f0f5ff;border-color:#adc6ff}.ant-tag-geekblue-inverse{color:#fff;background:#2f54eb;border-color:#2f54eb}.ant-tag-purple{color:#531dab;background:#f9f0ff;border-color:#d3adf7}.ant-tag-purple-inverse{color:#fff;background:#722ed1;border-color:#722ed1}.ant-tag-success{color:#26c992;background:#f0fff7;border-color:#a1f0cd}.ant-tag-processing{color:#296df3;background:#f0f7ff;border-color:#a6ccff}.ant-tag-error{color:#ef4872;background:#fff0f1;border-color:#ffc7cf}.ant-tag-warning{color:#ffb924;background:#fffdf0;border-color:#ffea9e}.ant-tag>.anticon+span,.ant-tag>span+.anticon{margin-left:7px}.ant-tag.ant-tag-rtl{margin-right:0;margin-left:8px;direction:rtl;text-align:right}.ant-tag-rtl .ant-tag-close-icon{margin-right:3px;margin-left:0}.ant-tag-rtl.ant-tag>.anticon+span,.ant-tag-rtl.ant-tag>span+.anticon{margin-right:7px;margin-left:0}.chatFooter___3U7Ja{position:relative;z-index:10;display:flex;flex-direction:column;margin-top:6px;margin-right:20px;margin-bottom:40px}.chatFooter___3U7Ja .composer___nXwyD{display:flex;height:46px}.chatFooter___3U7Ja .composer___nXwyD .collapseBtn___3ROh9{height:46px;margin:0 10px;color:var(--text-color-third);font-size:20px;line-height:46px;cursor:pointer}.chatFooter___3U7Ja .composer___nXwyD .collapseBtn___3ROh9:hover{color:var(--chat-blue)}.chatFooter___3U7Ja .composer___nXwyD .addConversation___2gYpO{height:46px;margin:0 20px 0 10px;color:var(--text-color-fourth);font-size:26px;line-height:54px;cursor:pointer}.chatFooter___3U7Ja .composer___nXwyD .addConversation___2gYpO:hover{color:var(--chat-blue)}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj{flex:1 1}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj .composerInput___27grD{width:100%;height:100%}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj .composerInput___27grD .ant-select-selector{box-sizing:border-box;height:100%;overflow:hidden;color:rgba(0,0,0,.87);font-size:16px;word-break:break-all;background:#fff;border:0;border-radius:24px;box-shadow:0 -.5px 0 rgba(0,0,0,.07),0 0 18px rgba(0,0,0,.1);transition:border-color .15s ease-in-out;resize:none}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj .composerInput___27grD .ant-select-selector .ant-select-selection-search-input{height:100%!important;padding:0 20px}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj .composerInput___27grD .ant-select-selector .ant-select-selection-search{right:0!important;left:0!important}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj .composerInput___27grD .ant-select-selector .ant-select-selection-placeholder{padding-left:10px!important;line-height:45px}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj .composerInput___27grD .ant-select-clear{right:auto;left:500px;width:16px;height:16px;margin-top:-8px;font-size:16px}.chatFooter___3U7Ja .composer___nXwyD .composerInputWrapper___33XEj .ant-select-focused .ant-select-selector{box-shadow:0 0 3px #4a72f5!important}.chatFooter___3U7Ja .sendBtn___1mSEb{position:absolute;top:50%;right:6px;display:flex;align-items:center;justify-content:center;width:30px;height:30px;color:#fff;font-size:20px;background-color:#b8b8bf;border:unset;border-radius:50%;transform:translateY(-50%);transition:background-color .3s ease 0s}.chatFooter___3U7Ja .sendBtn___1mSEb.sendBtnActive___2tnLt{background-color:var(--chat-blue)}.chatFooter___3U7Ja.mobile___1ObPp{height:40px;margin:12px 12px 20px}.chatFooter___3U7Ja.mobile___1ObPp .addConversation___2gYpO{height:40px;margin:0 12px 0 4px}.chatFooter___3U7Ja.mobile___1ObPp .composer___nXwyD{height:40px}.chatFooter___3U7Ja.mobile___1ObPp .composer___nXwyD .ant-select-selector{font-size:14px!important}.chatFooter___3U7Ja.mobile___1ObPp .composer___nXwyD .ant-select-selection-placeholder{line-height:39px!important}.searchOption___3IfcA{padding:6px 20px;color:#212121;font-size:16px}.mobile___1ObPp .searchOption___3IfcA{min-height:26px;padding:2px 12px;font-size:14px}.domain___3oxKe{margin-top:2px;color:var(--text-color-fourth);font-size:13px;line-height:12px}.autoCompleteDropdown___1y8g6{left:20px!important;width:-webkit-fit-content!important;width:-moz-fit-content!important;width:fit-content!important;min-width:100px!important;border-radius:6px}.autoCompleteDropdown___1y8g6.domainOptions___3lo34{width:150px!important}.autoCompleteDropdown___1y8g6.domainOptions___3lo34 .searchOption___3IfcA{padding:0 10px;color:var(--text-color-secondary);font-size:14px}.autoCompleteDropdown___1y8g6.domainOptions___3lo34 .ant-select-item{height:30px!important;line-height:30px!important}.semanticType___2NkK7{margin-right:10px}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:14px}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}:root:root{--primary:180deg 4%;--wy-color:#c20c0c;--detail-width:1300px;--primary-1:#fff0f0;--primary-2:#ffc7c7;--primary-3:#ff9ea1;--primary-4:#ff757e;--primary-5:#ff4d5e;--primary-6:#ff2441;--primary-7:#d91434;--primary-8:rgba(255,36,66,0.1);--info-color:#ff2442;--newrank-color:#ff7800;--warning-color:#faad14;--normal-color:#d9d9d9;--white:#fff;--white-30:hsla(0,0%,100%,0.3);--black:#000;--disabled-color:#afb6b6;--disabled-bg:#eceeee;--border-color-base:#e1e6e6;--chat-border-color-base:#d5d7db;--light-blue-background:rgba(58,100,255,0.1);--link-color:#3a64ff;--link-hover-color:#638aff;--link-active-color:#2748d9;--link-bg-color:rgba(58,100,255,0.1);--text-accent-color:#3a64ff;--primary-green:#31c462;--link-hover-bg-color:rgba(58,100,255,0.06);--success-2:rgba(82,196,26,0.2);--success-pink:#ff8193;--disabled-bg-3:hsla(180,6%,93%,0.3);--tooltip-bg:#fff;--record-btn:#00b354;--record-btn-bg:rgba(0,179,84,0.1);--record-btn-bg-3:rgba(0,179,84,0.3);--border-color-base-bg-5:hsla(180,9%,89%,0.5);--user-gao-color:#fcad36;--user-hao-color:#ec6f6f;--user-all-color:#252526;--nr-menu-highlight-color:#ff2442;--nr-menu-icon-hover-color:#ff2442;--nr-sider-background:#fff;--nr-menu-bg:#fff;--nr-sider-fixed-zindex:12;--nr-header-fixed-zindex:11;--newrank-color-bg:rgba(255,120,0,0.1);--newrank-color-bg-3:rgba(255,120,0,0.3);--warning-05:rgba(250,173,20,0.05);--bridge-account-color:#ff2442;--bridge-agency-color:#3a64ff;--bridge-free-color:#ff7800;--bridge-medium-color:#00b354}.ss-chat-dimension,.ss-chat-metric{position:relative}.ss-chat-dimension:after,.ss-chat-metric:after{position:absolute;right:.5px;bottom:-2px;left:.5px;height:2px;margin:0 1px;content:""}.ss-chat-dimension:after{background:var(--chat-blue)}.ss-chat-metric:after{background:var(--primary-green)}.ss-chat-table-row{cursor:pointer}.ss-chat-even-row{background-color:#fbfbfb}.ss-chat-no-border-table .ant-table-cell{border:none!important}.ss-chat-no-border-table .ant-table-tbody>tr.ant-table-row:hover>td{background-color:#efefef!important}.ss-chat-bar{height:270px;margin-top:16px}.ss-chat-table{margin-top:20px;margin-bottom:20px}.ss-chat-table-photo{display:flex;align-items:center;justify-content:center}.ss-chat-table table{width:100%}.ss-chat-table-even-row{background-color:#fbfbfb}.ss-chat-table .ant-table-container table>thead>tr:first-child th:first-child{border-top-left-radius:12px!important;border-bottom-left-radius:12px!important}.ss-chat-table .ant-table-container table>thead>tr:first-child th:last-child{border-top-right-radius:12px!important;border-bottom-right-radius:12px!important}.ss-chat-table .ant-table-tbody>tr.ant-table-row:hover>td{background-color:#fafafa!important}.ss-chat-table .ant-table-cell{text-align:center!important}.ss-chat-table .ant-table-thead .ant-table-cell{padding-top:10px;padding-bottom:10px;color:#666;font-size:13px;background:#f0f2f5}.ss-chat-table .ant-table-thead .ant-table-cell:before{display:none}.ss-chat-table .ss-chat-table-formatted-value{font-weight:500;font-size:16px}.ss-chat-table .ant-table-thead .ant-table-cell{padding-top:8.5px;padding-bottom:8.5px;color:#737b7b;font-weight:500;font-size:14px;background-color:#edf2f2}.ss-chat-table .ant-table-tbody .ant-table-cell{padding:15px 0;color:#333;font-size:14px}.ss-chat-message-domain-name{color:var(--text-color);margin-bottom:2px;margin-left:4px;font-weight:500}.ss-chat-message-content{display:flex;align-items:flex-start}.ss-chat-message-body{width:100%}.ss-chat-message-bubble{box-sizing:border-box;min-width:1px;max-width:100%;padding:8px 16px 10px;background:hsla(0,0%,100%,.8);border:1px solid transparent;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.14),0 0 2px rgba(0,0,0,.12)}.ss-chat-message-top-bar{position:relative;max-width:100%;padding:4px 0 8px;color:var(--text-color-third);font-size:13px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;border-bottom:1px solid rgba(0,0,0,.03)}.ss-chat-message-filter-section{display:flex;align-items:center;color:var(--text-color-secondary);font-weight:400;font-size:13px}.ss-chat-message-filter-values{display:flex;align-items:center;grid-column-gap:6px;-webkit-column-gap:6px;column-gap:6px}.ss-chat-message-filter-item{padding:2px 12px;color:var(--text-color-secondary);background-color:#edf2f2;border-radius:13px;max-width:200px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ss-chat-message-tip{margin-left:6px;color:var(--text-color-third)}.ss-chat-message-info-bar{display:flex;align-items:center;grid-row-gap:12px;row-gap:12px;flex-wrap:wrap;margin-top:20px;grid-column-gap:20px;-webkit-column-gap:20px;column-gap:20px;color:var(--text-color-secondary);background:rgba(133,156,241,.1);padding:4px 12px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;border-radius:8px}.ss-chat-message-main-entity-info{display:flex;flex-wrap:wrap;align-items:center;font-size:13px;grid-column-gap:20px;-webkit-column-gap:20px;column-gap:20px;grid-row-gap:10px;row-gap:10px}.ss-chat-message-info-item{display:flex;align-items:center}.ss-chat-message-info-name{color:var(--text-color-third)}.ss-chat-message-info-value{color:var(--text-color)}.ss-chat-metric-card{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:150px;grid-row-gap:4px;row-gap:4px}.ss-chat-metric-card-indicator{display:flex;flex-direction:column;align-items:flex-start;justify-content:center}.ss-chat-metric-card-date-range{color:var(--text-color-fourth);font-size:14px}.ss-chat-metric-card-indicator-value{color:var(--text-color);font-weight:600;font-size:30px}.ss-chat-metric-card-indicator-name{color:var(--text-color-fourth);font-size:14px}.ss-chat-metric-trend{display:flex;flex-direction:column;align-items:center;justify-content:center;margin-top:16px;width:100%;grid-row-gap:4px;row-gap:4px}.ss-chat-metric-trend-indicator{display:flex;flex-direction:column;align-items:flex-start;justify-content:center}.ss-chat-metric-trend-date-range{color:var(--text-color-fourth);font-size:14px}.ss-chat-metric-trend-indicator-value{color:var(--text-color);font-weight:600;font-size:30px}.ss-chat-metric-trend-indicator-name{color:var(--text-color-fourth);font-size:14px}.ss-chat-metric-trend-flow-trend-chart{height:270px}.ss-chat-metric-trend-charts{display:flex;flex-direction:column;width:100%;grid-row-gap:16px;row-gap:16px}.ss-chat-metric-trend-metric-fields{display:flex;flex-wrap:wrap;align-items:center;grid-row-gap:12px;row-gap:12px}.ss-chat-metric-trend-metric-field{display:inline-block;box-sizing:border-box;height:auto;margin:0 8px 0 0;padding:1px 8px;color:var(--text-color-third);font-variant:tabular-nums;line-height:20px;white-space:nowrap;list-style:none;border-color:transparent;border-radius:2px;cursor:pointer;opacity:1;transition:all .3s;font-feature-settings:"tnum","tnum","tnum"}.ss-chat-metric-trend-metric-field:hover{color:var(--chat-blue)}.ss-chat-metric-trend-metric-field-active{color:#fff!important;background-color:var(--chat-blue)}.ss-chat-metric-trend-metric-field-single{padding-left:0;font-weight:500;cursor:default;color:var(--text-color-secondary)}.ss-chat-metric-trend-metric-field-single:hover{color:var(--text-color-secondary)}.ss-chat-metric-trend-date-options{display:flex;align-items:center;grid-column-gap:20px;-webkit-column-gap:20px;column-gap:20px;font-size:14px}.ss-chat-metric-trend-date-option{position:relative;color:var(--text-color-secondary);cursor:pointer}.ss-chat-metric-trend-date-option:hover{color:var(--chat-blue)}.ss-chat-metric-trend-date-option-active{color:var(--chat-blue)}.ss-chat-metric-trend-date-option-mobile{font-size:12px}.ss-chat-metric-trend-active-identifier{position:absolute;bottom:-6px;width:100%;height:4px;background-color:var(--chat-blue);border-radius:4px 4px 0 0}.ss-chat-metric-trend-date-option-divider{width:1px;height:16px;background-color:var(--text-color-fifth)}.ss-chat-apply-auth{font-size:14px;color:var(--text-color)}.ss-chat-apply-auth-apply{color:var(--chat-blue);cursor:pointer}.ss-chat-no-permission-chart{position:relative;width:100%;height:300px}.ss-chat-no-permission-chart-holder{width:100%;height:300px}.ss-chat-no-permission-chart-bar-chart-holder{margin-top:20px}.ss-chat-no-permission-chart-no-permission{position:absolute;top:50%;left:50%;padding:4px 12px;transform:translate(-50%,-50%)}.semantic-info-popover-cls{max-width:300px}.semantic-info-popover-cls-spin-box{text-align:center;padding-top:10px}.semantic-info-popover-cls .ant-popover-title{padding:5px 8px 4px}.semantic-info-popover-cls .ant-popover-inner-content{min-height:60px;min-width:185px}.ss-chat-semantic-detail-info-bar{display:flex;flex-wrap:wrap;align-items:center;margin:20px 0;grid-column-gap:20px;-webkit-column-gap:20px;column-gap:20px}.ss-chat-semantic-detail-description{font-size:13px;color:var(--text-color-fourth)}.ss-chat-semantic-detail-main-entity-info{display:flex;flex-wrap:wrap;align-items:center;font-size:13px;grid-column-gap:20px;-webkit-column-gap:20px;column-gap:20px}.ss-chat-semantic-detail-info-item{display:flex;align-items:center}.ss-chat-semantic-detail-info-name{color:var(--text-color-fourth)}.ss-chat-semantic-detail-info-value{color:var(--text-color-secondary)}.ss-chat-semantic-detail-title{font-size:16px;margin-left:15px;line-height:30px}.ss-chat-semantic-detail-title:before{display:block;position:absolute;content:"";left:0;top:6px;height:15px;width:3px;font-size:0;background:#0e73ff;border-radius:2px;border:1px solid #0e73ff}.ss-chat-semantic-detail-label{font-size:14px;color:var(--text-color-fourth)}.ss-chat-semantic-detail-section-item{cursor:pointer}.ss-chat-semantic-detail-section-item:hover{color:var(--chat-blue)}.ss-chat-semantic-detail-reload{display:flex;align-items:center;color:var(--text-color-fourth);font-size:12px;grid-column-gap:4px;-webkit-column-gap:4px;column-gap:4px;cursor:pointer;position:relative;top:3px}.ss-chat-semantic-detail-reload:hover{color:var(--chat-blue)}.ss-chat-semantic-detail-reload-icon{font-size:10px;position:relative}.ss-chat-semantic-detail-header{font-size:14px;color:var(--text-color-fourth);margin-bottom:5px}.ss-chat-semantic-detail-more{cursor:pointer;font-size:12px}.ss-chat-semantic-detail-more:hover{color:var(--chat-blue)}.ss-chat-semantic-detail-recommend-questions-content{height:300px;overflow:auto}.ss-chat-semantic-detail-question{cursor:pointer;color:rgba(0,0,0,.87)}.ss-chat-semantic-detail-question:hover{color:var(--chat-blue)}.ss-chat-semantic-detail-content-col{min-width:300px;overflow-y:hidden;height:32px;overflow-x:scroll}.ss-chat-semantic-detail-content-col-box{width:-webkit-max-content;width:-moz-max-content;width:max-content}.ss-chat-item{display:flex}.ss-chat-item-avatar{display:flex;align-items:center;justify-content:center;font-size:40px;width:40px;height:40px;margin-right:6px;border-radius:50%;color:var(--chat-blue);background-color:#fff}.ss-chat-item-content{width:calc(100% - 50px)}.ss-chat-item-metric-info-list{margin-top:30px;display:flex;flex-direction:column;grid-row-gap:30px;row-gap:30px}.ss-chat-item-typing{width:100%;padding:0 5px}.ss-chat-item-typing .ant-spin-dot{width:100%!important;height:100%!important}.ss-chat-item-typing-bubble{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:8px 16px!important}.ss-chat-item-text-bubble{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.ss-chat-item-text{line-height:1.5;white-space:pre-wrap;overflow-wrap:break-word;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ss-chat-tools{display:flex;align-items:center;margin-top:12px;grid-column-gap:6px;-webkit-column-gap:6px;column-gap:6px}.ss-chat-tools-feedback{display:flex;align-items:center;margin-left:4px;color:var(--text-color-third);grid-column-gap:6px;-webkit-column-gap:6px;column-gap:6px}.ss-chat-tools-like{margin-right:4px}.ss-chat-tools-mobile-tools{display:flex;flex-direction:column;margin-top:12px;grid-row-gap:10px;row-gap:10px}.ss-chat-tools-tools{margin-top:0}.ss-chat-tools-feedback{margin-left:2px}.ss-chat-suggestion{margin-top:30px}.ss-chat-suggestion .ss-chat-suggestion-mobile{margin-top:12px;font-size:13px}.ss-chat-suggestion-tip{margin-bottom:12px}.ss-chat-suggestion-content-section{display:flex;align-items:center;margin-bottom:10px;grid-row-gap:12px;row-gap:12px}.ss-chat-suggestion-title{color:var(--text-color-fourth)}.ss-chat-suggestion-section-items{display:flex;flex-wrap:wrap;align-items:center}.ss-chat-suggestion-section-item-selectable{cursor:pointer}.ss-chat-suggestion-section-item-selectable:hover{color:var(--chat-blue)}.ss-chat-suggestion-reload{display:flex;align-items:center;margin-right:14px;margin-left:20px;color:var(--text-color-fourth);font-size:12px;grid-column-gap:4px;-webkit-column-gap:4px;column-gap:4px;cursor:pointer}.ss-chat-suggestion-reload:hover{color:var(--chat-blue)}.ss-chat-suggestion-reload-icon{font-size:10px}.ant-tree.ant-tree-directory .ant-tree-treenode{position:relative}.ant-tree.ant-tree-directory .ant-tree-treenode:before{position:absolute;top:0;right:0;bottom:4px;left:0;transition:background-color .3s;content:"";pointer-events:none}.ant-tree.ant-tree-directory .ant-tree-treenode:hover:before{background:#f5f5f5}.ant-tree.ant-tree-directory .ant-tree-treenode>*{z-index:1}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher{transition:color .3s}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper{border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected{color:#fff;background:transparent}.ant-tree.ant-tree-directory .ant-tree-treenode-selected:before,.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover:before{background:#296df3}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher{color:#fff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper{color:#fff;background:transparent}.ant-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-tree-checkbox-input:focus+.ant-tree-checkbox-inner,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,.ant-tree-checkbox:hover .ant-tree-checkbox-inner{border-color:#296df3}.ant-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #296df3;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after,.ant-tree-checkbox:hover:after{visibility:visible}.ant-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-tree-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-tree-checkbox-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background-color:#296df3;border-color:#296df3}.ant-tree-checkbox-disabled{cursor:not-allowed}.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{border-color:rgba(0,0,0,.25);animation-name:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tree-checkbox-disabled:hover:after,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled:after{visibility:hidden}.ant-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-tree-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\a0"}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-tree-checkbox-wrapper+.ant-tree-checkbox-wrapper{margin-left:8px}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-tree-checkbox+span{padding-right:8px;padding-left:8px}.ant-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-block}.ant-tree-checkbox-group-item{margin-right:8px}.ant-tree-checkbox-group-item:last-child{margin-right:0}.ant-tree-checkbox-group-item+.ant-tree-checkbox-group-item{margin-left:0}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#296df3;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{background-color:rgba(0,0,0,.25);border-color:rgba(0,0,0,.25)}.ant-tree{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";background:#fff;border-radius:4px;transition:background-color .3s}.ant-tree-focused:not(:hover):not(.ant-tree-active-focused){background:#e3ecfd}.ant-tree-list-holder-inner{align-items:flex-start}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner{align-items:stretch}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper{flex:auto}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging{position:relative}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging:after{position:absolute;top:0;right:0;bottom:4px;left:0;border:1px solid #296df3;opacity:0;animation:ant-tree-node-fx-do-not-use .3s;animation-play-state:running;animation-fill-mode:forwards;content:"";pointer-events:none}.ant-tree .ant-tree-treenode{display:flex;align-items:flex-start;padding:0 0 4px;outline:none}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper{background:#f5f5f5}.ant-tree .ant-tree-treenode:not(.ant-tree .ant-tree-treenode-disabled).filter-node .ant-tree-title{color:inherit;font-weight:500}.ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{width:24px;line-height:24px;text-align:center;visibility:visible;opacity:.2;transition:opacity .3s}.ant-tree-treenode:hover .ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{opacity:.45}.ant-tree .ant-tree-treenode-draggable.ant-tree-treenode-disabled .ant-tree-draggable-icon{visibility:hidden}.ant-tree-indent{align-self:stretch;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-indent-unit{display:inline-block;width:24px}.ant-tree-draggable-icon{visibility:hidden}.ant-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-switcher .ant-select-tree-switcher-icon,.ant-tree-switcher .ant-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:baseline}.ant-tree-switcher .ant-select-tree-switcher-icon svg,.ant-tree-switcher .ant-tree-switcher-icon svg{transition:transform .3s}.ant-tree-switcher-noop{cursor:default}.ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-tree-switcher-loading-icon{color:#296df3}.ant-tree-switcher-leaf-line{position:relative;z-index:1;display:inline-block;width:100%;height:100%}.ant-tree-switcher-leaf-line:before{position:absolute;top:0;right:12px;bottom:-4px;margin-left:-1px;border-right:1px solid #d9d9d9;content:" "}.ant-tree-switcher-leaf-line:after{position:absolute;width:10px;height:14px;border-bottom:1px solid #d9d9d9;content:" "}.ant-tree-checkbox{top:auto;margin:4px 8px 0 0}.ant-tree .ant-tree-node-content-wrapper{position:relative;z-index:auto;min-height:24px;margin:0;padding:0 4px;color:inherit;line-height:24px;background:transparent;border-radius:4px;cursor:pointer;transition:all .3s,border 0s,line-height 0s,box-shadow 0s}.ant-tree .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:#bed2fb}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle{display:inline-block;width:24px;height:24px;line-height:24px;text-align:center;vertical-align:top}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty{display:none}.ant-tree-unselectable .ant-tree-node-content-wrapper:hover{background-color:transparent}.ant-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-node-content-wrapper .ant-tree-drop-indicator{position:absolute;z-index:1;height:2px;background-color:#296df3;border-radius:1px;pointer-events:none}.ant-tree-node-content-wrapper .ant-tree-drop-indicator:after{position:absolute;top:-3px;left:-6px;width:8px;height:8px;background-color:transparent;border:2px solid #296df3;border-radius:50%;content:""}.ant-tree .ant-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #296df3}.ant-tree-show-line .ant-tree-indent-unit{position:relative;height:100%}.ant-tree-show-line .ant-tree-indent-unit:before{position:absolute;top:0;right:12px;bottom:-4px;border-right:1px solid #d9d9d9;content:""}.ant-tree-show-line .ant-tree-indent-unit-end:before{display:none}.ant-tree-show-line .ant-tree-switcher{background:#fff}.ant-tree-show-line .ant-tree-switcher-line-icon{vertical-align:-.15em}.ant-tree .ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line:before{top:auto!important;bottom:auto!important;height:14px!important}.ant-tree-rtl{direction:rtl}.ant-tree-rtl .ant-tree-node-content-wrapper[draggable=true] .ant-tree-drop-indicator:after{right:-6px;left:unset}.ant-tree .ant-tree-treenode-rtl{direction:rtl}.ant-tree-rtl .ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit:before{right:auto;left:-13px;border-right:none;border-left:1px solid #d9d9d9}.ant-tree-rtl .ant-tree-checkbox{margin:4px 0 0 8px}.ant-tree-select-dropdown-rtl .ant-select-tree-checkbox{margin:4px 0 0 8px}.ant-popconfirm{z-index:1060}.ant-switch{margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:inline-block;box-sizing:border-box;min-width:44px;height:22px;line-height:22px;vertical-align:middle;background-color:rgba(0,0,0,.25);border:0;border-radius:100px;cursor:pointer;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-switch:focus{outline:0;box-shadow:0 0 0 2px rgba(0,0,0,.1)}.ant-switch-checked:focus{box-shadow:0 0 0 2px #e3ecfd}.ant-switch:focus:hover{box-shadow:none}.ant-switch-checked{background-color:#296df3}.ant-switch-disabled,.ant-switch-loading{cursor:not-allowed;opacity:.4}.ant-switch-disabled *,.ant-switch-loading *{box-shadow:none;cursor:not-allowed}.ant-switch-inner{display:block;margin:0 7px 0 25px;color:#fff;font-size:12px;transition:margin .2s}.ant-switch-checked .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-handle{position:absolute;top:2px;left:2px;width:18px;height:18px;transition:all .2s ease-in-out}.ant-switch-handle:before{position:absolute;top:0;right:0;bottom:0;left:0;background-color:#fff;border-radius:9px;box-shadow:0 2px 4px 0 rgba(0,35,11,.2);transition:all .2s ease-in-out;content:""}.ant-switch-checked .ant-switch-handle{left:calc(100% - 20px)}.ant-switch:not(.ant-switch-disabled):active .ant-switch-handle:before{right:-30%;left:0}.ant-switch:not(.ant-switch-disabled):active.ant-switch-checked .ant-switch-handle:before{right:0;left:-30%}.ant-switch-loading-icon.anticon{position:relative;top:2px;color:rgba(0,0,0,.65);vertical-align:top}.ant-switch-checked .ant-switch-loading-icon{color:#296df3}.ant-switch-small{min-width:28px;height:16px;line-height:16px}.ant-switch-small .ant-switch-inner{margin:0 5px 0 18px;font-size:12px}.ant-switch-small .ant-switch-handle{width:12px;height:12px}.ant-switch-small .ant-switch-loading-icon{top:1.5px;font-size:9px}.ant-switch-small.ant-switch-checked .ant-switch-inner{margin:0 18px 0 5px}.ant-switch-small.ant-switch-checked .ant-switch-handle{left:calc(100% - 14px)}.ant-switch-rtl{direction:rtl}.ant-switch-rtl .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-rtl .ant-switch-handle{right:2px;left:auto}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active .ant-switch-handle:before{right:0;left:-30%}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active.ant-switch-checked .ant-switch-handle:before{right:-30%;left:0}.ant-switch-rtl.ant-switch-checked .ant-switch-inner{margin:0 7px 0 25px}.ant-switch-rtl.ant-switch-checked .ant-switch-handle{right:calc(100% - 20px)}.ant-switch-rtl.ant-switch-small.ant-switch-checked .ant-switch-handle{right:calc(100% - 14px)}.projectBody___1O75d{display:flex;flex-direction:row;background-color:#fff;height:calc(100vh - 48px)}.projectBody___1O75d .projectManger___2moa9{width:100%;min-height:calc(100vh - 48px);background:#f8f9fb;position:relative}.projectBody___1O75d .projectManger___2moa9 .collapseLeftBtn___271Yq{position:absolute;top:calc(50% + 45px);left:0;z-index:100;display:flex;align-items:center;height:70px;color:#fff;font-size:12px;background-color:rgba(40,46,54,.2);border-radius:0 24px 24px 0;cursor:pointer;transition:all .3s ease}.projectBody___1O75d .projectManger___2moa9 .title___LuK7d{margin-bottom:0;padding:20px;font-size:20px;line-height:34px;border-bottom:1px solid #d9d9d9}.projectBody___1O75d .projectManger___2moa9 .tab___DxzVP{padding:0 20px;line-height:28px}.projectBody___1O75d .projectManger___2moa9 .mainTip___1uvL1{padding:20px}.projectBody___1O75d .projectManger___2moa9 .ant-card-body{padding:0!important}.projectBody___1O75d .projectManger___2moa9 .ant-tabs-content-holder{overflow:scroll;height:calc(100vh - 192px)}.projectBody___1O75d .projectManger___2moa9 .resource___3CU5R{display:flex}.projectBody___1O75d .projectManger___2moa9 .resource___3CU5R .tree___2sPCD{flex:1 1}.projectBody___1O75d .projectManger___2moa9 .resource___3CU5R .tree___2sPCD .headOperation___35Wj2 .btn___2RLpC{margin-right:18px}.projectBody___1O75d .projectManger___2moa9 .resource___3CU5R .tree___2sPCD .resourceSearch___3I419{margin:10px 0}.projectBody___1O75d .projectManger___2moa9 .resource___3CU5R .view___1TePK{width:480px;padding-left:20px}.projectBody___1O75d .projectManger___2moa9 .resource___3CU5R .selectTypesBtn___24cg5{margin-right:8px}.projectList___3ra_d{display:flex;flex-direction:column;width:400px;overflow:hidden}.projectList___3ra_d .addBtn___8opNc{cursor:pointer;width:100%;font-size:18px;margin-top:18px}.projectList___3ra_d .addBtn___8opNc:hover{color:#296df3}.projectList___3ra_d .treeTitle___2YiW-{margin-bottom:0;padding:20px;line-height:34px;text-align:right;background:#fff;border-bottom:1px solid #d9d9d9}.projectList___3ra_d .treeTitle___2YiW- .title___LuK7d{float:left}.projectList___3ra_d .search___lSpVC{width:calc(100% - 20px);margin:10px}.projectList___3ra_d .tree___2sPCD{flex:1 1;padding:10px}.projectList___3ra_d .tree___2sPCD .projectItem___2-Mu_{display:flex;width:100%;cursor:auto}.projectList___3ra_d .tree___2sPCD .projectItem___2-Mu_ .title___LuK7d{flex:1 1;cursor:pointer}.projectList___3ra_d .tree___2sPCD .projectItem___2-Mu_ .operation___1tdgy .icon___1rxv-{margin-left:6px;cursor:pointer}.user___w0WDu{display:grid}.search___lSpVC{width:50%;margin-bottom:20px}.paramsName___2MM76{margin-right:10px}.deleteBtn___1it0i{margin-left:5px}.authBtn___L5Y_I{cursor:pointer}.selectedResource___3RJBb{font-size:12px;color:#a9a9a9;margin-top:4px}.switch___1jFlm{display:flex;justify-content:flex-start}.switch___1jFlm .switchUser___38oOw{width:200px;margin-left:33px}.switch___1jFlm .switchUser___38oOw .ant-select{width:100%!important}.dimensionIntentionForm___FyYSx{margin-bottom:-24px!important;margin-top:10px;margin-left:26px}.classTable____ikBn .ant-pro-table-search-query-filter{padding-left:0!important}.classTable____ikBn .ant-table-tbody>tr.ant-table-row-selected>td{background:none}.classTableSelectColumnAlignLeft___sqT0O .ant-table-selection-column{text-align:left}.permissionDrawer___D8WZs .ant-drawer-body{background:#f8f9fb}.domainSelector___NAmEr{display:flex;width:-webkit-max-content;width:-moz-max-content;width:max-content;padding:0 11px;cursor:pointer;position:relative;border-radius:4px;transition:all .3s cubic-bezier(.645,.045,.355,1);color:rgba(0,10,36,.8509803921568627)}.domainSelector___NAmEr .downIcon___1oUlL{margin-left:10px;font-size:14px}.domainSelector___NAmEr:hover{color:#296df3}.overviewExtraContainer___2blJS{display:flex;font-size:14px}.overviewExtraContainer___2blJS .extraWrapper___1WW79{display:flex;width:100%}.overviewExtraContainer___2blJS .extraWrapper___1WW79 .extraStatistic___2jUk3{display:inline-flex;color:rgba(42,46,54,.65);box-sizing:border-box;margin:0;padding:0;font-size:14px;line-height:1.57142857;list-style:none}.overviewExtraContainer___2blJS .extraWrapper___1WW79 .extraStatistic___2jUk3 .extraTitle___3z5J2{font-size:12px;-webkit-margin-end:6px;margin-inline-end:6px;-webkit-margin-after:0;margin-block-end:0;margin-bottom:4px;color:rgba(42,46,54,.45)}.overviewExtraContainer___2blJS .extraWrapper___1WW79 .extraStatistic___2jUk3 .extraValue___2Ir7u{font-size:12px;color:rgba(42,46,54,.65);display:inline-block;direction:ltr}.infoTagList___2JA93 .siteTagPlus___1xPLu{background:#fff;border-style:dashed}.infoTagList___2JA93 .editTag___3QSGZ{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.infoTagList___2JA93 .tagInput___3FcCc{width:78px;margin-right:8px;vertical-align:top}.infoTagList___2JA93 [data-theme=dark] .siteTagPlus___1xPLu{background:transparent;border-style:dashed}.ant-input-number-affix-wrapper{display:inline-block;width:100%;min-width:0;color:rgba(0,10,36,.85);font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;transition:all .3s;position:relative;display:inline-flex;width:90px;padding:0;-webkit-padding-start:11px;padding-inline-start:11px}.ant-input-number-affix-wrapper::-webkit-input-placeholder{color:#bfbfbf;-webkit-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper::-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-number-affix-wrapper:hover{border-color:#4e86f5;border-right-width:1px}.ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper:focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper-borderless,.ant-input-number-affix-wrapper-borderless-disabled,.ant-input-number-affix-wrapper-borderless-focused,.ant-input-number-affix-wrapper-borderless:focus,.ant-input-number-affix-wrapper-borderless:hover,.ant-input-number-affix-wrapper-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-number-affix-wrapper{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-number-affix-wrapper-lg{padding:6.5px 11px;font-size:16px}.ant-input-number-affix-wrapper-sm{padding:0 7px}.ant-input-number-affix-wrapper:not(.ant-input-number-affix-wrapper-disabled):hover{border-color:#4e86f5;border-right-width:1px;z-index:1}.ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper:focus{z-index:1}.ant-input-number-affix-wrapper-disabled .ant-input-number[disabled]{background:transparent}.ant-input-number-affix-wrapper>div.ant-input-number{width:100%;border:none;outline:none}.ant-input-number-affix-wrapper>div.ant-input-number.ant-input-number-focused{box-shadow:none!important}.ant-input-number-affix-wrapper input.ant-input-number-input{padding:0}.ant-input-number-affix-wrapper:before{display:inline-block;width:0;visibility:hidden;content:"\a0"}.ant-input-number-affix-wrapper .ant-input-number-handler-wrap{z-index:2}.ant-input-number-prefix,.ant-input-number-suffix{display:flex;flex:none;align-items:center;pointer-events:none}.ant-input-number-prefix{-webkit-margin-end:4px;margin-inline-end:4px}.ant-input-number-suffix{position:absolute;top:0;right:0;z-index:1;height:100%;margin-right:11px;margin-left:4px}.ant-input-number-group-wrapper .ant-input-number-affix-wrapper{width:100%}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#ef4872}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus{border-color:#fc7492;box-shadow:0 0 0 2px rgba(239,72,114,.2);border-right-width:1px;outline:0}.ant-input-number-status-error .ant-input-number-prefix{color:#ef4872}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#ffb924}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus{border-color:#ffcc4d;box-shadow:0 0 0 2px rgba(255,185,36,.2);border-right-width:1px;outline:0}.ant-input-number-status-warning .ant-input-number-prefix{color:#ffb924}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#ef4872}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus{border-color:#fc7492;box-shadow:0 0 0 2px rgba(239,72,114,.2);border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-status-error .ant-input-number-prefix{color:#ef4872}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#ffb924}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus{border-color:#ffcc4d;box-shadow:0 0 0 2px rgba(255,185,36,.2);border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-status-warning .ant-input-number-prefix{color:#ffb924}.ant-input-number-group-wrapper-status-error .ant-input-number-group-addon{color:#ef4872;border-color:#ef4872}.ant-input-number-group-wrapper-status-warning .ant-input-number-group-addon{color:#ffb924;border-color:#ffb924}.ant-input-number{box-sizing:border-box;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum","tnum";position:relative;width:100%;min-width:0;color:rgba(0,10,36,.85);font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;transition:all .3s;display:inline-block;width:90px;margin:0;padding:0;border:1px solid #d9d9d9;border-radius:4px}.ant-input-number::-webkit-input-placeholder{color:#bfbfbf;-webkit-user-select:none;user-select:none}.ant-input-number:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number::-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number:placeholder-shown{text-overflow:ellipsis}.ant-input-number-focused,.ant-input-number:focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-input-number[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-borderless,.ant-input-number-borderless-disabled,.ant-input-number-borderless-focused,.ant-input-number-borderless:focus,.ant-input-number-borderless:hover,.ant-input-number-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-number{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-number-lg{padding:6.5px 11px}.ant-input-number-sm{padding:0 7px}.ant-input-number-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:table;width:100%;border-collapse:separate;border-spacing:0}.ant-input-number-group[class*=col-]{float:none;padding-right:0;padding-left:0}.ant-input-number-group>[class*=col-]{padding-right:8px}.ant-input-number-group>[class*=col-]:last-child{padding-right:0}.ant-input-number-group-addon,.ant-input-number-group-wrap,.ant-input-number-group>.ant-input-number{display:table-cell}.ant-input-number-group-addon:not(:first-child):not(:last-child),.ant-input-number-group-wrap:not(:first-child):not(:last-child),.ant-input-number-group>.ant-input-number:not(:first-child):not(:last-child){border-radius:0}.ant-input-number-group-addon,.ant-input-number-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-number-group-wrap>*{display:block!important}.ant-input-number-group .ant-input-number{float:left;width:100%;margin-bottom:0;text-align:inherit}.ant-input-number-group .ant-input-number:focus{z-index:1;border-right-width:1px}.ant-input-number-group .ant-input-number:hover{z-index:1;border-right-width:1px}.ant-input-search-with-button .ant-input-number-group .ant-input-number:hover{z-index:0}.ant-input-number-group-addon{position:relative;padding:0 11px;color:rgba(0,10,36,.85);font-weight:400;font-size:14px;text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:4px;transition:all .3s}.ant-input-number-group-addon .ant-select{margin:-5px -11px}.ant-input-number-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid transparent;box-shadow:none}.ant-input-number-group-addon .ant-select-focused .ant-select-selector,.ant-input-number-group-addon .ant-select-open .ant-select-selector{color:#296df3}.ant-input-number-group-addon .ant-cascader-picker{margin:-9px -12px;background-color:transparent}.ant-input-number-group-addon .ant-cascader-picker .ant-cascader-input{text-align:left;border:0;box-shadow:none}.ant-input-number-group-addon:first-child,.ant-input-number-group>.ant-input-number:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group-addon:first-child .ant-select .ant-select-selector,.ant-input-number-group>.ant-input-number:first-child .ant-select .ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:first-child) .ant-input-number{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:last-child) .ant-input-number{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group-addon:first-child{border-right:0}.ant-input-number-group-addon:last-child{border-left:0}.ant-input-number-group-addon:last-child,.ant-input-number-group>.ant-input-number:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group-addon:last-child .ant-select .ant-select-selector,.ant-input-number-group>.ant-input-number:last-child .ant-select .ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group-lg .ant-input-number,.ant-input-number-group-lg>.ant-input-number-group-addon{padding:6.5px 11px;font-size:16px}.ant-input-number-group-sm .ant-input-number,.ant-input-number-group-sm>.ant-input-number-group-addon{padding:0 7px}.ant-input-number-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-number-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child),.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group.ant-input-number-group-compact{display:block}.ant-input-number-group.ant-input-number-group-compact:before{display:table;content:""}.ant-input-number-group.ant-input-number-group-compact:after{display:table;clear:both;content:""}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):focus{z-index:1}.ant-input-number-group.ant-input-number-group-compact>*{display:inline-block;float:none;vertical-align:top;border-radius:0}.ant-input-number-group.ant-input-number-group-compact>.ant-input-number-affix-wrapper,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number-number-affix-wrapper,.ant-input-number-group.ant-input-number-group-compact>.ant-picker-range{display:inline-flex}.ant-input-number-group.ant-input-number-group-compact>:not(:last-child){margin-right:-1px;border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-number{float:none}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector{border-right-width:1px;border-radius:0}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:focus{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select-focused{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-arrow{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker-focused:last-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>:last-child{border-right-width:1px;border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper{border-radius:0}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:4px 0 0 4px}.ant-input-number-group>.ant-input-number-rtl:first-child{border-radius:0 4px 4px 0}.ant-input-number-group>.ant-input-number-rtl:last-child{border-radius:4px 0 0 4px}.ant-input-number-group-rtl .ant-input-number-group-addon:first-child{border-right:1px solid #d9d9d9;border-left:0;border-radius:0 4px 4px 0}.ant-input-number-group-rtl .ant-input-number-group-addon:last-child{border-right:0;border-left:1px solid #d9d9d9;border-radius:4px 0 0 4px}.ant-input-number-group-wrapper{display:inline-block;text-align:start;vertical-align:top}.ant-input-number-handler{position:relative;display:block;width:100%;height:50%;overflow:hidden;color:rgba(0,10,36,.65);font-weight:700;line-height:0;text-align:center;border-left:1px solid #d9d9d9;transition:all .1s linear}.ant-input-number-handler:active{background:#f4f4f4}.ant-input-number-handler:hover .ant-input-number-handler-down-inner,.ant-input-number-handler:hover .ant-input-number-handler-up-inner{color:#4e86f5}.ant-input-number-handler-down-inner,.ant-input-number-handler-up-inner{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;right:4px;width:12px;height:12px;color:rgba(0,10,36,.65);line-height:12px;transition:all .1s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-handler-down-inner>*,.ant-input-number-handler-up-inner>*{line-height:1}.ant-input-number-handler-down-inner svg,.ant-input-number-handler-up-inner svg{display:inline-block}.ant-input-number-handler-down-inner:before,.ant-input-number-handler-up-inner:before{display:none}.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon{display:block}.ant-input-number:hover{border-color:#4e86f5;border-right-width:1px}.ant-input-number:hover+.ant-form-item-children-icon{opacity:0;transition:opacity .24s linear .24s}.ant-input-number-focused{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-input-number-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-disabled .ant-input-number-input{cursor:not-allowed}.ant-input-number-disabled .ant-input-number-handler-wrap{display:none}.ant-input-number-readonly .ant-input-number-handler-wrap{display:none}.ant-input-number-input{width:100%;height:30px;padding:0 11px;text-align:left;background-color:transparent;border:0;border-radius:4px;outline:0;transition:all .3s linear;-webkit-appearance:textfield!important;-moz-appearance:textfield!important;appearance:textfield!important}.ant-input-number-input::-webkit-input-placeholder{color:#bfbfbf;-webkit-user-select:none;user-select:none}.ant-input-number-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-input::-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-input:placeholder-shown{text-overflow:ellipsis}.ant-input-number-input[type=number]::-webkit-inner-spin-button,.ant-input-number-input[type=number]::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.ant-input-number-lg{padding:0;font-size:16px}.ant-input-number-lg input{height:38px}.ant-input-number-sm{padding:0}.ant-input-number-sm input{height:22px;padding:0 7px}.ant-input-number-handler-wrap{position:absolute;top:0;right:0;width:22px;height:100%;background:#fff;border-radius:0 4px 4px 0;opacity:0;transition:opacity .24s linear .1s}.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner,.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner{display:flex;align-items:center;justify-content:center;min-width:auto;margin-right:0;font-size:7px}.ant-input-number-borderless .ant-input-number-handler-wrap{border-left-width:0}.ant-input-number-handler-wrap:hover .ant-input-number-handler{height:40%}.ant-input-number-focused .ant-input-number-handler-wrap,.ant-input-number:hover .ant-input-number-handler-wrap{opacity:1}.ant-input-number-handler-up{border-top-right-radius:4px;cursor:pointer}.ant-input-number-handler-up-inner{top:50%;margin-top:-5px;text-align:center}.ant-input-number-handler-up:hover{height:60%!important}.ant-input-number-handler-down{top:0;border-top:1px solid #d9d9d9;border-bottom-right-radius:4px;cursor:pointer}.ant-input-number-handler-down-inner{top:50%;text-align:center;transform:translateY(-50%)}.ant-input-number-handler-down:hover{height:60%!important}.ant-input-number-borderless .ant-input-number-handler-down{border-top-width:0}.ant-input-number-focused:not(.ant-input-number-borderless) .ant-input-number-handler-down,.ant-input-number:hover:not(.ant-input-number-borderless) .ant-input-number-handler-down{border-top:1px solid #d9d9d9}.ant-input-number-handler-down-disabled,.ant-input-number-handler-up-disabled{cursor:not-allowed}.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner,.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner{color:rgba(0,0,0,.25)}.ant-input-number-borderless{box-shadow:none}.ant-input-number-out-of-range input{color:#ef4872}.ant-input-number-compact-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl){margin-right:-1px}.ant-input-number-compact-item:not(.ant-input-number-compact-last-item).ant-input-number-compact-item-rtl{margin-left:-1px}.ant-input-number-compact-item:active,.ant-input-number-compact-item:focus,.ant-input-number-compact-item:hover{z-index:2}.ant-input-number-compact-item.ant-input-number-focused{z-index:2}.ant-input-number-compact-item[disabled]{z-index:0}.ant-input-number-compact-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-last-item).ant-input-number{border-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-rtl{direction:rtl}.ant-input-number-rtl .ant-input-number-handler{border-right:1px solid #d9d9d9;border-left:0}.ant-input-number-rtl .ant-input-number-handler-wrap{right:auto;left:0}.ant-input-number-rtl.ant-input-number-borderless .ant-input-number-handler-wrap{border-right-width:0}.ant-input-number-rtl .ant-input-number-handler-up{border-top-right-radius:0}.ant-input-number-rtl .ant-input-number-handler-down{border-bottom-right-radius:0}.ant-input-number-rtl .ant-input-number-input{direction:ltr;text-align:right}.ant-transfer-customize-list .ant-transfer-list{flex:1 1 50%;width:auto;height:auto;min-height:200px}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small{border:0;border-radius:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column{width:40px;min-width:40px}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th{background:#fafafa}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content .ant-table-row:last-child td{border-bottom:1px solid #f0f0f0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-body{margin:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-pagination.ant-pagination{margin:16px 0 4px}.ant-transfer-customize-list .ant-input[disabled]{background-color:transparent}.ant-transfer-status-error .ant-transfer-list{border-color:#ef4872}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):hover{border-color:#4e86f5;border-right-width:1px}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-transfer-status-warning .ant-transfer-list{border-color:#ffb924}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):hover{border-color:#4e86f5;border-right-width:1px}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-transfer{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:flex;align-items:stretch}.ant-transfer-disabled .ant-transfer-list{background:#f5f5f5}.ant-transfer-list{display:flex;flex-direction:column;width:180px;height:200px;border:1px solid #d9d9d9;border-radius:4px}.ant-transfer-list-with-pagination{width:250px;height:auto}.ant-transfer-list-search .anticon-search{color:rgba(0,0,0,.25)}.ant-transfer-list-header{display:flex;flex:none;align-items:center;height:40px;padding:8px 12px 9px;color:rgba(0,10,36,.85);background:#fff;border-bottom:1px solid #f0f0f0;border-radius:4px 4px 0 0}.ant-transfer-list-header>:not(:last-child){margin-right:4px}.ant-transfer-list-header>*{flex:none}.ant-transfer-list-header-title{flex:auto;overflow:hidden;white-space:nowrap;text-align:right;text-overflow:ellipsis}.ant-transfer-list-header-dropdown{font-size:10px;transform:translateY(10%);cursor:pointer}.ant-transfer-list-header-dropdown[disabled]{cursor:not-allowed}.ant-transfer-list-body{display:flex;flex:auto;flex-direction:column;overflow:hidden;font-size:14px}.ant-transfer-list-body-search-wrapper{position:relative;flex:none;padding:12px}.ant-transfer-list-content{flex:auto;margin:0;padding:0;overflow:auto;list-style:none}.ant-transfer-list-content-item{display:flex;align-items:center;min-height:32px;padding:6px 12px;line-height:20px;transition:all .3s}.ant-transfer-list-content-item>:not(:last-child){margin-right:8px}.ant-transfer-list-content-item>*{flex:none}.ant-transfer-list-content-item-text{flex:auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-transfer-list-content-item-remove{position:relative;color:#d9d9d9;cursor:pointer;transition:all .3s}.ant-transfer-list-content-item-remove:hover{color:#5493ff}.ant-transfer-list-content-item-remove:after{position:absolute;top:-6px;right:-50%;bottom:-6px;left:-50%;content:""}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background-color:#f5f5f5;cursor:pointer}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled).ant-transfer-list-content-item-checked:hover{background-color:#d9e6fc}.ant-transfer-list-content-show-remove .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background:transparent;cursor:default}.ant-transfer-list-content-item-checked{background-color:#e3ecfd}.ant-transfer-list-content-item-disabled{color:rgba(0,10,36,.25);cursor:not-allowed}.ant-transfer-list-pagination{padding:8px 0;text-align:right;border-top:1px solid #f0f0f0}.ant-transfer-list-body-not-found{flex:none;width:100%;margin:auto 0;color:rgba(0,0,0,.25);text-align:center}.ant-transfer-list-footer{border-top:1px solid #f0f0f0}.ant-transfer-operation{display:flex;flex:none;flex-direction:column;align-self:center;margin:0 8px;vertical-align:middle}.ant-transfer-operation .ant-btn{display:block}.ant-transfer-operation .ant-btn:first-child{margin-bottom:4px}.ant-transfer-operation .ant-btn .anticon{font-size:12px}.ant-transfer .ant-empty-image{max-height:-2px}.ant-transfer-rtl{direction:rtl}.ant-transfer-rtl .ant-transfer-list-search{padding-right:8px;padding-left:24px}.ant-transfer-rtl .ant-transfer-list-search-action{right:auto;left:12px}.ant-transfer-rtl .ant-transfer-list-header>:not(:last-child){margin-right:0;margin-left:4px}.ant-transfer-rtl .ant-transfer-list-header{right:0;left:auto}.ant-transfer-rtl .ant-transfer-list-header-title{text-align:left}.ant-transfer-rtl .ant-transfer-list-content-item>:not(:last-child){margin-right:0;margin-left:8px}.ant-transfer-rtl .ant-transfer-list-pagination{text-align:left}.ant-transfer-rtl .ant-transfer-list-footer{right:0;left:auto}.ant-checkbox{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-checkbox-input:focus+.ant-checkbox-inner,.ant-checkbox-wrapper:hover .ant-checkbox-inner,.ant-checkbox:hover .ant-checkbox-inner{border-color:#296df3}.ant-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #296df3;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-checkbox-wrapper:hover .ant-checkbox:after,.ant-checkbox:hover:after{visibility:visible}.ant-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-checkbox-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-checkbox-checked .ant-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-checkbox-checked .ant-checkbox-inner{background-color:#296df3;border-color:#296df3}.ant-checkbox-disabled{cursor:not-allowed}.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{border-color:rgba(0,0,0,.25);animation-name:none}.ant-checkbox-disabled .ant-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-checkbox-disabled .ant-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-checkbox-disabled .ant-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-checkbox-disabled:hover:after,.ant-checkbox-wrapper:hover .ant-checkbox-disabled:after{visibility:hidden}.ant-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\a0"}.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled{cursor:not-allowed}.ant-checkbox-wrapper+.ant-checkbox-wrapper{margin-left:8px}.ant-checkbox-wrapper.ant-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-checkbox+span{padding-right:8px;padding-left:8px}.ant-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-block}.ant-checkbox-group-item{margin-right:8px}.ant-checkbox-group-item:last-child{margin-right:0}.ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:0}.ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-checkbox-indeterminate .ant-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#296df3;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after{background-color:rgba(0,0,0,.25);border-color:rgba(0,0,0,.25)}.ant-checkbox-rtl{direction:rtl}.ant-checkbox-group-rtl .ant-checkbox-group-item{margin-right:0;margin-left:8px}.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child{margin-left:0!important}.ant-checkbox-group-rtl .ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:8px}.ant-pagination{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum"}.ant-pagination ol,.ant-pagination ul{margin:0;padding:0;list-style:none}.ant-pagination:after{display:block;clear:both;height:0;overflow:hidden;visibility:hidden;content:" "}.ant-pagination-total-text{display:inline-block;height:32px;margin-right:8px;line-height:30px;vertical-align:middle}.ant-pagination-item{display:inline-block;min-width:32px;height:32px;margin-right:8px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:30px;text-align:center;vertical-align:middle;list-style:none;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;outline:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-item a{display:block;padding:0 6px;color:rgba(0,10,36,.85);transition:none}.ant-pagination-item a:hover{text-decoration:none}.ant-pagination-item:hover{border-color:#296df3;transition:all .3s}.ant-pagination-item:hover a{color:#296df3}.ant-pagination-item:focus-visible{border-color:#296df3;transition:all .3s}.ant-pagination-item:focus-visible a{color:#296df3}.ant-pagination-item-active{font-weight:500;background:#fff;border-color:#296df3}.ant-pagination-item-active a{color:#296df3}.ant-pagination-item-active:hover{border-color:#4e86f5}.ant-pagination-item-active:focus-visible{border-color:#4e86f5}.ant-pagination-item-active:hover a{color:#4e86f5}.ant-pagination-item-active:focus-visible a{color:#4e86f5}.ant-pagination-jump-next,.ant-pagination-jump-prev{outline:0}.ant-pagination-jump-next .ant-pagination-item-container,.ant-pagination-jump-prev .ant-pagination-item-container{position:relative}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon{color:#296df3;font-size:12px;letter-spacing:-1px;opacity:0;transition:all .2s}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg{top:0;right:0;bottom:0;left:0;margin:auto}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis{position:absolute;top:0;right:0;bottom:0;left:0;display:block;margin:auto;color:rgba(0,0,0,.25);font-family:Arial,Helvetica,sans-serif;letter-spacing:2px;text-align:center;text-indent:.13em;opacity:1;transition:all .2s}.ant-pagination-jump-next:hover .ant-pagination-item-link-icon,.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-next:focus-visible .ant-pagination-item-link-icon,.ant-pagination-jump-prev:focus-visible .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-next:focus-visible .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:focus-visible .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-prev{margin-right:8px}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-next,.ant-pagination-prev{display:inline-block;min-width:32px;height:32px;color:rgba(0,10,36,.85);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:32px;text-align:center;vertical-align:middle;list-style:none;border-radius:4px;cursor:pointer;transition:all .3s}.ant-pagination-next,.ant-pagination-prev{font-family:Arial,Helvetica,sans-serif;outline:0}.ant-pagination-next button,.ant-pagination-prev button{color:rgba(0,10,36,.85);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-next:hover button,.ant-pagination-prev:hover button{border-color:#4e86f5}.ant-pagination-next .ant-pagination-item-link,.ant-pagination-prev .ant-pagination-item-link{display:block;width:100%;height:100%;padding:0;font-size:12px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;outline:none;transition:all .3s}.ant-pagination-next:focus-visible .ant-pagination-item-link,.ant-pagination-prev:focus-visible .ant-pagination-item-link{color:#296df3;border-color:#296df3}.ant-pagination-next:hover .ant-pagination-item-link,.ant-pagination-prev:hover .ant-pagination-item-link{color:#296df3;border-color:#296df3}.ant-pagination-disabled,.ant-pagination-disabled:hover{cursor:not-allowed}.ant-pagination-disabled .ant-pagination-item-link,.ant-pagination-disabled:hover .ant-pagination-item-link{color:rgba(0,0,0,.25);border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-disabled:focus-visible{cursor:not-allowed}.ant-pagination-disabled:focus-visible .ant-pagination-item-link{color:rgba(0,0,0,.25);border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-slash{margin:0 10px 0 5px}.ant-pagination-options{display:inline-block;margin-left:16px;vertical-align:middle}@media (-ms-high-contrast:none){.ant-pagination-options,.ant-pagination-options ::-ms-backdrop{vertical-align:top}}.ant-pagination-options-size-changer.ant-select{display:inline-block;width:auto}.ant-pagination-options-quick-jumper{display:inline-block;height:32px;margin-left:8px;line-height:32px;vertical-align:top}.ant-pagination-options-quick-jumper input{position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:rgba(0,10,36,.85);font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;transition:all .3s;width:50px;height:32px;margin:0 8px}.ant-pagination-options-quick-jumper input::-webkit-input-placeholder{color:#bfbfbf;-webkit-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input::-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:placeholder-shown{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:hover{border-color:#4e86f5;border-right-width:1px}.ant-pagination-options-quick-jumper input-focused,.ant-pagination-options-quick-jumper input:focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-pagination-options-quick-jumper input-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input-borderless,.ant-pagination-options-quick-jumper input-borderless-disabled,.ant-pagination-options-quick-jumper input-borderless-focused,.ant-pagination-options-quick-jumper input-borderless:focus,.ant-pagination-options-quick-jumper input-borderless:hover,.ant-pagination-options-quick-jumper input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-pagination-options-quick-jumper input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-pagination-options-quick-jumper input-lg{padding:6.5px 11px;font-size:16px}.ant-pagination-options-quick-jumper input-sm{padding:0 7px}.ant-pagination-simple .ant-pagination-next,.ant-pagination-simple .ant-pagination-prev{height:24px;line-height:24px;vertical-align:top}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link{height:24px;background-color:transparent;border:0}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination-simple .ant-pagination-simple-pager{display:inline-block;height:24px;margin-right:8px}.ant-pagination-simple .ant-pagination-simple-pager input{box-sizing:border-box;height:100%;margin-right:8px;padding:0 6px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;outline:none;transition:border-color .3s}.ant-pagination-simple .ant-pagination-simple-pager input:hover{border-color:#296df3}.ant-pagination-simple .ant-pagination-simple-pager input:focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2)}.ant-pagination-simple .ant-pagination-simple-pager input[disabled]{color:rgba(0,0,0,.25);background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination.ant-pagination-mini .ant-pagination-simple-pager,.ant-pagination.ant-pagination-mini .ant-pagination-total-text{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-item{min-width:24px;height:24px;margin:0;line-height:22px}.ant-pagination.ant-pagination-mini .ant-pagination-item:not(.ant-pagination-item-active){background:transparent;border-color:transparent}.ant-pagination.ant-pagination-mini .ant-pagination-next,.ant-pagination.ant-pagination-mini .ant-pagination-prev{min-width:24px;height:24px;margin:0;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link,.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link{background:transparent;border-color:transparent}.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-jump-next,.ant-pagination.ant-pagination-mini .ant-pagination-jump-prev{height:24px;margin-right:0;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-options{margin-left:2px}.ant-pagination.ant-pagination-mini .ant-pagination-options-size-changer{top:0}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper input{padding:0 7px;width:44px;height:24px}.ant-pagination.ant-pagination-disabled{cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item a{color:rgba(0,0,0,.25);background:transparent;border:none;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active{background:#e6e6e6}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active a{color:rgba(0,0,0,.25)}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{color:rgba(0,0,0,.25);background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-simple.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{background:transparent}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link-icon{opacity:0}.ant-pagination.ant-pagination-disabled .ant-pagination-item-ellipsis{opacity:1}.ant-pagination.ant-pagination-disabled .ant-pagination-simple-pager{color:rgba(0,0,0,.25)}@media only screen and (max-width:992px){.ant-pagination-item-after-jump-prev,.ant-pagination-item-before-jump-next{display:none}}@media only screen and (max-width:576px){.ant-pagination-options{display:none}}.ant-pagination-rtl .ant-pagination-total-text{margin-right:0;margin-left:8px}.ant-pagination-rtl .ant-pagination-item,.ant-pagination-rtl .ant-pagination-jump-next,.ant-pagination-rtl .ant-pagination-jump-prev,.ant-pagination-rtl .ant-pagination-prev{margin-right:0;margin-left:8px}.ant-pagination-rtl .ant-pagination-slash{margin:0 5px 0 10px}.ant-pagination-rtl .ant-pagination-options{margin-right:16px;margin-left:0}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-size-changer.ant-select{margin-right:0;margin-left:8px}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-quick-jumper{margin-left:0}.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager{margin-right:0;margin-left:8px}.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager input{margin-right:0;margin-left:8px}.ant-pagination-rtl.ant-pagination.mini .ant-pagination-options{margin-right:2px;margin-left:0}.ant-table.ant-table-middle{font-size:14px}.ant-table.ant-table-middle .ant-table-footer,.ant-table.ant-table-middle .ant-table-tbody>tr>td,.ant-table.ant-table-middle .ant-table-thead>tr>th,.ant-table.ant-table-middle .ant-table-title,.ant-table.ant-table-middle tfoot>tr>td,.ant-table.ant-table-middle tfoot>tr>th{padding:12px 8px}.ant-table.ant-table-middle .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-middle .ant-table-expanded-row-fixed{margin:-12px -8px}.ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-12px -8px -12px 40px}.ant-table.ant-table-middle .ant-table-selection-column{-webkit-padding-start:2px;padding-inline-start:2px}.ant-table.ant-table-small{font-size:14px}.ant-table.ant-table-small .ant-table-footer,.ant-table.ant-table-small .ant-table-tbody>tr>td,.ant-table.ant-table-small .ant-table-thead>tr>th,.ant-table.ant-table-small .ant-table-title,.ant-table.ant-table-small tfoot>tr>td,.ant-table.ant-table-small tfoot>tr>th{padding:8px}.ant-table.ant-table-small .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-small .ant-table-expanded-row-fixed{margin:-8px}.ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-8px -8px -8px 40px}.ant-table.ant-table-small .ant-table-selection-column{-webkit-padding-start:2px;padding-inline-start:2px}.ant-table.ant-table-bordered>.ant-table-title{border:1px solid #f0f0f0;border-bottom:0}.ant-table.ant-table-bordered>.ant-table-container{border-left:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr:not(:last-child)>th{border-bottom:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th:before{background-color:transparent!important}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>.ant-table-cell-fix-right-first:after{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-16px -17px}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed:after{position:absolute;top:0;right:1px;bottom:0;border-right:1px solid #f0f0f0;content:""}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table{border-top:1px solid #f0f0f0}.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-expanded-row>td,.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-placeholder>td{border-right:0}.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-12px -9px}.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-8px -9px}.ant-table.ant-table-bordered>.ant-table-footer{border:1px solid #f0f0f0;border-top:0}.ant-table-cell .ant-table-container:first-child{border-top:0}.ant-table-cell-scrollbar:not([rowspan]){box-shadow:0 1px 0 1px #fafafa}.ant-table-wrapper{clear:both;max-width:100%}.ant-table-wrapper:before{display:table;content:""}.ant-table-wrapper:after{display:table;clear:both;content:""}.ant-table{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;font-size:14px;background:#fff;border-radius:4px}.ant-table table{width:100%;text-align:left;border-radius:4px 4px 0 0;border-collapse:separate;border-spacing:0}.ant-table-tbody>tr>td,.ant-table-thead>tr>th,.ant-table tfoot>tr>td,.ant-table tfoot>tr>th{position:relative;padding:16px;overflow-wrap:break-word}.ant-table-cell-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first{overflow:visible}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content{display:block;overflow:hidden;text-overflow:ellipsis}.ant-table-cell-ellipsis .ant-table-column-title{overflow:hidden;text-overflow:ellipsis;word-break:keep-all}.ant-table-title{padding:16px}.ant-table-footer{padding:16px;color:rgba(0,10,36,.85);background:#fafafa}.ant-table-thead>tr>th{position:relative;color:rgba(0,10,36,.85);font-weight:500;text-align:left;background:#fafafa;border-bottom:1px solid #f0f0f0;transition:background .3s ease}.ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{position:absolute;top:50%;right:0;width:1px;height:1.6em;background-color:rgba(0,0,0,.06);transform:translateY(-50%);transition:background-color .3s;content:""}.ant-table-thead>tr:not(:last-child)>th[colspan]{border-bottom:0}.ant-table-tbody>tr>td{border-bottom:1px solid #f0f0f0;transition:background .3s}.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table{margin:-16px -16px -16px 32px}.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td{border-bottom:0}.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child{border-radius:0}.ant-table-tbody>tr.ant-table-row:hover>td,.ant-table-tbody>tr>td.ant-table-cell-row-hover{background:#fafafa}.ant-table-tbody>tr.ant-table-row-selected>td{background:#e3ecfd;border-color:rgba(0,0,0,.03)}.ant-table-tbody>tr.ant-table-row-selected:hover>td{background:#d9e6fc}.ant-table-summary{position:relative;z-index:2;background:#fff}div.ant-table-summary{box-shadow:0 -1px 0 #f0f0f0}.ant-table-summary>tr>td,.ant-table-summary>tr>th{border-bottom:1px solid #f0f0f0}.ant-table-pagination.ant-pagination{margin:16px 0}.ant-table-pagination{display:flex;flex-wrap:wrap;grid-row-gap:8px;row-gap:8px}.ant-table-pagination>*{flex:none}.ant-table-pagination-left{justify-content:flex-start}.ant-table-pagination-center{justify-content:center}.ant-table-pagination-right{justify-content:flex-end}.ant-table-thead th.ant-table-column-has-sorters{outline:none;cursor:pointer;transition:all .3s}.ant-table-thead th.ant-table-column-has-sorters:hover{background:rgba(0,0,0,.04)}.ant-table-thead th.ant-table-column-has-sorters:hover:before{background-color:transparent!important}.ant-table-thead th.ant-table-column-has-sorters:focus-visible{color:#296df3}.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover,.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover{background:#f5f5f5}.ant-table-thead th.ant-table-column-sort{background:#f5f5f5}.ant-table-thead th.ant-table-column-sort:before{background-color:transparent!important}td.ant-table-column-sort{background:#fafafa}.ant-table-column-title{position:relative;z-index:1;flex:1 1}.ant-table-column-sorters{display:flex;flex:auto;align-items:center;justify-content:space-between}.ant-table-column-sorters:after{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;content:""}.ant-table-column-sorter{margin-left:4px;color:#bfbfbf;font-size:0;transition:color .3s}.ant-table-column-sorter-inner{display:inline-flex;flex-direction:column;align-items:center}.ant-table-column-sorter-down,.ant-table-column-sorter-up{font-size:11px}.ant-table-column-sorter-down.active,.ant-table-column-sorter-up.active{color:#296df3}.ant-table-column-sorter-up+.ant-table-column-sorter-down{margin-top:-.3em}.ant-table-column-sorters:hover .ant-table-column-sorter{color:#a6a6a6}.ant-table-filter-column{display:flex;justify-content:space-between}.ant-table-filter-trigger{position:relative;display:flex;align-items:center;margin:-4px -8px -4px 4px;padding:0 4px;color:#bfbfbf;font-size:12px;border-radius:4px;cursor:pointer;transition:all .3s}.ant-table-filter-trigger:hover{color:rgba(0,10,36,.65);background:rgba(0,0,0,.04)}.ant-table-filter-trigger.active{color:#296df3}.ant-table-filter-dropdown{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";min-width:120px;background-color:#fff;border-radius:4px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05)}.ant-table-filter-dropdown .ant-dropdown-menu{max-height:264px;overflow-x:hidden;border:0;box-shadow:none}.ant-table-filter-dropdown .ant-dropdown-menu:empty:after{display:block;padding:8px 0;color:rgba(0,0,0,.25);font-size:12px;text-align:center;content:"Not Found"}.ant-table-filter-dropdown-tree{padding:8px 8px 0}.ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper,.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover{background-color:#bed2fb}.ant-table-filter-dropdown-search{padding:8px;border-bottom:1px solid #f0f0f0}.ant-table-filter-dropdown-search-input input{min-width:140px}.ant-table-filter-dropdown-search-input .anticon{color:rgba(0,0,0,.25)}.ant-table-filter-dropdown-checkall{width:100%;margin-bottom:4px;margin-left:4px}.ant-table-filter-dropdown-submenu>ul{max-height:calc(100vh - 130px);overflow-x:hidden;overflow-y:auto}.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span,.ant-table-filter-dropdown .ant-checkbox-wrapper+span{padding-left:8px}.ant-table-filter-dropdown-btns{display:flex;justify-content:space-between;padding:7px 8px;overflow:hidden;background-color:inherit;border-top:1px solid #f0f0f0}.ant-table-selection-col{width:32px}.ant-table-bordered .ant-table-selection-col{width:50px}table tr td.ant-table-selection-column,table tr th.ant-table-selection-column{padding-right:8px;padding-left:8px;text-align:center}table tr td.ant-table-selection-column .ant-radio-wrapper,table tr th.ant-table-selection-column .ant-radio-wrapper{margin-right:0}table tr th.ant-table-selection-column.ant-table-cell-fix-left{z-index:3}table tr th.ant-table-selection-column:after{background-color:transparent!important}.ant-table-selection{position:relative;display:inline-flex;flex-direction:column}.ant-table-selection-extra{position:absolute;top:0;z-index:1;cursor:pointer;transition:all .3s;-webkit-margin-start:100%;margin-inline-start:100%;-webkit-padding-start:4px;padding-inline-start:4px}.ant-table-selection-extra .anticon{color:#bfbfbf;font-size:10px}.ant-table-selection-extra .anticon:hover{color:#a6a6a6}.ant-table-expand-icon-col{width:48px}.ant-table-row-expand-icon-cell{text-align:center}.ant-table-row-expand-icon-cell .ant-table-row-expand-icon{display:inline-flex;float:none;vertical-align:sub}.ant-table-row-indent{float:left;height:1px}.ant-table-row-expand-icon{color:#296df3;outline:none;cursor:pointer;transition:color .3s;position:relative;float:left;box-sizing:border-box;width:17px;height:17px;padding:0;color:inherit;line-height:17px;background:#fff;border:1px solid #f0f0f0;border-radius:4px;transform:scale(.94117647);transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-table-row-expand-icon:focus-visible,.ant-table-row-expand-icon:hover{color:#5493ff}.ant-table-row-expand-icon:active{color:#184ecc}.ant-table-row-expand-icon:active,.ant-table-row-expand-icon:focus,.ant-table-row-expand-icon:hover{border-color:currentcolor}.ant-table-row-expand-icon:after,.ant-table-row-expand-icon:before{position:absolute;background:currentcolor;transition:transform .3s ease-out;content:""}.ant-table-row-expand-icon:before{top:7px;right:3px;left:3px;height:1px}.ant-table-row-expand-icon:after{top:3px;bottom:3px;left:7px;width:1px;transform:rotate(90deg)}.ant-table-row-expand-icon-collapsed:before{transform:rotate(-180deg)}.ant-table-row-expand-icon-collapsed:after{transform:rotate(0deg)}.ant-table-row-expand-icon-spaced{background:transparent;border:0;visibility:hidden}.ant-table-row-expand-icon-spaced:after,.ant-table-row-expand-icon-spaced:before{display:none;content:none}.ant-table-row-indent+.ant-table-row-expand-icon{margin-top:2.5005px;margin-right:8px}tr.ant-table-expanded-row:hover>td,tr.ant-table-expanded-row>td{background:#fbfbfb}tr.ant-table-expanded-row .ant-descriptions-view{display:flex}tr.ant-table-expanded-row .ant-descriptions-view table{flex:auto;width:auto}.ant-table .ant-table-expanded-row-fixed{position:relative;margin:-16px;padding:16px}.ant-table-tbody>tr.ant-table-placeholder{text-align:center}.ant-table-empty .ant-table-tbody>tr.ant-table-placeholder{color:rgba(0,0,0,.25)}.ant-table-tbody>tr.ant-table-placeholder:hover>td{background:#fff}.ant-table-cell-fix-left,.ant-table-cell-fix-right{position:-webkit-sticky!important;position:sticky!important;z-index:2;background:#fff}.ant-table-cell-fix-left-first:after,.ant-table-cell-fix-left-last:after{position:absolute;top:0;right:0;bottom:-1px;width:30px;transform:translateX(100%);transition:box-shadow .3s;content:"";pointer-events:none}.ant-table-cell-fix-left-all:after{display:none}.ant-table-cell-fix-right-first:after,.ant-table-cell-fix-right-last:after{position:absolute;top:0;bottom:-1px;left:0;width:30px;transform:translateX(-100%);transition:box-shadow .3s;content:"";pointer-events:none}.ant-table .ant-table-container:after,.ant-table .ant-table-container:before{position:absolute;top:0;bottom:0;z-index:4;width:30px;transition:box-shadow .3s;content:"";pointer-events:none}.ant-table .ant-table-container:before{left:0}.ant-table .ant-table-container:after{right:0}.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container{position:relative}.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container:before{box-shadow:inset 10px 0 8px -8px rgba(0,0,0,.15)}.ant-table-ping-left .ant-table-cell-fix-left-first:after,.ant-table-ping-left .ant-table-cell-fix-left-last:after{box-shadow:inset 10px 0 8px -8px rgba(0,0,0,.15)}.ant-table-ping-left .ant-table-cell-fix-left-last:before{background-color:transparent!important}.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container{position:relative}.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container:after{box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15)}.ant-table-ping-right .ant-table-cell-fix-right-first:after,.ant-table-ping-right .ant-table-cell-fix-right-last:after{box-shadow:inset -10px 0 8px -8px rgba(0,0,0,.15)}.ant-table-sticky-holder{position:-webkit-sticky;position:sticky;z-index:3;background:#fff}.ant-table-sticky-scroll{position:-webkit-sticky;position:sticky;bottom:0;z-index:3;display:flex;align-items:center;background:#fff;border-top:1px solid #f0f0f0;opacity:.6}.ant-table-sticky-scroll:hover{transform-origin:center bottom}.ant-table-sticky-scroll-bar{height:8px;background-color:rgba(0,0,0,.35);border-radius:4px}.ant-table-sticky-scroll-bar:hover{background-color:rgba(0,0,0,.8)}.ant-table-sticky-scroll-bar-active{background-color:rgba(0,0,0,.8)}@media (-ms-high-contrast:none){.ant-table-ping-left .ant-table-cell-fix-left-last:after{box-shadow:none!important}.ant-table-ping-right .ant-table-cell-fix-right-first:after{box-shadow:none!important}}.ant-table-title{border-radius:4px 4px 0 0}.ant-table-title+.ant-table-container{border-top-left-radius:0;border-top-right-radius:0}.ant-table-title+.ant-table-container table{border-radius:0}.ant-table-title+.ant-table-container table>thead>tr:first-child th:first-child{border-radius:0}.ant-table-title+.ant-table-container table>thead>tr:first-child th:last-child{border-radius:0}.ant-table-container{border-top-left-radius:4px;border-top-right-radius:4px}.ant-table-container table>thead>tr:first-child th:first-child{border-top-left-radius:4px}.ant-table-container table>thead>tr:first-child th:last-child{border-top-right-radius:4px}.ant-table-footer{border-radius:0 0 4px 4px}.ant-table-wrapper-rtl{direction:rtl}.ant-table-rtl{direction:rtl}.ant-table-wrapper-rtl .ant-table table{text-align:right}.ant-table-wrapper-rtl .ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-wrapper-rtl .ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{right:auto;left:0}.ant-table-wrapper-rtl .ant-table-thead>tr>th{text-align:right}.ant-table-tbody>tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl{margin:-16px 33px -16px -16px}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left{justify-content:flex-end}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right{justify-content:flex-start}.ant-table-wrapper-rtl .ant-table-column-sorter{margin-right:4px;margin-left:0}.ant-table-wrapper-rtl .ant-table-filter-column-title{padding:16px 16px 16px 2.3em}.ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title{padding:0 0 0 2.3em}.ant-table-wrapper-rtl .ant-table-filter-trigger{margin:-4px 4px -4px -8px}.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span,.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span,.ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper+span{padding-right:8px;padding-left:0}.ant-table-wrapper-rtl .ant-table-selection{text-align:center}.ant-table-wrapper-rtl .ant-table-row-indent{float:right}.ant-table-wrapper-rtl .ant-table-row-expand-icon{float:right}.ant-table-wrapper-rtl .ant-table-row-indent+.ant-table-row-expand-icon{margin-right:0;margin-left:8px}.ant-table-wrapper-rtl .ant-table-row-expand-icon:after{transform:rotate(-90deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:before{transform:rotate(180deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:after{transform:rotate(0deg)}.ant-radio-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-block;font-size:0}.ant-radio-group .ant-badge-count{z-index:1}.ant-radio-group>.ant-badge:not(:first-child)>.ant-radio-button-wrapper{border-left:none}.ant-radio-wrapper{box-sizing:border-box;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:inline-flex;align-items:baseline;margin:0 8px 0 0;cursor:pointer}.ant-radio-wrapper-disabled{cursor:not-allowed}.ant-radio-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\a0"}.ant-radio-wrapper.ant-radio-wrapper-in-form-item input[type=radio]{width:14px;height:14px}.ant-radio{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;top:.2em;display:inline-block;outline:none;cursor:pointer}.ant-radio-input:focus+.ant-radio-inner,.ant-radio-wrapper:hover .ant-radio,.ant-radio:hover .ant-radio-inner{border-color:#296df3}.ant-radio-input:focus+.ant-radio-inner{box-shadow:0 0 0 3px rgba(41,109,243,.12)}.ant-radio-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #296df3;border-radius:50%;visibility:hidden;animation:antRadioEffect .36s ease-in-out;animation-fill-mode:both;content:""}.ant-radio-wrapper:hover .ant-radio:after,.ant-radio:hover:after{visibility:visible}.ant-radio-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;background-color:#fff;border:1px solid #d9d9d9;border-radius:50%;transition:all .3s}.ant-radio-inner:after{position:absolute;top:50%;left:50%;display:block;width:16px;height:16px;margin-top:-8px;margin-left:-8px;background-color:#296df3;border-top:0;border-left:0;border-radius:16px;transform:scale(0);opacity:0;transition:all .3s cubic-bezier(.78,.14,.15,.86);content:" "}.ant-radio-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;cursor:pointer;opacity:0}.ant-radio.ant-radio-disabled .ant-radio-inner{border-color:#d9d9d9}.ant-radio-checked .ant-radio-inner{border-color:#296df3}.ant-radio-checked .ant-radio-inner:after{transform:scale(.5);opacity:1;transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-disabled{cursor:not-allowed}.ant-radio-disabled .ant-radio-inner{background-color:#f5f5f5;cursor:not-allowed}.ant-radio-disabled .ant-radio-inner:after{background-color:rgba(0,0,0,.2)}.ant-radio-disabled .ant-radio-input{cursor:not-allowed}.ant-radio-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}span.ant-radio+*{padding-right:8px;padding-left:8px}.ant-radio-button-wrapper{position:relative;display:inline-block;height:32px;margin:0;padding:0 15px;color:rgba(0,10,36,.65);font-size:14px;line-height:30px;background:#fff;border-color:#d9d9d9;border-style:solid;border-width:1.02px 1px 1px 0;cursor:pointer;transition:color .3s,background .3s,border-color .3s,box-shadow .3s}.ant-radio-button-wrapper a{color:rgba(0,10,36,.65)}.ant-radio-button-wrapper>.ant-radio-button{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%}.ant-radio-group-large .ant-radio-button-wrapper{height:40px;font-size:16px;line-height:38px}.ant-radio-group-small .ant-radio-button-wrapper{height:24px;padding:0 7px;line-height:22px}.ant-radio-button-wrapper:not(:first-child):before{position:absolute;top:-1px;left:-1px;display:block;box-sizing:content-box;width:1px;height:100%;padding:1px 0;background-color:#d9d9d9;transition:background-color .3s;content:""}.ant-radio-button-wrapper:first-child{border-left:1px solid #d9d9d9;border-radius:4px 0 0 4px}.ant-radio-button-wrapper:last-child{border-radius:0 4px 4px 0}.ant-radio-button-wrapper:first-child:last-child{border-radius:4px}.ant-radio-button-wrapper:hover{position:relative;color:#296df3}.ant-radio-button-wrapper:focus-within{box-shadow:0 0 0 3px rgba(41,109,243,.12)}.ant-radio-button-wrapper .ant-radio-inner,.ant-radio-button-wrapper input[type=checkbox],.ant-radio-button-wrapper input[type=radio]{width:0;height:0;opacity:0;pointer-events:none}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){z-index:1;color:#296df3;background:#fff;border-color:#296df3}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):before{background-color:#296df3}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):first-child{border-color:#296df3}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{color:#4e86f5;border-color:#4e86f5}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover:before{background-color:#4e86f5}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{color:#0d57e8;border-color:#0d57e8}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active:before{background-color:#0d57e8}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px rgba(41,109,243,.12)}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){color:#fff;background:#296df3;border-color:#296df3}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{color:#fff;background:#4e86f5;border-color:#4e86f5}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{color:#fff;background:#0d57e8;border-color:#0d57e8}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px rgba(41,109,243,.12)}.ant-radio-button-wrapper-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-radio-button-wrapper-disabled:first-child,.ant-radio-button-wrapper-disabled:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9}.ant-radio-button-wrapper-disabled:first-child{border-left-color:#d9d9d9}.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked{color:rgba(0,0,0,.25);background-color:#e6e6e6;border-color:#d9d9d9;box-shadow:none}@keyframes antRadioEffect{0%{transform:scale(1);opacity:.5}to{transform:scale(1.6);opacity:0}}.ant-radio-group.ant-radio-group-rtl{direction:rtl}.ant-radio-wrapper.ant-radio-wrapper-rtl{margin-right:0;margin-left:8px;direction:rtl}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl{border-right-width:0;border-left-width:1px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:not(:first-child):before{right:-1px;left:0}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:first-child{border-right:1px solid #d9d9d9;border-radius:0 4px 4px 0}.ant-radio-button-wrapper-checked:not([class*=" ant-radio-button-wrapper-disabled"]).ant-radio-button-wrapper:first-child{border-right-color:#4e86f5}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:last-child{border-radius:4px 0 0 4px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper-disabled:first-child{border-right-color:#d9d9d9}.ant-typography{color:rgba(0,10,36,.85);word-break:break-word}.ant-typography.ant-typography-secondary{color:rgba(0,10,36,.65)}.ant-typography.ant-typography-success{color:#26c992}.ant-typography.ant-typography-warning{color:#ffb924}.ant-typography.ant-typography-danger{color:#ef4872}a.ant-typography.ant-typography-danger:active,a.ant-typography.ant-typography-danger:focus{color:#c9325d}a.ant-typography.ant-typography-danger:hover{color:#fc7492}.ant-typography.ant-typography-disabled{color:rgba(0,0,0,.25);cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-typography p,div.ant-typography{margin-bottom:1em}.ant-typography h1,div.ant-typography-h1,div.ant-typography-h1>textarea,h1.ant-typography{margin-bottom:.5em;color:rgba(0,10,36,.85);font-weight:600;font-size:38px;line-height:1.23}.ant-typography h2,div.ant-typography-h2,div.ant-typography-h2>textarea,h2.ant-typography{margin-bottom:.5em;color:rgba(0,10,36,.85);font-weight:600;font-size:30px;line-height:1.35}.ant-typography h3,div.ant-typography-h3,div.ant-typography-h3>textarea,h3.ant-typography{margin-bottom:.5em;color:rgba(0,10,36,.85);font-weight:600;font-size:24px;line-height:1.35}.ant-typography h4,div.ant-typography-h4,div.ant-typography-h4>textarea,h4.ant-typography{margin-bottom:.5em;color:rgba(0,10,36,.85);font-weight:600;font-size:20px;line-height:1.4}.ant-typography h5,div.ant-typography-h5,div.ant-typography-h5>textarea,h5.ant-typography{margin-bottom:.5em;color:rgba(0,10,36,.85);font-weight:600;font-size:16px;line-height:1.5}.ant-typography+h1.ant-typography,.ant-typography+h2.ant-typography,.ant-typography+h3.ant-typography,.ant-typography+h4.ant-typography,.ant-typography+h5.ant-typography{margin-top:1.2em}.ant-typography div+h1,.ant-typography div+h2,.ant-typography div+h3,.ant-typography div+h4,.ant-typography div+h5,.ant-typography h1+h1,.ant-typography h1+h2,.ant-typography h1+h3,.ant-typography h1+h4,.ant-typography h1+h5,.ant-typography h2+h1,.ant-typography h2+h2,.ant-typography h2+h3,.ant-typography h2+h4,.ant-typography h2+h5,.ant-typography h3+h1,.ant-typography h3+h2,.ant-typography h3+h3,.ant-typography h3+h4,.ant-typography h3+h5,.ant-typography h4+h1,.ant-typography h4+h2,.ant-typography h4+h3,.ant-typography h4+h4,.ant-typography h4+h5,.ant-typography h5+h1,.ant-typography h5+h2,.ant-typography h5+h3,.ant-typography h5+h4,.ant-typography h5+h5,.ant-typography li+h1,.ant-typography li+h2,.ant-typography li+h3,.ant-typography li+h4,.ant-typography li+h5,.ant-typography p+h1,.ant-typography p+h2,.ant-typography p+h3,.ant-typography p+h4,.ant-typography p+h5,.ant-typography ul+h1,.ant-typography ul+h2,.ant-typography ul+h3,.ant-typography ul+h4,.ant-typography ul+h5{margin-top:1.2em}a.ant-typography-ellipsis,span.ant-typography-ellipsis{display:inline-block;max-width:100%}.ant-typography a,a.ant-typography{color:#296df3;outline:none;cursor:pointer;transition:color .3s;text-decoration:none}.ant-typography a:focus-visible,.ant-typography a:hover,a.ant-typography:focus-visible,a.ant-typography:hover{color:#5493ff}.ant-typography a:active,a.ant-typography:active{color:#184ecc}.ant-typography a:active,.ant-typography a:hover,a.ant-typography:active,a.ant-typography:hover{text-decoration:none}.ant-typography a.ant-typography-disabled,.ant-typography a[disabled],a.ant-typography.ant-typography-disabled,a.ant-typography[disabled]{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-typography a.ant-typography-disabled:active,.ant-typography a.ant-typography-disabled:hover,.ant-typography a[disabled]:active,.ant-typography a[disabled]:hover,a.ant-typography.ant-typography-disabled:active,a.ant-typography.ant-typography-disabled:hover,a.ant-typography[disabled]:active,a.ant-typography[disabled]:hover{color:rgba(0,0,0,.25)}.ant-typography a.ant-typography-disabled:active,.ant-typography a[disabled]:active,a.ant-typography.ant-typography-disabled:active,a.ant-typography[disabled]:active{pointer-events:none}.ant-typography code{margin:0 .2em;padding:.2em .4em .1em;font-size:85%;background:hsla(0,0%,58.8%,.1);border:1px solid hsla(0,0%,39.2%,.2);border-radius:3px}.ant-typography kbd{margin:0 .2em;padding:.15em .4em .1em;font-size:90%;background:hsla(0,0%,58.8%,.06);border:solid hsla(0,0%,39.2%,.2);border-width:1px 1px 2px;border-radius:3px}.ant-typography mark{padding:0;background-color:#ffea9e}.ant-typography ins,.ant-typography u{text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.ant-typography del,.ant-typography s{text-decoration:line-through}.ant-typography strong{font-weight:600}.ant-typography-copy,.ant-typography-edit,.ant-typography-expand{color:#296df3;outline:none;cursor:pointer;transition:color .3s;margin-left:4px}.ant-typography-copy:focus-visible,.ant-typography-copy:hover,.ant-typography-edit:focus-visible,.ant-typography-edit:hover,.ant-typography-expand:focus-visible,.ant-typography-expand:hover{color:#5493ff}.ant-typography-copy:active,.ant-typography-edit:active,.ant-typography-expand:active{color:#184ecc}.ant-typography-copy-success,.ant-typography-copy-success:focus,.ant-typography-copy-success:hover{color:#26c992}.ant-typography-edit-content{position:relative}div.ant-typography-edit-content{left:-12px;margin-top:-5px;margin-bottom:calc(1em - 5px)}.ant-typography-edit-content-confirm{position:absolute;right:10px;bottom:8px;color:rgba(0,10,36,.65);font-weight:400;font-size:14px;font-style:normal;pointer-events:none}.ant-typography-edit-content textarea{height:1em;margin:0!important;-moz-transition:none}.ant-typography ol,.ant-typography ul{margin:0 0 1em;padding:0}.ant-typography ol li,.ant-typography ul li{margin:0 0 0 20px;padding:0 0 0 4px}.ant-typography ul{list-style-type:circle}.ant-typography ul ul{list-style-type:disc}.ant-typography ol{list-style-type:decimal}.ant-typography blockquote,.ant-typography pre{margin:1em 0}.ant-typography pre{padding:.4em .6em;white-space:pre-wrap;word-wrap:break-word;background:hsla(0,0%,58.8%,.1);border:1px solid hsla(0,0%,39.2%,.2);border-radius:3px}.ant-typography pre code{display:inline;margin:0;padding:0;font-size:inherit;font-family:inherit;background:transparent;border:0}.ant-typography blockquote{padding:0 0 0 .6em;border-left:4px solid hsla(0,0%,39.2%,.2);opacity:.85}.ant-typography-single-line{white-space:nowrap}.ant-typography-ellipsis-single-line{overflow:hidden;text-overflow:ellipsis}a.ant-typography-ellipsis-single-line,span.ant-typography-ellipsis-single-line{vertical-align:bottom}.ant-typography-ellipsis-multiple-line{display:-webkit-box;overflow:hidden;-webkit-line-clamp:3; + /*! autoprefixer: ignore next */-webkit-box-orient:vertical}.ant-typography-rtl{direction:rtl}.ant-typography-rtl .ant-typography-copy,.ant-typography-rtl .ant-typography-edit,.ant-typography-rtl .ant-typography-expand{margin-right:4px;margin-left:0}.ant-typography-rtl .ant-typography-expand{float:left}div.ant-typography-edit-content.ant-typography-rtl{right:-12px;left:auto}.ant-typography-rtl .ant-typography-edit-content-confirm{right:auto;left:10px}.ant-typography-rtl.ant-typography ol li,.ant-typography-rtl.ant-typography ul li{margin:0 20px 0 0;padding:0 4px 0 0}.normalState___rTQ99{position:static;height:100%}.normalState___rTQ99 .backNormal___1gKZt{display:none}.maxState___2W7kq{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999}.maxState___2W7kq .innerWrap___7Y-5N{position:absolute;right:0;bottom:0;left:0;background:#fff}.maxState___2W7kq .backNormal___1gKZt{display:block;height:30px;padding-right:20px;color:#02a7f0;font-size:22px;line-height:30px;text-align:right}.maxState___2W7kq .backNormal___1gKZt .fullscreenExitIcon___xj4Wz{cursor:pointer}.sqlEditor___3RiYN{min-width:0;height:100%;border:1px solid #eee}.sqlEditor___3RiYN .ace_editor{font-family:"Menlo","Monaco","Ubuntu Mono","Consolas","source-code-pro"!important}.fullScreenBtnBox___2USxq{display:flex;justify-content:end}.ant-pro-card{position:relative;display:flex;flex-direction:column;box-sizing:border-box;width:100%;margin:0;padding:0;background-color:#fff;border-radius:4px}.ant-pro-card-col{width:100%}.ant-pro-card-border{border:1px solid #f0f0f0}.ant-pro-card-hoverable{cursor:pointer;transition:box-shadow .3s,border-color .3s}.ant-pro-card-hoverable:hover{border-color:transparent;box-shadow:0 1px 2px -2px rgba(0,0,0,.16),0 3px 6px 0 rgba(0,0,0,.12),0 5px 12px 4px rgba(0,0,0,.09)}.ant-pro-card-hoverable.ant-pro-card-checked:hover{border-color:#296df3}.ant-pro-card-checked{background-color:#e3ecfd;border-color:#296df3}.ant-pro-card-checked:after{position:absolute;top:2px;right:2px;width:0;height:0;border-left:6px solid #296df3;border-bottom:6px solid #296df3;border-color:#296df3 #296df3 transparent transparent;border-style:solid;border-width:6px;border-top-right-radius:2px;content:""}.ant-pro-card:focus{background-color:#e3ecfd;border-color:#296df3}.ant-pro-card-size-small .ant-pro-card-header{padding:8px 12px 0}.ant-pro-card-size-small .ant-pro-card-header-border{padding-bottom:8px}.ant-pro-card-size-small .ant-pro-card-title{font-size:14px}.ant-pro-card-size-small .ant-pro-card-body{padding:12px}.ant-pro-card-ghost{background-color:transparent}.ant-pro-card-ghost>.ant-pro-card-header{padding-right:0;padding-bottom:16px;padding-left:0}.ant-pro-card-ghost>.ant-pro-card-body{padding:0;background-color:transparent}.ant-pro-card-split>.ant-pro-card-body{padding:0}.ant-pro-card-split-vertical{border-right:1px solid #f0f0f0}.ant-pro-card-split-horizontal{border-bottom:1px solid #f0f0f0}.ant-pro-card-contain-card>.ant-pro-card-body{display:flex}.ant-pro-card-body-direction-column{flex-direction:column}.ant-pro-card-body-wrap{flex-wrap:wrap}.ant-pro-card-collapse>.ant-pro-card-header{padding-bottom:16px;border-bottom:0}.ant-pro-card-collapse>.ant-pro-card-body{display:none}.ant-pro-card-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px 0}.ant-pro-card-header-border{padding-bottom:16px;border-bottom:1px solid #f0f0f0}.ant-pro-card-header-collapsible{cursor:pointer}.ant-pro-card-title{color:rgba(0,10,36,.85);font-weight:500;font-size:16px}.ant-pro-card-extra{color:rgba(0,10,36,.85)}.ant-pro-card-type-inner .ant-pro-card-header{background-color:#fafafa}.ant-pro-card-collapsible-icon{margin-right:8px;color:rgba(0,0,0,.75)}.ant-pro-card-collapsible-icon :hover{color:#5493ff}.ant-pro-card-collapsible-icon svg{transition:transform .2s}.ant-pro-card-body{display:block;box-sizing:border-box;height:100%;padding:24px}.ant-pro-card-body-center{display:flex;align-items:center;justify-content:center}.ant-pro-card-col-0{display:none}.ant-pro-card-col-24{flex-shrink:0;width:100%}.ant-pro-card-col-23{flex-shrink:0;width:95.83333333%}.ant-pro-card-col-22{flex-shrink:0;width:91.66666667%}.ant-pro-card-col-21{flex-shrink:0;width:87.5%}.ant-pro-card-col-20{flex-shrink:0;width:83.33333333%}.ant-pro-card-col-19{flex-shrink:0;width:79.16666667%}.ant-pro-card-col-18{flex-shrink:0;width:75%}.ant-pro-card-col-17{flex-shrink:0;width:70.83333333%}.ant-pro-card-col-16{flex-shrink:0;width:66.66666667%}.ant-pro-card-col-15{flex-shrink:0;width:62.5%}.ant-pro-card-col-14{flex-shrink:0;width:58.33333333%}.ant-pro-card-col-13{flex-shrink:0;width:54.16666667%}.ant-pro-card-col-12{flex-shrink:0;width:50%}.ant-pro-card-col-11{flex-shrink:0;width:45.83333333%}.ant-pro-card-col-10{flex-shrink:0;width:41.66666667%}.ant-pro-card-col-9{flex-shrink:0;width:37.5%}.ant-pro-card-col-8{flex-shrink:0;width:33.33333333%}.ant-pro-card-col-7{flex-shrink:0;width:29.16666667%}.ant-pro-card-col-6{flex-shrink:0;width:25%}.ant-pro-card-col-5{flex-shrink:0;width:20.83333333%}.ant-pro-card-col-4{flex-shrink:0;width:16.66666667%}.ant-pro-card-col-3{flex-shrink:0;width:12.5%}.ant-pro-card-col-2{flex-shrink:0;width:8.33333333%}.ant-pro-card-col-1{flex-shrink:0;width:4.16666667%}.ant-pro-card-tabs .ant-tabs-top>.ant-tabs-nav{margin-bottom:0}.ant-pro-card-tabs .ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-list{margin-top:8px;padding-left:16px}.ant-pro-card-tabs .ant-tabs-bottom>.ant-tabs-nav{margin-top:0}.ant-pro-card-tabs .ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-list{padding-left:16px}.ant-pro-card-tabs .ant-tabs-left .ant-tabs-content-holder .ant-tabs-content .ant-tabs-tabpane{padding-left:0}.ant-pro-card-tabs .ant-tabs-left>.ant-tabs-nav{margin-right:0}.ant-pro-card-tabs .ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-list{padding-top:16px}.ant-pro-card-tabs .ant-tabs-right .ant-tabs-content-holder .ant-tabs-content .ant-tabs-tabpane{padding-right:0}.ant-pro-card-tabs .ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-list{padding-top:16px}.ant-pro-card-loading{overflow:hidden}.ant-pro-card-loading .ant-pro-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pro-card-loading-content{width:100%}.ant-pro-card-loading-content p{margin:0}.ant-pro-card-loading-block{height:14px;margin:4px 0;background:linear-gradient(90deg,rgba(207,216,220,.2),rgba(207,216,220,.4),rgba(207,216,220,.2));background-size:600% 600%;border-radius:4px;animation:card-loading 1.4s ease infinite}@keyframes card-loading{0%,to{background-position:0 50%}50%{background-position:100% 50%}}.ant-pro-core-label-tip{display:inline-flex;align-items:center;max-width:100%}.ant-pro-core-label-tip-icon{display:block;margin-left:4px;cursor:pointer}.ant-pro-core-label-tip-icon:hover{color:#5493ff}.ant-pro-core-label-tip-title{display:inline-flex;flex:1 1}.ant-pro-core-label-tip-subtitle{margin-left:8px;color:rgba(0,10,36,.65);font-weight:400;font-size:14px;white-space:nowrap}.ant-pro-core-label-tip-title-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-pro-card-actions{margin:0;padding:0;list-style:none;background:#fff;border-top:1px solid #f0f0f0}.ant-pro-card-actions:before{display:table;content:""}.ant-pro-card-actions:after{display:table;clear:both;content:""}.ant-pro-card-actions .ant-space{grid-gap:0!important;gap:0!important;width:100%}.ant-pro-card-actions .ant-space-item,.ant-pro-card-actions>li{flex:1 1;float:left;margin:12px 0;color:rgba(0,10,36,.65);text-align:center}.ant-pro-card-actions .ant-space-item>a,.ant-pro-card-actions>li>a{color:rgba(0,10,36,.65);transition:color .3s}.ant-pro-card-actions .ant-space-item>a:hover,.ant-pro-card-actions>li>a:hover{color:#5493ff}.ant-pro-card-actions .ant-space-item>span,.ant-pro-card-actions>li>span{position:relative;display:block;min-width:32px;font-size:14px;line-height:1.5715;cursor:pointer}.ant-pro-card-actions .ant-space-item>span:hover,.ant-pro-card-actions>li>span:hover{color:#5493ff;transition:color .3s}.ant-pro-card-actions .ant-space-item>span>.anticon,.ant-pro-card-actions .ant-space-item>span a:not(.ant-btn),.ant-pro-card-actions>li>span>.anticon,.ant-pro-card-actions>li>span a:not(.ant-btn){display:inline-block;width:100%;color:rgba(0,10,36,.65);line-height:22px;transition:color .3s}.ant-pro-card-actions .ant-space-item>span>.anticon:hover,.ant-pro-card-actions .ant-space-item>span a:not(.ant-btn):hover,.ant-pro-card-actions>li>span>.anticon:hover,.ant-pro-card-actions>li>span a:not(.ant-btn):hover{color:#5493ff}.ant-pro-card-actions .ant-space-item>span>.anticon,.ant-pro-card-actions>li>span>.anticon{font-size:16px;line-height:22px}.ant-pro-card-actions .ant-space-item:not(:last-child),.ant-pro-card-actions>li:not(:last-child){border-right:1px solid #f0f0f0}.ant-pro-card-divider{flex:none;width:1px;margin:24px 8px;background-color:#f0f0f0}.ant-pro-card-divider-horizontal{width:auto;height:1px;margin:8px 24px}.ant-pro-card-size-small .ant-pro-card-divider{margin:12px 8px}.ant-pro-card-size-small .ant-pro-card-divider-horizontal{margin:8px 12px}.ant-card{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;background:#fff;border-radius:4px}.ant-card-rtl{direction:rtl}.ant-card-hoverable{cursor:pointer;transition:box-shadow .3s,border-color .3s}.ant-card-hoverable:hover{border-color:transparent;box-shadow:0 1px 2px -2px rgba(0,0,0,.16),0 3px 6px 0 rgba(0,0,0,.12),0 5px 12px 4px rgba(0,0,0,.09)}.ant-card-bordered{border:1px solid #f0f0f0}.ant-card-head{min-height:48px;margin-bottom:-1px;padding:0 24px;color:rgba(0,10,36,.85);font-weight:500;font-size:16px;background:transparent;border-bottom:1px solid #f0f0f0;border-radius:4px 4px 0 0}.ant-card-head:before{display:table;content:""}.ant-card-head:after{display:table;clear:both;content:""}.ant-card-head-wrapper{display:flex;align-items:center}.ant-card-head-title{display:inline-block;flex:1 1;padding:16px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-card-head-title>.ant-typography,.ant-card-head-title>.ant-typography-edit-content{left:0;margin-top:0;margin-bottom:0}.ant-card-head .ant-tabs-top{clear:both;margin-bottom:-17px;color:rgba(0,10,36,.85);font-weight:400;font-size:14px}.ant-card-head .ant-tabs-top-bar{border-bottom:1px solid #f0f0f0}.ant-card-extra{margin-left:auto;padding:16px 0;color:rgba(0,10,36,.85);font-weight:400;font-size:14px}.ant-card-rtl .ant-card-extra{margin-right:auto;margin-left:0}.ant-card-body{padding:24px}.ant-card-body:before{display:table;content:""}.ant-card-body:after{display:table;clear:both;content:""}.ant-card-contain-grid .ant-card-body{display:flex;flex-wrap:wrap}.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body{margin:-1px 0 0 -1px;padding:0}.ant-card-grid{width:33.33%;padding:24px;border:0;border-radius:0;box-shadow:1px 0 0 0 #f0f0f0,0 1px 0 0 #f0f0f0,1px 1px 0 0 #f0f0f0,inset 1px 0 0 0 #f0f0f0,inset 0 1px 0 0 #f0f0f0;transition:all .3s}.ant-card-grid-hoverable:hover{position:relative;z-index:1;box-shadow:0 1px 2px -2px rgba(0,0,0,.16),0 3px 6px 0 rgba(0,0,0,.12),0 5px 12px 4px rgba(0,0,0,.09)}.ant-card-contain-tabs>.ant-card-head .ant-card-head-title{min-height:32px;padding-bottom:0}.ant-card-contain-tabs>.ant-card-head .ant-card-extra{padding-bottom:0}.ant-card-bordered .ant-card-cover{margin-top:-1px;margin-right:-1px;margin-left:-1px}.ant-card-cover>*{display:block;width:100%}.ant-card-cover img{border-radius:4px 4px 0 0}.ant-card-actions{display:flex;margin:0;padding:0;list-style:none;background:#fff;border-top:1px solid #f0f0f0}.ant-card-actions:before{display:table;content:""}.ant-card-actions:after{display:table;clear:both;content:""}.ant-card-actions>li{margin:12px 0;color:rgba(0,10,36,.65);text-align:center}.ant-card-actions>li>span{position:relative;display:block;min-width:32px;font-size:14px;line-height:1.5715;cursor:pointer}.ant-card-actions>li>span:hover{color:#296df3;transition:color .3s}.ant-card-actions>li>span>.anticon,.ant-card-actions>li>span a:not(.ant-btn){display:inline-block;width:100%;color:rgba(0,10,36,.65);line-height:22px;transition:color .3s}.ant-card-actions>li>span>.anticon:hover,.ant-card-actions>li>span a:not(.ant-btn):hover{color:#296df3}.ant-card-actions>li>span>.anticon{font-size:16px;line-height:22px}.ant-card-actions>li:not(:last-child){border-right:1px solid #f0f0f0}.ant-card-rtl .ant-card-actions>li:not(:last-child){border-right:none;border-left:1px solid #f0f0f0}.ant-card-type-inner .ant-card-head{padding:0 24px;background:#fafafa}.ant-card-type-inner .ant-card-head-title{padding:12px 0;font-size:14px}.ant-card-type-inner .ant-card-body{padding:16px 24px}.ant-card-type-inner .ant-card-extra{padding:13.5px 0}.ant-card-meta{display:flex;margin:-4px 0}.ant-card-meta:before{display:table;content:""}.ant-card-meta:after{display:table;clear:both;content:""}.ant-card-meta-avatar{padding-right:16px}.ant-card-rtl .ant-card-meta-avatar{padding-right:0;padding-left:16px}.ant-card-meta-detail{flex:1 1;overflow:hidden}.ant-card-meta-detail>div:not(:last-child){margin-bottom:8px}.ant-card-meta-title{overflow:hidden;color:rgba(0,10,36,.85);font-weight:500;font-size:16px;white-space:nowrap;text-overflow:ellipsis}.ant-card-meta-description{color:rgba(0,10,36,.65)}.ant-card-loading{overflow:hidden}.ant-card-loading .ant-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-card-small>.ant-card-head{min-height:36px;padding:0 12px;font-size:14px}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-head-title{padding:8px 0}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-extra{padding:8px 0;font-size:14px}.ant-card-small>.ant-card-body{padding:12px}.ant-steps{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:flex;width:100%;font-size:0;text-align:left;text-align:initial}.ant-steps-item{position:relative;display:inline-block;flex:1 1;overflow:hidden;vertical-align:top}.ant-steps-item-container{outline:none}.ant-steps-item:last-child{flex:none}.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after,.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-tail{display:none}.ant-steps-item-content,.ant-steps-item-icon{display:inline-block;vertical-align:top}.ant-steps-item-icon{width:32px;height:32px;margin:0 8px 0 0;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:32px;text-align:center;border:1px solid rgba(0,0,0,.25);border-radius:32px;transition:background-color .3s,border-color .3s}.ant-steps-item-icon .ant-steps-icon{position:relative;top:-.5px;color:#296df3;line-height:1}.ant-steps-item-tail{position:absolute;top:12px;left:0;width:100%;padding:0 10px}.ant-steps-item-tail:after{display:inline-block;width:100%;height:1px;background:#f0f0f0;border-radius:1px;transition:background .3s;content:""}.ant-steps-item-title{position:relative;display:inline-block;padding-right:16px;color:rgba(0,10,36,.85);font-size:16px;line-height:32px}.ant-steps-item-title:after{position:absolute;top:16px;left:100%;display:block;width:9999px;height:1px;background:#f0f0f0;content:""}.ant-steps-item-subtitle{display:inline;margin-left:8px;color:rgba(0,10,36,.65);font-weight:400;font-size:14px}.ant-steps-item-description{color:rgba(0,10,36,.65);font-size:14px}.ant-steps-item-wait .ant-steps-item-icon{background-color:#fff;border-color:rgba(0,0,0,.25)}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon{color:rgba(0,0,0,.25)}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:rgba(0,0,0,.25)}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,10,36,.65)}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,10,36,.65)}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process .ant-steps-item-icon{background-color:#fff;border-color:#296df3}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#296df3}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#296df3}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,10,36,.85)}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,10,36,.85)}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon{background:#296df3}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon .ant-steps-icon{color:#fff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-title{font-weight:500}.ant-steps-item-finish .ant-steps-item-icon{background-color:#fff;border-color:#296df3}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon{color:#296df3}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#296df3}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,10,36,.85)}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#296df3}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,10,36,.65)}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#296df3}.ant-steps-item-error .ant-steps-item-icon{background-color:#fff;border-color:#ef4872}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon{color:#ef4872}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#ef4872}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#ef4872}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#ef4872}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after{background:#ef4872}.ant-steps-item-disabled{cursor:not-allowed}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]{cursor:pointer}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-description,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-icon .ant-steps-icon,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-title{transition:color .3s}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-description,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-title{color:#296df3}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon{border-color:#296df3}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon .ant-steps-icon{color:#296df3}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:16px;white-space:nowrap}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail{display:none}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description{max-width:140px;white-space:normal}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon{height:auto;background:none;border:0}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon>.ant-steps-icon{top:0;left:.5px;width:32px;height:32px;font-size:24px;line-height:32px}.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#296df3}.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon{width:auto;background:none}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:12px}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-small .ant-steps-item-icon{width:24px;height:24px;margin:0 8px 0 0;font-size:12px;line-height:24px;text-align:center;border-radius:24px}.ant-steps-small .ant-steps-item-title{padding-right:12px;font-size:14px;line-height:24px}.ant-steps-small .ant-steps-item-title:after{top:12px}.ant-steps-small .ant-steps-item-description{color:rgba(0,10,36,.65);font-size:14px}.ant-steps-small .ant-steps-item-tail{top:8px}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon{width:inherit;height:inherit;line-height:inherit;background:none;border:0;border-radius:0}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{font-size:24px;line-height:24px;transform:none}.ant-steps-vertical{display:flex;flex-direction:column}.ant-steps-vertical>.ant-steps-item{display:block;flex:1 0 auto;padding-left:0;overflow:visible}.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-content{display:block;min-height:48px;overflow:hidden}.ant-steps-vertical>.ant-steps-item .ant-steps-item-title{line-height:32px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-description{padding-bottom:12px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{position:absolute;top:0;left:15px;width:1px;height:100%;padding:38px 0 6px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail:after{width:1px;height:100%}.ant-steps-vertical>.ant-steps-item:not(:last-child)>.ant-steps-item-container>.ant-steps-item-tail{display:block}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{position:absolute;top:0;left:11px;padding:30px 0 6px}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-title{line-height:24px}.ant-steps-label-vertical .ant-steps-item{overflow:visible}.ant-steps-label-vertical .ant-steps-item-tail{margin-left:58px;padding:3.5px 24px}.ant-steps-label-vertical .ant-steps-item-content{display:block;width:116px;margin-top:8px;text-align:center}.ant-steps-label-vertical .ant-steps-item-icon{display:inline-block;margin-left:42px}.ant-steps-label-vertical .ant-steps-item-title{padding-right:0;padding-left:0}.ant-steps-label-vertical .ant-steps-item-title:after{display:none}.ant-steps-label-vertical .ant-steps-item-subtitle{display:block;margin-bottom:4px;margin-left:0;line-height:1.5715}.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon{margin-left:46px}.ant-steps-dot .ant-steps-item-title,.ant-steps-dot.ant-steps-small .ant-steps-item-title{line-height:1.5715}.ant-steps-dot .ant-steps-item-tail,.ant-steps-dot.ant-steps-small .ant-steps-item-tail{top:2px;width:100%;margin:0 0 0 70px;padding:0}.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{width:calc(100% - 20px);height:3px;margin-left:12px}.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{left:2px}.ant-steps-dot .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-icon{width:8px;height:8px;margin-left:67px;padding-right:0;line-height:8px;background:transparent;border:0}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{position:relative;float:left;width:100%;height:100%;border-radius:100px;transition:all .3s}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{position:absolute;top:-12px;left:-26px;width:60px;height:32px;background:rgba(0,0,0,.001);content:""}.ant-steps-dot .ant-steps-item-content,.ant-steps-dot.ant-steps-small .ant-steps-item-content{width:140px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-item-icon{position:relative;top:-1px;width:10px;height:10px;line-height:10px;background:none}.ant-steps-dot .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-top:13px;margin-left:0;background:none}.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:6.5px;left:-9px;margin:0;padding:22px 0 4px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-top:10px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:3.5px}.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-content{width:inherit}.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-item-container .ant-steps-item-icon .ant-steps-icon-dot{top:-1px;left:-1px}.ant-steps-navigation{padding-top:12px}.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-left:-12px}.ant-steps-navigation .ant-steps-item{overflow:visible;text-align:center}.ant-steps-navigation .ant-steps-item-container{display:inline-block;height:100%;margin-left:-16px;padding-bottom:12px;text-align:left;transition:opacity .3s}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-content{max-width:auto}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{max-width:100%;padding-right:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title:after{display:none}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]{cursor:pointer}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]:hover{opacity:.85}.ant-steps-navigation .ant-steps-item:last-child{flex:1 1}.ant-steps-navigation .ant-steps-item:last-child:after{display:none}.ant-steps-navigation .ant-steps-item:after{position:absolute;top:50%;left:100%;display:inline-block;width:12px;height:12px;margin-top:-14px;margin-left:-2px;border:1px solid rgba(0,0,0,.25);border-bottom:none;border-left:none;transform:rotate(45deg);content:""}.ant-steps-navigation .ant-steps-item:before{position:absolute;bottom:0;left:50%;display:inline-block;width:0;height:2px;background-color:#296df3;transition:width .3s,left .3s;transition-timing-function:ease-out;content:""}.ant-steps-navigation .ant-steps-item.ant-steps-item-active:before{left:0;width:100%}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item{margin-right:0!important}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:before{display:none}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item.ant-steps-item-active:before{top:0;right:0;left:unset;display:block;width:3px;height:calc(100% - 24px)}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:after{position:relative;top:-2px;left:50%;display:block;width:8px;height:8px;margin-bottom:8px;text-align:center;transform:rotate(135deg)}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{visibility:hidden}.ant-steps-navigation.ant-steps-horizontal>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{visibility:hidden}.ant-steps-rtl{direction:rtl}.ant-steps.ant-steps-rtl .ant-steps-item-icon{margin-right:0;margin-left:8px}.ant-steps-rtl .ant-steps-item-tail{right:0;left:auto}.ant-steps-rtl .ant-steps-item-title{padding-right:0;padding-left:16px}.ant-steps-rtl .ant-steps-item-title .ant-steps-item-subtitle{float:left;margin-right:8px;margin-left:0}.ant-steps-rtl .ant-steps-item-title:after{right:100%;left:auto}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-right:16px;padding-left:0}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-left:0}.ant-steps-rtl .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{right:.5px;left:auto}.ant-steps-rtl.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-right:-12px;margin-left:0}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container{margin-right:-16px;margin-left:0;text-align:right}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-navigation .ant-steps-item:after{right:100%;left:auto;margin-right:-2px;margin-left:0;transform:rotate(225deg)}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-right:12px;padding-left:0}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-small .ant-steps-item-title{padding-right:0;padding-left:12px}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:right;margin-right:0;margin-left:16px}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:16px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{right:12px;left:auto}.ant-steps-rtl.ant-steps-label-vertical .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail{margin:0 70px 0 0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{margin-right:12px;margin-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{right:2px;left:auto}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-right:67px;margin-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{float:right}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{right:-26px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-right:0;margin-left:16px}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:-9px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{right:0;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot{right:-2px;left:auto}.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical>.ant-steps-item{padding-right:4px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:19px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-small.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:15px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child{padding-right:4px;padding-left:0}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child.ant-steps-item-active{padding-right:4px}.ant-steps-with-progress .ant-steps-item{padding-top:4px}.ant-steps-with-progress .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:4px;left:19px}.ant-steps-with-progress.ant-steps-horizontal .ant-steps-item:first-child,.ant-steps-with-progress.ant-steps-small.ant-steps-horizontal .ant-steps-item:first-child{padding-bottom:4px;padding-left:4px}.ant-steps-with-progress.ant-steps-small>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{left:15px}.ant-steps-with-progress.ant-steps-vertical .ant-steps-item{padding-left:4px}.ant-steps-with-progress.ant-steps-label-vertical .ant-steps-item .ant-steps-item-tail{top:14px!important}.ant-steps-with-progress .ant-steps-item-icon{position:relative}.ant-steps-with-progress .ant-steps-item-icon .ant-progress{position:absolute;top:-5px;right:-5px;bottom:-5px;left:-5px}.ant-progress{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-block}.ant-progress-line{position:relative;width:100%;font-size:14px}.ant-progress-steps{display:inline-block}.ant-progress-steps-outer{display:flex;flex-direction:row;align-items:center}.ant-progress-steps-item{flex-shrink:0;min-width:2px;margin-right:2px;background:#f3f3f3;transition:all .3s}.ant-progress-steps-item-active{background:#296df3}.ant-progress-small.ant-progress-line,.ant-progress-small.ant-progress-line .ant-progress-text .anticon{font-size:12px}.ant-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ant-progress-show-info .ant-progress-outer{margin-right:calc(-2em - 8px);padding-right:calc(2em + 8px)}.ant-progress-inner{position:relative;display:inline-block;width:100%;overflow:hidden;vertical-align:middle;background-color:#f5f5f5;border-radius:100px}.ant-progress-circle-trail{stroke:#f5f5f5}.ant-progress-circle-path{animation:ant-progress-appear .3s}.ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#296df3}.ant-progress-bg,.ant-progress-success-bg{position:relative;background-color:#296df3;border-radius:100px;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s}.ant-progress-success-bg{position:absolute;top:0;left:0;background-color:#26c992}.ant-progress-text{display:inline-block;width:2em;margin-left:8px;color:rgba(0,10,36,.85);font-size:1em;line-height:1;white-space:nowrap;text-align:left;vertical-align:middle;word-break:normal}.ant-progress-text .anticon{font-size:14px}.ant-progress-status-active .ant-progress-bg:before{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff;border-radius:10px;opacity:0;animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;content:""}.ant-progress-status-exception .ant-progress-bg{background-color:#ef4872}.ant-progress-status-exception .ant-progress-text{color:#ef4872}.ant-progress-status-exception .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#ef4872}.ant-progress-status-success .ant-progress-bg{background-color:#26c992}.ant-progress-status-success .ant-progress-text{color:#26c992}.ant-progress-status-success .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#26c992}.ant-progress-circle .ant-progress-inner{position:relative;line-height:1;background-color:transparent}.ant-progress-circle .ant-progress-text{position:absolute;top:50%;left:50%;width:100%;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:1em;line-height:1;white-space:normal;text-align:center;transform:translate(-50%,-50%)}.ant-progress-circle .ant-progress-text .anticon{font-size:1.16666667em}.ant-progress-circle.ant-progress-status-exception .ant-progress-text{color:#ef4872}.ant-progress-circle.ant-progress-status-success .ant-progress-text{color:#26c992}@keyframes ant-progress-active{0%{transform:translateX(-100%) scaleX(0);opacity:.1}20%{transform:translateX(-100%) scaleX(0);opacity:.5}to{transform:translateX(0) scaleX(1);opacity:0}}.ant-progress-rtl{direction:rtl}.ant-progress-rtl.ant-progress-show-info .ant-progress-outer{margin-right:0;margin-left:calc(-2em - 8px);padding-right:0;padding-left:calc(2em + 8px)}.ant-progress-rtl .ant-progress-success-bg{right:0;left:auto}.ant-progress-rtl.ant-progress-line .ant-progress-text,.ant-progress-rtl.ant-progress-steps .ant-progress-text{margin-right:8px;margin-left:0;text-align:right}.pageContainer___1YXb3{position:absolute;top:55px;right:0;bottom:0;left:0;background:#fff}.pageContainer___1YXb3.externalPageContainer___1TSgX{margin:0!important}.searchBar___2v1Cs .ant-form-item-label{width:70px}.main___qRCgn{position:absolute;top:0;right:0;bottom:0;left:0;display:flex}.main___qRCgn .ant-tabs{height:100%!important}.main___qRCgn .ant-tabs .ant-tabs-content{height:100%!important}.main___qRCgn .ant-tabs .ant-tabs-content .ant-tabs-tabpane{height:100%}.rightSide___ooQY-{position:relative;z-index:1;min-width:250px;height:100%;margin-left:4px;padding:10px;overflow:hidden}.rightSide___ooQY- .ant-form-item{margin-bottom:6px}.rightSide___ooQY- .ant-form-item .ant-form-item-label{width:70px}.rightSide___ooQY- .ant-form-item .ant-form-item-control{min-width:100px}.rightListSide___2muVJ{position:relative;z-index:2;flex:1 1;height:100%;background-color:#fff}.rightListSide___2muVJ .ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.rightListSide___2muVJ .ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.rightListSide___2muVJ .ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.rightListSide___2muVJ .ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-left:0}.rightListSide___2muVJ .ant-tabs>.ant-tabs-nav .ant-tabs-nav-add,.rightListSide___2muVJ .ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add{margin-left:0}.leftListSide___3npiR{position:relative;z-index:2;flex:1 1;height:100%;background-color:#fff}.tableTotal___1VSZg{margin:0 2px;color:#296df3;font-weight:700}.tableDetaildrawer___2PDIJ .ant-drawer-header{padding:10px 45px 10px 10px}.tableDetaildrawer___2PDIJ .ant-drawer-close{padding:10px}.tableDetaildrawer___2PDIJ .ant-drawer-body{padding:0 10px 10px}.tableDetaildrawer___2PDIJ .ant-tabs-top>.ant-tabs-nav{margin-bottom:8px}.tableDetailTable___14pfB .ant-table-cell,.tableDetailTable___14pfB .resultTableRow>td{padding:8px;font-size:12px}.sqlEditor___1ewr3{min-width:0;height:100%;border:1px solid #eee}.sqlEditor___1ewr3 .ace_editor{font-family:"Menlo","Monaco","Ubuntu Mono","Consolas","source-code-pro"!important}.sqlOprBar___1FYEt{margin-top:-10px;padding:5px;display:flex}.sqlOprBar___1FYEt .sqlOprBarLeftBox___24kL8{flex:1 1 200px}.sqlOprBar___1FYEt .sqlOprBarRightBox___3ZFrE{flex:0 1 210px}.sqlOprBar___1FYEt .ant-btn-round.ant-btn-sm{font-size:12px}.sqlOprBar___1FYEt .ant-btn-primary{color:#fff;background:#02a7f0;border-color:#02a7f0}.sqlOprBar___1FYEt .ant-segmented-item-selected{color:#fff;background:#02a7f0;border-color:#02a7f0}.sqlOprIcon___3WhIP{margin-right:30px;color:#02a7f0;font-size:22px}.sqlOprIcon___3WhIP:hover{cursor:pointer;opacity:.8}.sqlOprIcon___3WhIP:active{opacity:.7}.sqlOprBtn___22eSD{margin-right:30px;vertical-align:super!important}.sqlOprBtn___22eSD:hover{cursor:pointer;opacity:.8}.sqlOprBtn___22eSD:active{opacity:.7}.sqlOprSwitch___4zfeE{float:right;margin-right:10px!important}.is-sql-full-select{background-color:#02a7f0}.cjjWdp:hover{z-index:10}.sqlMain___2KqMi{display:flex;flex-direction:row;height:100%}.sqlMain___2KqMi .sqlEditorWrapper___-8V62{flex:1 1;height:100%;overflow:hidden}.sqlMain___2KqMi .sqlParams___3VPC6{width:20%;height:100%!important;overflow:auto}.sqlMain___2KqMi .hideSqlParams___1tDWo{width:0;height:100%!important;overflow:auto}.sqlParamsBody___wHl2x .header___3A-0E{display:flex;padding:10px;font-weight:700}.sqlParamsBody___wHl2x .header___3A-0E .title___1ZIlX{flex:1 1}.sqlParamsBody___wHl2x .header___3A-0E .icon___3egme{display:flex;align-items:center;margin-right:10px!important;cursor:pointer}.sqlParamsBody___wHl2x .paramsList___YmGR3 .paramsItem___3oqte{display:flex;padding:10px}.sqlParamsBody___wHl2x .paramsList___YmGR3 .paramsItem___3oqte .ant-list-item-action{margin-left:5px}.sqlParamsBody___wHl2x .paramsList___YmGR3 .paramsItem___3oqte .name___3zLJQ{flex:1 1;width:80%;overflow:hidden;font-size:12px;text-overflow:ellipsis}.sqlParamsBody___wHl2x .paramsList___YmGR3 .paramsItem___3oqte .name___3zLJQ:hover{cursor:pointer}.sqlParamsBody___wHl2x .paramsList___YmGR3 .paramsItem___3oqte .icon___3egme{margin-left:10px}.disableIcon___G1CbW{vertical-align:super!important;background:#7d7f80!important;border-color:#7d7f80!important}.disableIcon___G1CbW .anticon .anticon-play-circle{color:#fff}.disableIcon___G1CbW:hover{cursor:not-allowed;opacity:1}.sqlTaskListWrap___1PsW7{position:relative;width:262px;border-top:0!important;border-radius:0}.sqlTaskListWrap___1PsW7 .ant-card-head{min-height:20px}.sqlTaskListWrap___1PsW7 .ant-card-head-title{padding:8px 0}.sqlTaskList___fGovo{position:absolute!important;top:42px;right:0;bottom:0;left:0;overflow:auto}.sqlBottmWrap___2nkn6{display:flex;height:100%}.sqlBottmWrap___2nkn6.small{top:334px}.sqlBottmWrap___2nkn6.middle{top:384px}.sqlResultWrap___16rbx{position:relative;display:flex;flex:1 1;flex-direction:column;overflow:auto;border:1px solid #eee;border-top:0;border-left:0}.sqlToolBar___3ZW8u{display:flex;flex-direction:row-reverse;align-items:center;height:41px;padding:5px 0;text-align:right}.sqlResultPane___2J4Kp{flex:1 1;border-top:1px solid #eee}.sqlToolBtn___27ZyH{margin-right:15px}.runScriptBtn___39Ds3{margin-right:15px;background-color:#e87954;border-color:#e87954}.runScriptBtn___39Ds3:hover{border-color:#f89878;background:#f89878}.runScriptBtn___39Ds3:focus{border-color:#f89878;background:#f89878}.taskFailed___1Kx9E{padding:20px 20px 0}.sqlResultContent___3TpKZ{position:absolute;top:50%;width:100%;color:rgba(0,0,0,.25);font-size:16px;text-align:center}.sqlResultLog___1xHPV{padding:20px;word-wrap:break-word}.tableList___3hI4i{position:absolute!important;top:160px;right:0;bottom:26px;left:0;overflow-x:hidden;overflow-y:auto;border-bottom:1px solid #eee}.tablePage___2LhQK{position:absolute!important;bottom:0;left:0;z-index:1;width:100%;min-width:250px;overflow:hidden}.tableListItem___27d6w{width:88%;overflow:hidden;font-size:12px;text-overflow:ellipsis}.tableListItem___27d6w:hover{cursor:pointer}.tableItem___127XC.ant-list-item{padding:6px 0 6px 6px}.tableItem___127XC .ant-list-item-action{margin-left:12px!important}.tableItem___127XC:hover{background:#dee4e9;border-bottom:1px solid #f0f0f0}.tableItem___127XC.active{background:#a0c5e8}.taskIcon___3aBIV{margin-right:10px;color:#1890ff;font-size:14px}.taskSuccessIcon___3XL39{margin-right:10px;color:#1890ff;font-size:14px;color:#67c23a}.taskFailIcon___U7M6_{margin-right:10px;color:#1890ff;font-size:14px;color:#f56c6c}.resultFailIcon___3oFSk{margin-right:8px;color:#f56c6c}.taskItem___1y3vX{padding:10px 8px!important;font-size:12px;cursor:pointer}.taskItem___1y3vX.ant-list-item{justify-content:flex-start}.taskItem___1y3vX:hover{background:#dee4e9}.activeTask___YBkj9{background:#a0c5e8}.resultTable___2DZmh{width:100%}.resultTable___2DZmh .ant-table-body{width:100%;overflow:auto!important}.resultTable___2DZmh .ant-table-cell,.resultTable___2DZmh .resultTableRow>td{padding:8px;font-size:12px}.taskLogWrap___3_C6-{word-wrap:break-word}.siteTagPlus___1rPSE{background:#fff;border-style:dashed}.editTag___1sXJQ{margin-bottom:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tagInput___1OZzG{width:78px;margin-right:8px;vertical-align:top}.outside___1sN2g{position:relative;height:100%}.collapseRightBtn___3zLQQ{position:absolute;top:calc(50% + 50px);right:0;z-index:100;display:flex;align-items:center;height:70px;color:#fff;font-size:12px;background-color:rgba(40,46,54,.2);border-radius:24px 0 0 24px;cursor:pointer;transition:all .3s ease}.collapseLeftBtn___18RNq{position:absolute;top:calc(50% + 45px);left:0;z-index:100;display:flex;align-items:center;height:70px;color:#fff;font-size:12px;background-color:rgba(40,46,54,.2);border-radius:0 24px 24px 0;cursor:pointer;transition:all .3s ease}.detail___2ufaP .titleCollapse___dJM7U{float:right;padding-right:18px;color:#1890ff;line-height:35px;text-align:right;cursor:pointer}.detail___2ufaP .tableTitle___1XX8H{display:inline-block;width:85%;margin-left:15px;overflow:hidden;line-height:35px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.detail___2ufaP .ant-divider-horizontal{margin:0}.search___mqcqG{margin-left:10px}.middleArea___eJA2_ .ant-tabs-nav .ant-tabs-tab{border:none;border-right:1px solid #f0f0f0;border-radius:0!important}.middleArea___eJA2_ .ant-tabs-nav-add{border-radius:0!important}.middleArea___eJA2_ .ant-tabs-tab .ant-tabs-tab-remove .closeTab{opacity:0}.middleArea___eJA2_ .ant-tabs-tab .ant-tabs-tab-remove .dot{opacity:1}.middleArea___eJA2_ .ant-tabs-tab:hover .ant-tabs-tab-remove .closeTab{opacity:1!important}.middleArea___eJA2_ .ant-tabs-tab:hover .ant-tabs-tab-remove .dot{opacity:0}.menu___368H_{position:relative;z-index:1;height:100%;padding:5px;overflow:hidden;overflow-x:hidden;overflow-y:auto}.menu___368H_ .ant-form{margin:-2px}.menuList___27tJX{position:absolute!important;top:95px;right:0;bottom:26px;left:0;overflow-x:hidden;overflow-y:auto;border-bottom:1px solid #eee}.menuList___27tJX .menuItem___3tI3I.ant-list-item{padding:6px 0 6px 14px}.menuList___27tJX .menuItem___3tI3I .ant-list-item-action{margin-left:12px!important}.menuList___27tJX .menuItem___3tI3I:hover{background:#dee4e9;border-bottom:1px solid #f0f0f0}.menuList___27tJX .menuItem___3tI3I:hover .icon___3egme{display:block}.menuList___27tJX .menuItem___3tI3I.active{background:#a0c5e8}.menuList___27tJX .menuItem___3tI3I .menuListItem___1C6z1{width:90%;overflow:hidden;font-size:12px;white-space:nowrap;text-overflow:ellipsis}.menuList___27tJX .menuItem___3tI3I .menuListItem___1C6z1:hover{cursor:pointer}.menuList___27tJX .menuItem___3tI3I .icon___3egme{display:none;margin-right:15px!important;cursor:pointer}.menuList___27tJX .menuItem___3tI3I .menuIcon___34eY3{display:flex}.scriptFile___2mstI{width:100%;margin:10px;overflow:hidden;font-size:14px;white-space:nowrap;text-overflow:ellipsis}.scriptFile___2mstI .icon___3egme{margin-right:10px}.sqlScriptName___38RPg{width:93%!important;margin:14px 0 0 14px!important}.fileIcon___2-aJM{width:20px!important;height:20px!important;padding-top:2px!important;padding-right:5px!important;vertical-align:middle}.itemName___50W0I{vertical-align:middle}.paneName___38IRg{width:100px;overflow:hidden;font-size:12px!important;white-space:nowrap;text-overflow:ellipsis}.titleIcon___3_Z-9{width:16px!important;height:16px!important;margin:0 3px 4px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field{max-width:100%}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-xs{width:104px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-s{width:216px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-sm{width:216px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-m{width:328px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-md{width:328px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-l{width:440px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-lg{width:440px}.ant-form>div:not(.ant-pro-form-light-filter) .pro-field-xl{width:552px}.ant-pro-form-group-title{margin-bottom:16px;font-weight:700}.ant-pro-form-group-container{flex-wrap:wrap;max-width:100%}.ant-pro-form-group-container>div.ant-space-item{max-width:100%}.ant-pro-form-group-twoLine{display:block;width:100%}.ant-pro-form-group-twoLine .ant-pro-form-group-title{width:100%;margin:8px 0}.ant-pro-form-group-twoLine .ant-pro-form-group-container{padding-left:16px}.ant-pro-form-group-twoLine .ant-form-item,.ant-pro-form-group-twoLine .ant-space-item{width:100%}.ant-pro-form-group-twoLine .ant-form-item-control{display:flex;align-items:center;justify-content:flex-end}.ant-pro-form-group-twoLine .ant-form-item-control-input{align-items:center;justify-content:flex-end}.ant-pro-form-group-twoLine .ant-form-item-control-input-content{flex:none}.ant-form:not(.ant-form-horizontal) .ant-pro-form-list-item:not(.ant-pro-form-list-item-show-label) .ant-form-item-label{display:none}.ant-pro-form-list{max-width:100%}.ant-pro-form-list-item.ant-pro-form-list-item-show-label .ant-form-item-label{display:inline-block}.ant-pro-form-list-item:first-of-type div:first-of-type .ant-form-item .ant-form-item-label{display:inline-block}.ant-pro-form-list-action{display:flex;height:32px;margin-bottom:24px;line-height:32px}.ant-pro-form-list .ant-pro-card .ant-pro-card-extra .ant-pro-form-list-action{margin-bottom:0}.ant-pro-form-list-action-icon{margin-left:8px;cursor:pointer;transition:color .3s ease-in-out}.ant-pro-form-list-action-icon:hover{color:#5493ff}.ant-pro-form-list-creator-button-top{margin-bottom:24px}.ant-pro-field-light-wrapper-collapse-label{padding:1}.ant-pro-field-light-wrapper-container .ant-form-item{margin-bottom:0}.ant-pro-core-field-dropdown-label{cursor:pointer}.ant-pro-core-field-dropdown-overlay{min-width:200px;margin-top:4px;background-color:#fff;box-shadow:0 1px 2px -2px rgba(0,0,0,.16),0 3px 6px 0 rgba(0,0,0,.12),0 5px 12px 4px rgba(0,0,0,.09)}.ant-pro-core-field-dropdown-content{padding:16px}.ant-pro-core-dropdown-footer{display:flex;justify-content:space-between;padding:16px 16px 16px 8px;border-top:1px solid #f0f0f0}.ant-pro-core-field-label{display:inline-flex;grid-gap:4px;gap:4px;align-items:center;height:30px;padding:0 4px;font-size:14px;line-height:30px;border-radius:2px;cursor:pointer}.ant-pro-core-field-label:hover{background-color:rgba(0,0,0,.1)}.ant-pro-core-field-label-active{padding:0 12px;background-color:rgba(0,0,0,.04)}.ant-pro-core-field-label-active.ant-pro-core-field-label-allow-clear:hover:not(.ant-pro-core-field-label-disabled) .ant-pro-core-field-label-arrow{display:none}.ant-pro-core-field-label-active.ant-pro-core-field-label-allow-clear:hover:not(.ant-pro-core-field-label-disabled) .ant-pro-core-field-label-close{display:inline-block}.ant-pro-core-field-label-icon{height:12px;padding:1px;color:rgba(0,0,0,.45);font-size:12px;vertical-align:middle}.ant-pro-core-field-label-icon.ant-pro-core-field-label-close{display:none;height:14px;padding:3px;color:#fff;font-size:8px;background-color:rgba(0,0,0,.25);border-radius:50%}.ant-pro-core-field-label-icon.ant-pro-core-field-label-close:hover{background-color:rgba(0,0,0,.45)}.ant-pro-core-field-label-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-pro-core-field-label-disabled .ant-pro-core-field-label-icon{color:rgba(0,0,0,.25)}.ant-pro-core-field-label-small{height:24px;padding:0 4px;font-size:12px;line-height:24px}.ant-pro-core-field-label-small.ant-pro-core-field-label-active{padding:0 8px}.ant-pro-core-field-label-small .ant-pro-core-field-label-icon{padding:0}.ant-pro-core-field-label-small .ant-pro-core-field-label-close{margin-top:-2px;padding:3px;font-size:6px}.ant-pro-core-field-label-bordered{height:32px;padding:0 12px;border:1px solid #d9d9d9;border-radius:4px}.ant-pro-core-field-label-bordered.ant-pro-core-field-label-small{height:24px;padding:0 8px}.ant-pro-core-field-label-bordered.ant-pro-core-field-label-active{background-color:#fff}.ant-pro-inline-error-form-item-multiple{padding:6px 8px 12px}.ant-pro-inline-error-form-item-progress-success .ant-progress-bg{background-color:#26c992}.ant-pro-inline-error-form-item-progress-error .ant-progress-bg{background-color:#ef4872}.ant-pro-inline-error-form-item-progress-warning .ant-progress-bg{background-color:#ffb924}.ant-pro-inline-error-form-item-rule{margin:0;padding:0;list-style:none}.ant-pro-inline-error-form-item-rule-content{display:flex;align-items:center}.ant-pro-inline-error-form-item-rule-content-icon-default{display:flex;align-items:center;justify-content:center;width:14px;height:22px}.ant-pro-inline-error-form-item-rule-content-icon-default-circle{width:6px;height:6px;background-color:rgba(0,10,36,.65);border-radius:4px}.ant-pro-inline-error-form-item-rule-content-icon-loading{color:#296df3}.ant-pro-inline-error-form-item-rule-content-icon-error{color:#ef4872}.ant-pro-inline-error-form-item-rule-content-icon-success{color:#26c992}.ant-pro-inline-error-form-item-rule-content-text{color:rgba(0,10,36,.85)}.ant-image{position:relative;display:inline-block}.ant-image-img{width:100%;height:auto;vertical-align:middle}.ant-image-img-placeholder{background-color:#f5f5f5;background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE0LjUgMi41aC0xM0EuNS41IDAgMDAxIDN2MTBhLjUuNSAwIDAwLjUuNWgxM2EuNS41IDAgMDAuNS0uNVYzYS41LjUgMCAwMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwMTAgMiAxIDEgMCAwMTAtMnptOC4wMyA2LjgzYS4xMjcuMTI3IDAgMDEtLjA4MS4wM0gyLjc2OWEuMTI1LjEyNSAwIDAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAxLjE3Ny0uMDE2bC4wMTYuMDE2TDcuMDggMTAuMDlsMi40Ny0yLjkzYS4xMjYuMTI2IDAgMDEuMTc3LS4wMTZsLjAxNS4wMTYgMy41ODggNC4yNDRhLjEyNy4xMjcgMCAwMS0uMDIuMTc1eiIgZmlsbD0iIzhDOEM4QyIvPjwvc3ZnPg==");background-repeat:no-repeat;background-position:50%;background-size:30%}.ant-image-mask{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;color:#fff;background:rgba(0,0,0,.5);cursor:pointer;opacity:0;transition:opacity .3s}.ant-image-mask-info{padding:0 4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-image-mask-info .anticon{-webkit-margin-end:4px;margin-inline-end:4px}.ant-image-mask:hover{opacity:1}.ant-image-placeholder{position:absolute;top:0;right:0;bottom:0;left:0}.ant-image-preview{pointer-events:none;height:100%;text-align:center}.ant-image-preview.ant-zoom-appear,.ant-image-preview.ant-zoom-enter{transform:none;opacity:0;animation-duration:.3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-image-preview-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;height:100%;background-color:rgba(0,0,0,.45)}.ant-image-preview-mask-hidden{display:none}.ant-image-preview-wrap{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;outline:0}.ant-image-preview-body{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden}.ant-image-preview-img{max-width:100%;max-height:100%;vertical-align:middle;transform:scaleX(1);cursor:-webkit-grab;cursor:grab;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:auto}.ant-image-preview-img-wrapper{position:absolute;top:0;right:0;bottom:0;left:0;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s}.ant-image-preview-img-wrapper:before{display:inline-block;width:1px;height:50%;margin-right:-1px;content:""}.ant-image-preview-moving .ant-image-preview-img{cursor:-webkit-grabbing;cursor:grabbing}.ant-image-preview-moving .ant-image-preview-img-wrapper{transition-duration:0s}.ant-image-preview-wrap{z-index:1080}.ant-image-preview-operations-wrapper{position:fixed;top:0;right:0;z-index:1081;width:100%}.ant-image-preview-operations{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum","tnum";display:flex;flex-direction:row-reverse;align-items:center;color:hsla(0,0%,100%,.85);list-style:none;background:rgba(0,0,0,.1);pointer-events:auto}.ant-image-preview-operations-operation{margin-left:12px;padding:12px;cursor:pointer;transition:all .3s}.ant-image-preview-operations-operation:hover{background:rgba(0,0,0,.2)}.ant-image-preview-operations-operation-disabled{color:hsla(0,0%,100%,.25);pointer-events:none}.ant-image-preview-operations-operation:last-of-type{margin-left:0}.ant-image-preview-operations-progress{position:absolute;left:50%;transform:translateX(-50%)}.ant-image-preview-operations-icon{font-size:18px}.ant-image-preview-switch-left,.ant-image-preview-switch-right{position:fixed;top:50%;right:8px;z-index:1081;display:flex;align-items:center;justify-content:center;width:44px;height:44px;color:hsla(0,0%,100%,.85);background:rgba(0,0,0,.1);border-radius:50%;transform:translateY(-50%);cursor:pointer;transition:all .3s;pointer-events:auto}.ant-image-preview-switch-left:hover,.ant-image-preview-switch-right:hover{background:rgba(0,0,0,.2)}.ant-image-preview-switch-left-disabled,.ant-image-preview-switch-left-disabled:hover,.ant-image-preview-switch-right-disabled,.ant-image-preview-switch-right-disabled:hover{color:hsla(0,0%,100%,.25);background:rgba(0,0,0,.1);cursor:not-allowed}.ant-image-preview-switch-left-disabled:hover>.anticon,.ant-image-preview-switch-left-disabled>.anticon,.ant-image-preview-switch-right-disabled:hover>.anticon,.ant-image-preview-switch-right-disabled>.anticon{cursor:not-allowed}.ant-image-preview-switch-left>.anticon,.ant-image-preview-switch-right>.anticon{font-size:18px}.ant-image-preview-switch-left{left:8px}.ant-image-preview-switch-right{right:8px}.ant-picker-status-error.ant-picker,.ant-picker-status-error.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#ef4872}.ant-picker-status-error.ant-picker-focused,.ant-picker-status-error.ant-picker:focus{border-color:#fc7492;box-shadow:0 0 0 2px rgba(239,72,114,.2);border-right-width:1px;outline:0}.ant-picker-status-error.ant-picker .ant-picker-active-bar{background:#fc7492}.ant-picker-status-warning.ant-picker,.ant-picker-status-warning.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#ffb924}.ant-picker-status-warning.ant-picker-focused,.ant-picker-status-warning.ant-picker:focus{border-color:#ffcc4d;box-shadow:0 0 0 2px rgba(255,185,36,.2);border-right-width:1px;outline:0}.ant-picker-status-warning.ant-picker .ant-picker-active-bar{background:#ffcc4d}.ant-picker{box-sizing:border-box;margin:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";padding:4px 11px;position:relative;display:inline-flex;align-items:center;background:#fff;border:1px solid #d9d9d9;border-radius:4px;transition:border .3s,box-shadow .3s}.ant-picker-focused,.ant-picker:hover{border-color:#4e86f5;border-right-width:1px}.ant-picker-focused{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-picker.ant-picker-disabled{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-picker.ant-picker-disabled .ant-picker-suffix{color:rgba(0,0,0,.25)}.ant-picker.ant-picker-borderless{background-color:transparent!important;border-color:transparent!important;box-shadow:none!important}.ant-picker-input{position:relative;display:inline-flex;align-items:center;width:100%}.ant-picker-input>input{position:relative;display:inline-block;width:100%;min-width:0;color:rgba(0,10,36,.85);font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border-radius:4px;transition:all .3s;flex:auto;min-width:1px;height:auto;padding:0;background:transparent;border:0}.ant-picker-input>input::-webkit-input-placeholder{color:#bfbfbf;-webkit-user-select:none;user-select:none}.ant-picker-input>input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-picker-input>input::-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-picker-input>input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-picker-input>input:-ms-input-placeholder{text-overflow:ellipsis}.ant-picker-input>input:placeholder-shown{text-overflow:ellipsis}.ant-picker-input>input:hover{border-color:#4e86f5;border-right-width:1px}.ant-picker-input>input-focused,.ant-picker-input>input:focus{border-color:#5493ff;box-shadow:0 0 0 2px rgba(41,109,243,.2);border-right-width:1px;outline:0}.ant-picker-input>input-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-picker-input>input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-picker-input>input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input-borderless,.ant-picker-input>input-borderless-disabled,.ant-picker-input>input-borderless-focused,.ant-picker-input>input-borderless:focus,.ant-picker-input>input-borderless:hover,.ant-picker-input>input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-picker-input>input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-picker-input>input-lg{padding:6.5px 11px;font-size:16px}.ant-picker-input>input-sm{padding:0 7px}.ant-picker-input>input:focus{box-shadow:none}.ant-picker-input>input[disabled]{background:transparent}.ant-picker-input:hover .ant-picker-clear{opacity:1}.ant-picker-input-placeholder>input{color:#bfbfbf}.ant-picker-large{padding:6.5px 11px}.ant-picker-large .ant-picker-input>input{font-size:16px}.ant-picker-small{padding:0 7px}.ant-picker-suffix{display:flex;flex:none;align-self:center;margin-left:4px;color:rgba(0,0,0,.25);line-height:1;pointer-events:none}.ant-picker-suffix>*{vertical-align:top}.ant-picker-suffix>:not(:last-child){margin-right:8px}.ant-picker-clear{position:absolute;top:50%;right:0;color:rgba(0,0,0,.25);line-height:1;background:#fff;transform:translateY(-50%);cursor:pointer;opacity:0;transition:opacity .3s,color .3s}.ant-picker-clear>*{vertical-align:top}.ant-picker-clear:hover{color:rgba(0,10,36,.65)}.ant-picker-separator{position:relative;display:inline-block;width:1em;height:16px;color:rgba(0,0,0,.25);font-size:16px;vertical-align:top;cursor:default}.ant-picker-focused .ant-picker-separator{color:rgba(0,10,36,.65)}.ant-picker-disabled .ant-picker-range-separator .ant-picker-separator{cursor:not-allowed}.ant-picker-range{position:relative;display:inline-flex}.ant-picker-range .ant-picker-clear{right:11px}.ant-picker-range:hover .ant-picker-clear{opacity:1}.ant-picker-range .ant-picker-active-bar{bottom:-1px;height:2px;margin-left:11px;background:#296df3;opacity:0;transition:all .3s ease-out;pointer-events:none}.ant-picker-range.ant-picker-focused .ant-picker-active-bar{opacity:1}.ant-picker-range-separator{align-items:center;padding:0 8px;line-height:1}.ant-picker-range.ant-picker-small .ant-picker-clear{right:7px}.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-left:7px}.ant-picker-dropdown{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050}.ant-picker-dropdown-hidden{display:none}.ant-picker-dropdown-placement-bottomLeft .ant-picker-range-arrow{top:2.58561808px;display:block;transform:rotate(-135deg) translateY(1px)}.ant-picker-dropdown-placement-topLeft .ant-picker-range-arrow{bottom:2.58561808px;display:block;transform:rotate(45deg)}.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topRight,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomRight,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-picker-dropdown-range{padding:7.54247233px 0}.ant-picker-dropdown-range-hidden{display:none}.ant-picker-dropdown .ant-picker-panel>.ant-picker-time-panel{padding-top:4px}.ant-picker-ranges{margin-bottom:0;padding:4px 12px;overflow:hidden;line-height:34px;text-align:left;list-style:none}.ant-picker-ranges>li{display:inline-block}.ant-picker-ranges .ant-picker-preset>.ant-tag-blue{color:#296df3;background:#e3ecfd;border-color:#86acf8;cursor:pointer}.ant-picker-ranges .ant-picker-ok{float:right;margin-left:8px}.ant-picker-range-wrapper{display:flex}.ant-picker-range-arrow{position:absolute;z-index:1;width:11.3137085px;height:11.3137085px;margin-left:16.5px;box-shadow:2px 2px 6px -2px rgba(0,0,0,.1);transition:left .3s ease-out;border-radius:0 0 2px;pointer-events:none}.ant-picker-range-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-picker-panel-container{overflow:hidden;vertical-align:top;background:#fff;border-radius:4px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05);transition:margin .3s}.ant-picker-panel-container .ant-picker-panels{display:inline-flex;flex-wrap:nowrap;direction:ltr}.ant-picker-panel-container .ant-picker-panel{vertical-align:top;background:transparent;border-width:0 0 1px;border-radius:0}.ant-picker-panel-container .ant-picker-panel .ant-picker-content,.ant-picker-panel-container .ant-picker-panel table{text-align:center}.ant-picker-panel-container .ant-picker-panel-focused{border-color:#f0f0f0}.ant-picker-compact-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl){margin-right:-1px}.ant-picker-compact-item:not(.ant-picker-compact-last-item).ant-picker-compact-item-rtl{margin-left:-1px}.ant-picker-compact-item:active,.ant-picker-compact-item:focus,.ant-picker-compact-item:hover{z-index:2}.ant-picker-compact-item.ant-picker-focused{z-index:2}.ant-picker-compact-item[disabled]{z-index:0}.ant-picker-compact-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-last-item).ant-picker{border-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-first-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-last-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-first-item:not(.ant-picker-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-last-item:not(.ant-picker-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-picker-panel{display:inline-flex;flex-direction:column;text-align:center;background:#fff;border:1px solid #f0f0f0;border-radius:4px;outline:none}.ant-picker-panel-focused{border-color:#296df3}.ant-picker-date-panel,.ant-picker-decade-panel,.ant-picker-month-panel,.ant-picker-quarter-panel,.ant-picker-time-panel,.ant-picker-week-panel,.ant-picker-year-panel{display:flex;flex-direction:column;width:280px}.ant-picker-header{display:flex;padding:0 8px;color:rgba(0,10,36,.85);border-bottom:1px solid #f0f0f0}.ant-picker-header>*{flex:none}.ant-picker-header button{padding:0;color:rgba(0,0,0,.25);line-height:40px;background:transparent;border:0;cursor:pointer;transition:color .3s}.ant-picker-header>button{min-width:1.6em;font-size:14px}.ant-picker-header>button:hover{color:rgba(0,10,36,.85)}.ant-picker-header-view{flex:auto;font-weight:500;line-height:40px}.ant-picker-header-view button{color:inherit;font-weight:inherit}.ant-picker-header-view button:not(:first-child){margin-left:8px}.ant-picker-header-view button:hover{color:#296df3}.ant-picker-next-icon,.ant-picker-prev-icon,.ant-picker-super-next-icon,.ant-picker-super-prev-icon{position:relative;display:inline-block;width:7px;height:7px}.ant-picker-next-icon:before,.ant-picker-prev-icon:before,.ant-picker-super-next-icon:before,.ant-picker-super-prev-icon:before{position:absolute;top:0;left:0;display:inline-block;width:7px;height:7px;border:0 solid;border-width:1.5px 0 0 1.5px;content:""}.ant-picker-super-next-icon:after,.ant-picker-super-prev-icon:after{position:absolute;top:4px;left:4px;display:inline-block;width:7px;height:7px;border:0 solid;border-width:1.5px 0 0 1.5px;content:""}.ant-picker-prev-icon,.ant-picker-super-prev-icon{transform:rotate(-45deg)}.ant-picker-next-icon,.ant-picker-super-next-icon{transform:rotate(135deg)}.ant-picker-content{width:100%;table-layout:fixed;border-collapse:collapse}.ant-picker-content td,.ant-picker-content th{position:relative;min-width:24px;font-weight:400}.ant-picker-content th{height:30px;color:rgba(0,10,36,.85);line-height:30px}.ant-picker-cell{padding:3px 0;color:rgba(0,0,0,.25);cursor:pointer}.ant-picker-cell-in-view{color:rgba(0,10,36,.85)}.ant-picker-cell:before{position:absolute;top:50%;right:0;left:0;z-index:1;height:24px;transform:translateY(-50%);transition:all .3s;content:""}.ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner,.ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner{background:#f5f5f5}.ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;border:1px solid #296df3;border-radius:4px;content:""}.ant-picker-cell-in-view.ant-picker-cell-in-range{position:relative}.ant-picker-cell-in-view.ant-picker-cell-in-range:before{background:#e3ecfd}.ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner{color:#fff;background:#296df3}.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):before,.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):before{background:#e3ecfd}.ant-picker-cell-in-view.ant-picker-cell-range-start:before{left:50%}.ant-picker-cell-in-view.ant-picker-cell-range-end:before{right:50%}.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-end-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-start-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-end-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-in-range):after{position:absolute;top:50%;z-index:0;height:24px;border-top:1px dashed #8aaff8;border-bottom:1px dashed #8aaff8;transform:translateY(-50%);transition:all .3s;content:""}.ant-picker-cell-range-hover-end:after,.ant-picker-cell-range-hover-start:after,.ant-picker-cell-range-hover:after{right:0;left:2px}.ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-end.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single).ant-picker-cell-range-hover-end:before,.ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single).ant-picker-cell-range-hover-start:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start:before{background:#d2e0fc}.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:4px 0 0 4px}.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:0 4px 4px 0}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after,.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{position:absolute;top:0;bottom:0;z-index:-1;background:#d2e0fc;transition:all .3s;content:""}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{right:-6px;left:0}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{right:0;left:-6px}.ant-picker-cell-range-hover.ant-picker-cell-range-start:after{right:50%}.ant-picker-cell-range-hover.ant-picker-cell-range-end:after{left:50%}.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after,.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child:after{left:6px;border-left:1px dashed #8aaff8;border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child:after{right:6px;border-right:1px dashed #8aaff8;border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-picker-cell-disabled{color:rgba(0,0,0,.25);pointer-events:none}.ant-picker-cell-disabled .ant-picker-cell-inner{background:transparent}.ant-picker-cell-disabled:before{background:rgba(0,0,0,.04)}.ant-picker-cell-disabled.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:rgba(0,0,0,.25)}.ant-picker-decade-panel .ant-picker-content,.ant-picker-month-panel .ant-picker-content,.ant-picker-quarter-panel .ant-picker-content,.ant-picker-year-panel .ant-picker-content{height:264px}.ant-picker-decade-panel .ant-picker-cell-inner,.ant-picker-month-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-year-panel .ant-picker-cell-inner{padding:0 8px}.ant-picker-quarter-panel .ant-picker-content{height:56px}.ant-picker-footer{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:100%;line-height:38px;text-align:center;border-bottom:1px solid transparent}.ant-picker-panel .ant-picker-footer{border-top:1px solid #f0f0f0}.ant-picker-footer-extra{padding:0 12px;line-height:38px;text-align:left}.ant-picker-footer-extra:not(:last-child){border-bottom:1px solid #f0f0f0}.ant-picker-now{text-align:left}.ant-picker-today-btn{color:#296df3}.ant-picker-today-btn:hover{color:#5493ff}.ant-picker-today-btn:active{color:#184ecc}.ant-picker-today-btn.ant-picker-today-btn-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-picker-decade-panel .ant-picker-cell-inner{padding:0 4px}.ant-picker-decade-panel .ant-picker-cell:before{display:none}.ant-picker-month-panel .ant-picker-body,.ant-picker-quarter-panel .ant-picker-body,.ant-picker-year-panel .ant-picker-body{padding:0 8px}.ant-picker-month-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-year-panel .ant-picker-cell-inner{width:60px}.ant-picker-month-panel .ant-picker-cell-range-hover-start:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-year-panel .ant-picker-cell-range-hover-start:after{left:14px;border-left:1px dashed #8aaff8;border-radius:4px 0 0 4px}.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-start:after{right:14px;border-right:1px dashed #8aaff8;border-radius:0 4px 4px 0}.ant-picker-month-panel .ant-picker-cell-range-hover-end:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-year-panel .ant-picker-cell-range-hover-end:after{right:14px;border-right:1px dashed #8aaff8;border-radius:0 4px 4px 0}.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-end:after{left:14px;border-left:1px dashed #8aaff8;border-radius:4px 0 0 4px}.ant-picker-week-panel .ant-picker-body{padding:8px 12px}.ant-picker-week-panel .ant-picker-cell-selected .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell:hover .ant-picker-cell-inner{background:transparent!important}.ant-picker-week-panel-row td{transition:background .3s}.ant-picker-week-panel-row:hover td{background:#f5f5f5}.ant-picker-week-panel-row-selected:hover td,.ant-picker-week-panel-row-selected td{background:#296df3}.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-week,.ant-picker-week-panel-row-selected td.ant-picker-cell-week{color:hsla(0,0%,100%,.5)}.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-today .ant-picker-cell-inner:before,.ant-picker-week-panel-row-selected td.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:#fff}.ant-picker-week-panel-row-selected:hover td .ant-picker-cell-inner,.ant-picker-week-panel-row-selected td .ant-picker-cell-inner{color:#fff}.ant-picker-date-panel .ant-picker-body{padding:8px 12px}.ant-picker-date-panel .ant-picker-content{width:252px}.ant-picker-date-panel .ant-picker-content th{width:36px}.ant-picker-datetime-panel{display:flex}.ant-picker-datetime-panel .ant-picker-time-panel{border-left:1px solid #f0f0f0}.ant-picker-datetime-panel .ant-picker-date-panel,.ant-picker-datetime-panel .ant-picker-time-panel{transition:opacity .3s}.ant-picker-datetime-panel-active .ant-picker-date-panel,.ant-picker-datetime-panel-active .ant-picker-time-panel{opacity:.3}.ant-picker-datetime-panel-active .ant-picker-date-panel-active,.ant-picker-datetime-panel-active .ant-picker-time-panel-active{opacity:1}.ant-picker-time-panel{width:auto;min-width:auto}.ant-picker-time-panel .ant-picker-content{display:flex;flex:auto;height:224px}.ant-picker-time-panel-column{flex:1 0 auto;width:56px;margin:0;padding:0;overflow-y:hidden;text-align:left;list-style:none;transition:background .3s}.ant-picker-time-panel-column:after{display:block;height:196px;content:""}.ant-picker-datetime-panel .ant-picker-time-panel-column:after{height:198px}.ant-picker-time-panel-column:not(:first-child){border-left:1px solid #f0f0f0}.ant-picker-time-panel-column-active{background:rgba(227,236,253,.2)}.ant-picker-time-panel-column:hover{overflow-y:auto}.ant-picker-time-panel-column>li{margin:0;padding:0}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner{display:block;width:100%;height:28px;margin:0;padding:0 0 0 14px;color:rgba(0,10,36,.85);line-height:28px;border-radius:0;cursor:pointer;transition:background .3s}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover{background:#f5f5f5}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner{background:#e3ecfd}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-disabled .ant-picker-time-panel-cell-inner{color:rgba(0,0,0,.25);background:transparent;cursor:not-allowed}:root .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,:root .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell,_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell{padding:21px 0}.ant-picker-rtl{direction:rtl}.ant-picker-rtl .ant-picker-suffix{margin-right:4px;margin-left:0}.ant-picker-rtl .ant-picker-clear{right:auto;left:0}.ant-picker-rtl .ant-picker-separator{transform:rotate(180deg)}.ant-picker-panel-rtl .ant-picker-header-view button:not(:first-child){margin-right:8px;margin-left:0}.ant-picker-rtl.ant-picker-range .ant-picker-clear{right:auto;left:11px}.ant-picker-rtl.ant-picker-range .ant-picker-active-bar{margin-right:11px;margin-left:0}.ant-picker-rtl.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-right:7px}.ant-picker-dropdown-rtl .ant-picker-ranges{text-align:right}.ant-picker-dropdown-rtl .ant-picker-ranges .ant-picker-ok{float:left;margin-right:8px;margin-left:0}.ant-picker-panel-rtl{direction:rtl}.ant-picker-panel-rtl .ant-picker-prev-icon,.ant-picker-panel-rtl .ant-picker-super-prev-icon{transform:rotate(135deg)}.ant-picker-panel-rtl .ant-picker-next-icon,.ant-picker-panel-rtl .ant-picker-super-next-icon{transform:rotate(-45deg)}.ant-picker-cell .ant-picker-cell-inner{position:relative;z-index:2;display:inline-block;min-width:24px;height:24px;line-height:24px;border-radius:4px;transition:background .3s,border .3s}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:before{right:50%;left:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:before{right:0;left:50%}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-end:before{right:50%;left:50%}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{right:0;left:-6px}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{right:-6px;left:0}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-start:after{right:0;left:50%}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-end:after{right:50%;left:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:0 4px 4px 0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:4px 0 0 4px}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):first-child:after{right:6px;left:0;border-right:1px dashed #8aaff8;border-left:none;border-radius:0 4px 4px 0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):last-child:after{right:0;left:6px;border-right:none;border-left:1px dashed #8aaff8;border-radius:4px 0 0 4px}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-start.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-end.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-end:first-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-start:last-child:after{right:6px;left:6px;border-right:1px dashed #8aaff8;border-left:1px dashed #8aaff8;border-radius:4px}.ant-picker-dropdown-rtl .ant-picker-footer-extra{direction:rtl;text-align:right}.ant-picker-panel-rtl .ant-picker-time-panel{direction:ltr}.ant-pro-field-date-picker-light .ant-calendar-picker,.ant-pro-field-date-picker-light .ant-picker{position:absolute;width:80px;height:28px;overflow:hidden;visibility:hidden}.ant-pro-field-index-column{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px}.ant-pro-field-index-column-border{color:#fff;font-size:12px;line-height:12px;background-color:#314659;border-radius:9px}.ant-pro-field-index-column-border.top-three{background-color:#979797}.ant-badge{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:inline-block;line-height:1}.ant-badge-count{z-index:auto;min-width:20px;height:20px;padding:0 6px;color:#fff;font-weight:400;font-size:12px;line-height:20px;white-space:nowrap;text-align:center;background:#ef4872;border-radius:10px;box-shadow:0 0 0 1px #fff}.ant-badge-count a,.ant-badge-count a:hover{color:#fff}.ant-badge-count-sm{min-width:14px;height:14px;padding:0;font-size:12px;line-height:14px;border-radius:7px}.ant-badge-multiple-words{padding:0 8px}.ant-badge-dot{z-index:auto;width:6px;min-width:6px;height:6px;background:#ef4872;border-radius:100%;box-shadow:0 0 0 1px #fff}.ant-badge-dot.ant-scroll-number{transition:background 1.5s}.ant-badge-count,.ant-badge-dot,.ant-badge .ant-scroll-number-custom-component{position:absolute;top:0;right:0;transform:translate(50%,-50%);transform-origin:100% 0}.ant-badge-count.anticon-spin,.ant-badge-dot.anticon-spin,.ant-badge .ant-scroll-number-custom-component.anticon-spin{animation:antBadgeLoadingCircle 1s linear infinite}.ant-badge-status{line-height:inherit;vertical-align:baseline}.ant-badge-status-dot{position:relative;top:-1px;display:inline-block;width:6px;height:6px;vertical-align:middle;border-radius:50%}.ant-badge-status-success{background-color:#26c992}.ant-badge-status-processing{position:relative;background-color:#296df3}.ant-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #296df3;border-radius:50%;animation:antStatusProcessing 1.2s ease-in-out infinite;content:""}.ant-badge-status-default{background-color:#d9d9d9}.ant-badge-status-error{background-color:#ef4872}.ant-badge-status-warning{background-color:#ffb924}.ant-badge-status-pink{background:#eb2f96}.ant-badge-status-magenta{background:#eb2f96}.ant-badge-status-red{background:#f5222d}.ant-badge-status-volcano{background:#fa541c}.ant-badge-status-orange{background:#fa8c16}.ant-badge-status-yellow{background:#fadb14}.ant-badge-status-gold{background:#ffb924}.ant-badge-status-cyan{background:#13c2c2}.ant-badge-status-lime{background:#a0d911}.ant-badge-status-green{background:#26c992}.ant-badge-status-blue{background:#296df3}.ant-badge-status-geekblue{background:#2f54eb}.ant-badge-status-purple{background:#722ed1}.ant-badge-status-text{margin-left:8px;color:rgba(0,10,36,.85);font-size:14px}.ant-badge-zoom-appear,.ant-badge-zoom-enter{animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);animation-fill-mode:both}.ant-badge-zoom-leave{animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);animation-fill-mode:both}.ant-badge-not-a-wrapper .ant-badge-zoom-appear,.ant-badge-not-a-wrapper .ant-badge-zoom-enter{animation:antNoWrapperZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46)}.ant-badge-not-a-wrapper .ant-badge-zoom-leave{animation:antNoWrapperZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6)}.ant-badge-not-a-wrapper:not(.ant-badge-status){vertical-align:middle}.ant-badge-not-a-wrapper .ant-badge-count,.ant-badge-not-a-wrapper .ant-scroll-number-custom-component{transform:none}.ant-badge-not-a-wrapper .ant-scroll-number,.ant-badge-not-a-wrapper .ant-scroll-number-custom-component{position:relative;top:auto;display:block;transform-origin:50% 50%}@keyframes antStatusProcessing{0%{transform:scale(.8);opacity:.5}to{transform:scale(2.4);opacity:0}}.ant-scroll-number{overflow:hidden;direction:ltr}.ant-scroll-number-only{position:relative;display:inline-block;height:20px;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-transform-style:preserve-3d;-webkit-backface-visibility:hidden}.ant-scroll-number-only>p.ant-scroll-number-only-unit{height:20px;margin:0;-webkit-transform-style:preserve-3d;-webkit-backface-visibility:hidden}.ant-scroll-number-symbol{vertical-align:top}@keyframes antZoomBadgeIn{0%{transform:scale(0) translate(50%,-50%);opacity:0}to{transform:scale(1) translate(50%,-50%)}}@keyframes antZoomBadgeOut{0%{transform:scale(1) translate(50%,-50%)}to{transform:scale(0) translate(50%,-50%);opacity:0}}@keyframes antNoWrapperZoomBadgeIn{0%{transform:scale(0);opacity:0}to{transform:scale(1)}}@keyframes antNoWrapperZoomBadgeOut{0%{transform:scale(1)}to{transform:scale(0);opacity:0}}@keyframes antBadgeLoadingCircle{0%{transform-origin:50%}to{transform:translate(50%,-50%) rotate(1turn);transform-origin:50%}}.ant-ribbon-wrapper{position:relative}.ant-ribbon{box-sizing:border-box;margin:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:absolute;top:8px;height:22px;padding:0 8px;color:#fff;line-height:22px;white-space:nowrap;background-color:#296df3;border-radius:2px}.ant-ribbon-text{color:#fff}.ant-ribbon-corner{position:absolute;top:100%;width:8px;height:8px;color:currentcolor;border:4px solid;transform:scaleY(.75);transform-origin:top}.ant-ribbon-corner:after{position:absolute;top:-4px;left:-4px;width:inherit;height:inherit;color:rgba(0,0,0,.25);border:inherit;content:""}.ant-ribbon-color-pink{color:#eb2f96;background:#eb2f96}.ant-ribbon-color-magenta{color:#eb2f96;background:#eb2f96}.ant-ribbon-color-red{color:#f5222d;background:#f5222d}.ant-ribbon-color-volcano{color:#fa541c;background:#fa541c}.ant-ribbon-color-orange{color:#fa8c16;background:#fa8c16}.ant-ribbon-color-yellow{color:#fadb14;background:#fadb14}.ant-ribbon-color-gold{color:#ffb924;background:#ffb924}.ant-ribbon-color-cyan{color:#13c2c2;background:#13c2c2}.ant-ribbon-color-lime{color:#a0d911;background:#a0d911}.ant-ribbon-color-green{color:#26c992;background:#26c992}.ant-ribbon-color-blue{color:#296df3;background:#296df3}.ant-ribbon-color-geekblue{color:#2f54eb;background:#2f54eb}.ant-ribbon-color-purple{color:#722ed1;background:#722ed1}.ant-ribbon.ant-ribbon-placement-end{right:-8px;border-bottom-right-radius:0}.ant-ribbon.ant-ribbon-placement-end .ant-ribbon-corner{right:0;border-color:currentcolor transparent transparent currentcolor}.ant-ribbon.ant-ribbon-placement-start{left:-8px;border-bottom-left-radius:0}.ant-ribbon.ant-ribbon-placement-start .ant-ribbon-corner{left:0;border-color:currentcolor currentcolor transparent transparent}.ant-badge-rtl{direction:rtl}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-count,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-dot,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{right:auto;left:0;direction:ltr;transform:translate(-50%,-50%);transform-origin:0 0}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{right:auto;left:0;transform:translate(-50%,-50%);transform-origin:0 0}.ant-badge-rtl .ant-badge-status-text{margin-right:8px;margin-left:0}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-appear,.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-enter{animation-name:antZoomBadgeInRtl}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-leave{animation-name:antZoomBadgeOutRtl}.ant-ribbon-rtl{direction:rtl}.ant-ribbon-rtl.ant-ribbon-placement-end{right:unset;left:-8px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner{right:unset;left:0;border-color:currentcolor currentcolor transparent transparent}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner:after{border-color:currentcolor currentcolor transparent transparent}.ant-ribbon-rtl.ant-ribbon-placement-start{right:-8px;left:unset;border-bottom-right-radius:0;border-bottom-left-radius:2px}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner{right:0;left:unset;border-color:currentcolor transparent transparent currentcolor}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner:after{border-color:currentcolor transparent transparent currentcolor}@keyframes antZoomBadgeInRtl{0%{transform:scale(0) translate(-50%,-50%);opacity:0}to{transform:scale(1) translate(-50%,-50%)}}@keyframes antZoomBadgeOutRtl{0%{transform:scale(1) translate(-50%,-50%)}to{transform:scale(0) translate(-50%,-50%);opacity:0}}.ant-pro-field-checkbox-vertical .ant-checkbox-group-item{display:flex;margin-right:0}.ant-pro-field-radio-vertical .ant-radio-wrapper{display:block;margin-right:0}.ant-rate{box-sizing:border-box;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum","tnum";display:inline-block;margin:0;padding:0;color:#fadb14;font-size:20px;line-height:unset;list-style:none;outline:none}.ant-rate-disabled .ant-rate-star{cursor:default}.ant-rate-disabled .ant-rate-star>div:hover{transform:scale(1)}.ant-rate-star{position:relative;display:inline-block;color:inherit;cursor:pointer}.ant-rate-star:not(:last-child){margin-right:8px}.ant-rate-star>div{transition:all .3s,outline 0s}.ant-rate-star>div:hover{transform:scale(1.1)}.ant-rate-star>div:focus{outline:0}.ant-rate-star>div:focus-visible{outline:1px dashed #fadb14;transform:scale(1.1)}.ant-rate-star-first,.ant-rate-star-second{color:#f0f0f0;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-rate-star-first .anticon,.ant-rate-star-second .anticon{vertical-align:middle}.ant-rate-star-first{position:absolute;top:0;left:0;width:50%;height:100%;overflow:hidden;opacity:0}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-half .ant-rate-star-second{opacity:1}.ant-rate-star-full .ant-rate-star-second,.ant-rate-star-half .ant-rate-star-first{color:inherit}.ant-rate-text{display:inline-block;margin:0 8px;font-size:14px}.ant-rate-rtl{direction:rtl}.ant-rate-rtl .ant-rate-star:not(:last-child){margin-right:0;margin-left:8px}.ant-rate-rtl .ant-rate-star-first{right:0;left:auto}.ant-slider{box-sizing:border-box;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;height:12px;margin:10px 6px;padding:4px 0;cursor:pointer;touch-action:none}.ant-slider-vertical{width:12px;height:100%;margin:6px 10px;padding:0 4px}.ant-slider-vertical .ant-slider-rail{width:4px;height:100%}.ant-slider-vertical .ant-slider-track{width:4px}.ant-slider-vertical .ant-slider-handle{margin-top:-6px;margin-left:-5px}.ant-slider-vertical .ant-slider-mark{top:0;left:12px;width:18px;height:100%}.ant-slider-vertical .ant-slider-mark-text{left:4px;white-space:nowrap}.ant-slider-vertical .ant-slider-step{width:4px;height:100%}.ant-slider-vertical .ant-slider-dot{top:auto;margin-left:-2px}.ant-slider-tooltip .ant-tooltip-inner{min-width:unset}.ant-slider-rtl.ant-slider-vertical .ant-slider-handle{margin-right:-5px;margin-left:0}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark{right:12px;left:auto}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark-text{right:4px;left:auto}.ant-slider-rtl.ant-slider-vertical .ant-slider-dot{right:2px;left:auto}.ant-slider-with-marks{margin-bottom:28px}.ant-slider-rail{position:absolute;width:100%;height:4px;background-color:#f5f5f5;border-radius:4px;transition:background-color .3s}.ant-slider-track{position:absolute;height:4px;background-color:#86acf8;border-radius:4px;transition:background-color .3s}.ant-slider-handle{position:absolute;width:14px;height:14px;margin-top:-5px;background-color:#fff;border:2px solid #86acf8;border-radius:50%;box-shadow:0;cursor:pointer;transition:border-color .3s,box-shadow .6s,transform .3s cubic-bezier(.18,.89,.32,1.28)}.ant-slider-handle-dragging{z-index:1}.ant-slider-handle:focus{border-color:#548af5;outline:none;box-shadow:0 0 0 5px rgba(41,109,243,.12)}.ant-slider-handle.ant-tooltip-open{border-color:#296df3}.ant-slider-handle:after{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;content:""}.ant-slider:hover .ant-slider-rail{background-color:#e1e1e1}.ant-slider:hover .ant-slider-track{background-color:#6193f6}.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open){border-color:#6193f6}.ant-slider-mark{position:absolute;top:14px;left:0;width:100%;font-size:14px}.ant-slider-mark-text{position:absolute;display:inline-block;color:rgba(0,10,36,.65);text-align:center;word-break:keep-all;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-slider-mark-text-active{color:rgba(0,10,36,.85)}.ant-slider-step{position:absolute;width:100%;height:4px;background:transparent;pointer-events:none}.ant-slider-dot{position:absolute;top:-2px;width:8px;height:8px;background-color:#fff;border:2px solid #f0f0f0;border-radius:50%;cursor:pointer}.ant-slider-dot-active{border-color:#94b6f9}.ant-slider-disabled{cursor:not-allowed}.ant-slider-disabled .ant-slider-rail{background-color:#f5f5f5!important}.ant-slider-disabled .ant-slider-track{background-color:rgba(0,0,0,.25)!important}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-handle{background-color:#fff;border-color:rgba(0,0,0,.25)!important;box-shadow:none;cursor:not-allowed}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-mark-text{cursor:not-allowed!important}.ant-slider-rtl{direction:rtl}.ant-slider-rtl .ant-slider-mark{right:0;left:auto}.ant-cascader-checkbox{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-cascader-checkbox-input:focus+.ant-cascader-checkbox-inner,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-inner,.ant-cascader-checkbox:hover .ant-cascader-checkbox-inner{border-color:#296df3}.ant-cascader-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #296df3;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox:after,.ant-cascader-checkbox:hover:after{visibility:visible}.ant-cascader-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-cascader-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-cascader-checkbox-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner{background-color:#296df3;border-color:#296df3}.ant-cascader-checkbox-disabled{cursor:not-allowed}.ant-cascader-checkbox-disabled.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{border-color:rgba(0,0,0,.25);animation-name:none}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-cascader-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-cascader-checkbox-disabled:hover:after,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-disabled:after{visibility:hidden}.ant-cascader-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-cascader-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\a0"}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-disabled{cursor:not-allowed}.ant-cascader-checkbox-wrapper+.ant-cascader-checkbox-wrapper{margin-left:8px}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-cascader-checkbox+span{padding-right:8px;padding-left:8px}.ant-cascader-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-block}.ant-cascader-checkbox-group-item{margin-right:8px}.ant-cascader-checkbox-group-item:last-child{margin-right:0}.ant-cascader-checkbox-group-item+.ant-cascader-checkbox-group-item{margin-left:0}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#296df3;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-cascader-checkbox-indeterminate.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{background-color:rgba(0,0,0,.25);border-color:rgba(0,0,0,.25)}.ant-cascader{width:184px}.ant-cascader-checkbox{top:0;margin-right:8px}.ant-cascader-menus{display:flex;flex-wrap:nowrap;align-items:flex-start}.ant-cascader-menus.ant-cascader-menu-empty .ant-cascader-menu{width:100%;height:auto}.ant-cascader-menu{flex-grow:1;min-width:111px;height:180px;margin:-4px 0;padding:4px 0;overflow:auto;vertical-align:top;list-style:none;border-right:1px solid #f0f0f0;-ms-overflow-style:-ms-autohiding-scrollbar}.ant-cascader-menu-item{display:flex;flex-wrap:nowrap;align-items:center;padding:5px 12px;overflow:hidden;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:all .3s}.ant-cascader-menu-item:hover{background:#f5f5f5}.ant-cascader-menu-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-cascader-menu-item-disabled:hover{background:transparent}.ant-cascader-menu-empty .ant-cascader-menu-item{color:rgba(0,0,0,.25);cursor:default;pointer-events:none}.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover{font-weight:600;background-color:#e3ecfd}.ant-cascader-menu-item-content{flex:auto}.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-loading-icon{margin-left:4px;color:rgba(0,10,36,.65);font-size:10px}.ant-cascader-menu-item-disabled.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-disabled.ant-cascader-menu-item-loading-icon{color:rgba(0,0,0,.25)}.ant-cascader-menu-item-keyword{color:#ef4872}.ant-cascader-compact-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl){margin-right:-1px}.ant-cascader-compact-item:not(.ant-cascader-compact-last-item).ant-cascader-compact-item-rtl{margin-left:-1px}.ant-cascader-compact-item:active,.ant-cascader-compact-item:focus,.ant-cascader-compact-item:hover{z-index:2}.ant-cascader-compact-item[disabled]{z-index:0}.ant-cascader-compact-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-last-item).ant-cascader{border-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-cascader-rtl .ant-cascader-menu-item-expand-icon,.ant-cascader-rtl .ant-cascader-menu-item-loading-icon{margin-right:4px;margin-left:0}.ant-cascader-rtl .ant-cascader-checkbox{top:0;margin-right:0;margin-left:8px}@keyframes ant-tree-node-fx-do-not-use{0%{opacity:0}to{opacity:1}}@keyframes antCheckboxEffect{0%{transform:scale(1);opacity:.5}to{transform:scale(1.6);opacity:0}}.ant-select-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-select-tree-checkbox-input:focus+.ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner{border-color:#296df3}.ant-select-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #296df3;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox:after,.ant-select-tree-checkbox:hover:after{visibility:visible}.ant-select-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-select-tree-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-select-tree-checkbox-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#296df3;border-color:#296df3}.ant-select-tree-checkbox-disabled{cursor:not-allowed}.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{border-color:rgba(0,0,0,.25);animation-name:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-select-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-tree-checkbox-disabled:hover:after,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled:after{visibility:hidden}.ant-select-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-select-tree-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\a0"}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-select-tree-checkbox-wrapper+.ant-select-tree-checkbox-wrapper{margin-left:8px}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-select-tree-checkbox+span{padding-right:8px;padding-left:8px}.ant-select-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";display:inline-block}.ant-select-tree-checkbox-group-item{margin-right:8px}.ant-select-tree-checkbox-group-item:last-child{margin-right:0}.ant-select-tree-checkbox-group-item+.ant-select-tree-checkbox-group-item{margin-left:0}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#296df3;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{background-color:rgba(0,0,0,.25);border-color:rgba(0,0,0,.25)}.ant-tree-select-dropdown{padding:8px 4px}.ant-tree-select-dropdown-rtl{direction:rtl}.ant-tree-select-dropdown .ant-select-tree{border-radius:0}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner{align-items:stretch}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";background:#fff;border-radius:4px;transition:background-color .3s}.ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused){background:#e3ecfd}.ant-select-tree-list-holder-inner{align-items:flex-start}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner{align-items:stretch}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging{position:relative}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging:after{position:absolute;top:0;right:0;bottom:4px;left:0;border:1px solid #296df3;opacity:0;animation:ant-tree-node-fx-do-not-use .3s;animation-play-state:running;animation-fill-mode:forwards;content:"";pointer-events:none}.ant-select-tree .ant-select-tree-treenode{display:flex;align-items:flex-start;padding:0 0 4px;outline:none}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover{background:transparent}.ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper{background:#f5f5f5}.ant-select-tree .ant-select-tree-treenode:not(.ant-select-tree .ant-select-tree-treenode-disabled).filter-node .ant-select-tree-title{color:inherit;font-weight:500}.ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{width:24px;line-height:24px;text-align:center;visibility:visible;opacity:.2;transition:opacity .3s}.ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{opacity:.45}.ant-select-tree .ant-select-tree-treenode-draggable.ant-select-tree-treenode-disabled .ant-select-tree-draggable-icon{visibility:hidden}.ant-select-tree-indent{align-self:stretch;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-indent-unit{display:inline-block;width:24px}.ant-select-tree-draggable-icon{visibility:hidden}.ant-select-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-switcher .ant-select-tree-switcher-icon,.ant-select-tree-switcher .ant-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:baseline}.ant-select-tree-switcher .ant-select-tree-switcher-icon svg,.ant-select-tree-switcher .ant-tree-switcher-icon svg{transition:transform .3s}.ant-select-tree-switcher-noop{cursor:default}.ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-select-tree-switcher-loading-icon{color:#296df3}.ant-select-tree-switcher-leaf-line{position:relative;z-index:1;display:inline-block;width:100%;height:100%}.ant-select-tree-switcher-leaf-line:before{position:absolute;top:0;right:12px;bottom:-4px;margin-left:-1px;border-right:1px solid #d9d9d9;content:" "}.ant-select-tree-switcher-leaf-line:after{position:absolute;width:10px;height:14px;border-bottom:1px solid #d9d9d9;content:" "}.ant-select-tree-checkbox{top:auto;margin:4px 8px 0 0}.ant-select-tree .ant-select-tree-node-content-wrapper{position:relative;z-index:auto;min-height:24px;margin:0;padding:0 4px;color:inherit;line-height:24px;background:transparent;border-radius:4px;cursor:pointer;transition:all .3s,border 0s,line-height 0s,box-shadow 0s}.ant-select-tree .ant-select-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected{background-color:#bed2fb}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle{display:inline-block;width:24px;height:24px;line-height:24px;text-align:center;vertical-align:top}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty{display:none}.ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover{background-color:transparent}.ant-select-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator{position:absolute;z-index:1;height:2px;background-color:#296df3;border-radius:1px;pointer-events:none}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator:after{position:absolute;top:-3px;left:-6px;width:8px;height:8px;background-color:transparent;border:2px solid #296df3;border-radius:50%;content:""}.ant-select-tree .ant-select-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #296df3}.ant-select-tree-show-line .ant-select-tree-indent-unit{position:relative;height:100%}.ant-select-tree-show-line .ant-select-tree-indent-unit:before{position:absolute;top:0;right:12px;bottom:-4px;border-right:1px solid #d9d9d9;content:""}.ant-select-tree-show-line .ant-select-tree-indent-unit-end:before{display:none}.ant-select-tree-show-line .ant-select-tree-switcher{background:#fff}.ant-select-tree-show-line .ant-select-tree-switcher-line-icon{vertical-align:-.15em}.ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line:before{top:auto!important;bottom:auto!important;height:14px!important}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon{transform:scaleY(-1)}.ant-pro-table-dropdown{width:auto}.ant-pro-select-item-option-content-light{color:#296df3}.ant-pro-select-item-option-content{flex:auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-pro-field-dropdown{width:auto}.ant-pro-field-select-light-select .ant-select{position:absolute;width:153px;height:28px;visibility:hidden}.ant-pro-field-select-light-select .ant-select-selector{height:28px}.ant-pro-field-select-light-select.ant-pro-field-select-light-select-searchable .ant-select{width:200px}.ant-pro-field-select-light-select.ant-pro-field-select-light-select-searchable .ant-select-selector{height:28px}.ant-pro-table .ant-pro-table-search{margin-bottom:16px;padding:24px 24px 0;background:#fff}.ant-pro-table .ant-pro-table-search-ghost{background:transparent}.ant-pro-table .ant-pro-table-search:before{display:table;content:""}.ant-pro-table .ant-pro-table-search:after{display:table;clear:both;content:""}.ant-pro-table .ant-pro-table-search.ant-pro-table-form{margin:0;padding:0 16px;overflow:unset}.ant-pro-table .ant-pro-table-search-light{margin-bottom:0;padding:16px 0}.ant-pro-table .ant-pro-table-search-form-option .ant-form-item{margin:0}.ant-pro-table .ant-pro-table-search-form-option .ant-form-item-label{opacity:0}.ant-pro-table .ant-pro-table-search-form-option .ant-form-item-control-input{justify-content:flex-start}@media (max-width:575px){.ant-pro-table .ant-pro-table-search{height:auto!important;padding-bottom:24px}.ant-pro-table .ant-pro-table-search .ant-form-item-label{min-width:80px;text-align:left}}.ant-divider{box-sizing:border-box;margin:0;padding:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";border-top:1px solid rgba(0,0,0,.06)}.ant-divider-vertical{position:relative;top:-.06em;display:inline-block;height:.9em;margin:0 8px;vertical-align:middle;border-top:0;border-left:1px solid rgba(0,0,0,.06)}.ant-divider-horizontal{display:flex;clear:both;width:100%;min-width:100%;margin:24px 0}.ant-divider-horizontal.ant-divider-with-text{display:flex;align-items:center;margin:16px 0;color:rgba(0,10,36,.85);font-weight:500;font-size:16px;white-space:nowrap;text-align:center;border-top:0;border-top-color:rgba(0,0,0,.06)}.ant-divider-horizontal.ant-divider-with-text:after,.ant-divider-horizontal.ant-divider-with-text:before{position:relative;width:50%;border-top:1px solid transparent;border-top-color:inherit;border-bottom:0;transform:translateY(50%);content:""}.ant-divider-horizontal.ant-divider-with-text-left:before{width:5%}.ant-divider-horizontal.ant-divider-with-text-left:after{width:95%}.ant-divider-horizontal.ant-divider-with-text-right:before{width:95%}.ant-divider-horizontal.ant-divider-with-text-right:after{width:5%}.ant-divider-inner-text{display:inline-block;padding:0 1em}.ant-divider-dashed{background:none;border:dashed rgba(0,0,0,.06);border-width:1px 0 0}.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before{border-style:dashed none none}.ant-divider-vertical.ant-divider-dashed{border-width:0 0 0 1px}.ant-divider-plain.ant-divider-with-text{color:rgba(0,10,36,.85);font-weight:400;font-size:14px}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:before{width:0}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:after{width:100%}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left .ant-divider-inner-text{padding-left:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:before{width:100%}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:after{width:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right .ant-divider-inner-text{padding-right:0}.ant-divider-rtl{direction:rtl}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:before{width:95%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:after{width:5%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:before{width:5%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:after{width:95%}.ant-pro-form-light-filter{line-height:30px}.ant-pro-form-light-filter:before{display:block;height:0;visibility:hidden;content:"."}.ant-pro-form-light-filter-small{line-height:1.5715}.ant-pro-form-light-filter-container{display:flex;flex-wrap:wrap;margin-top:-8px;margin-right:-4px}.ant-pro-form-light-filter-item{margin-top:8px;white-space:nowrap}.ant-pro-form-light-filter-item:not(:last-child){margin-right:8px}.ant-pro-form-light-filter-formlabel{margin-bottom:2px}.ant-pro-form-light-filter-line{min-width:198px}.ant-pro-form-light-filter-line .ant-form-item{flex-direction:column;margin-bottom:0}.ant-pro-form-light-filter-line:not(:first-child){margin-top:16px;margin-bottom:8px}.ant-pro-form-light-filter .ant-form-item{margin-bottom:0}.ant-pro-form-light-filter-collapse-icon{width:32px;height:32px;line-height:35px;border-radius:50%}.ant-pro-form-light-filter-effective .ant-pro-form-light-filter-collapse-icon{background-color:rgba(0,0,0,.04)}.ant-pro-steps-form-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;min-width:520px;max-width:100%;margin:auto}.ant-pro-steps-form-steps-container{max-width:1160px;margin:auto}.ant-pro-steps-form-steps-container .ant-steps-vertical{height:100%}.ant-pro-steps-form-step{display:none;margin-top:32px}.ant-pro-steps-form-step-active{display:block}.ant-pro-steps-form-step>form{max-width:100%}.pro-table-tooltip-text span{color:#fff}.ant-pro-table{z-index:1}.ant-pro-table:not(:root):-webkit-full-screen{min-height:100vh;overflow:auto;background:#fff}.ant-pro-table:not(:root):-ms-fullscreen{min-height:100vh;overflow:auto;background:#fff}.ant-pro-table:not(:root):fullscreen{min-height:100vh;overflow:auto;background:#fff}.ant-pro-table-extra{margin-bottom:16px}.ant-pro-table-polling .ant-pro-table-list-toolbar-setting-item .anticon.anticon-reload{transform:rotate(0deg);animation:turn 1s linear infinite}.ant-pro-table td.ant-table-cell>a{font-size:14px}.ant-pro-table .ant-table .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:0}.ant-pro-table .ant-table.ant-table-middle .ant-pro-table{margin:-12px -8px}@keyframes turn{0%{transform:rotate(0deg)}25%{transform:rotate(90deg)}50%{transform:rotate(180deg)}75%{transform:rotate(270deg)}to{transform:rotate(1turn)}}.ant-pro-table-toolbar{display:flex;align-items:center;justify-content:space-between;height:64px;padding:0 24px}.ant-pro-table-toolbar-option{display:flex;align-items:center;justify-content:flex-end}.ant-pro-table-toolbar-title{flex:1 1;color:rgba(0,10,36,.85);font-weight:500;font-size:16px;line-height:24px;opacity:.85}@media (max-width:480px){.ant-pro-table .ant-table{width:100%;overflow-x:auto}.ant-pro-table .ant-table-tbody>tr>td,.ant-pro-table .ant-table-tbody>tr>th,.ant-pro-table .ant-table-thead>tr>td,.ant-pro-table .ant-table-thead>tr>th{white-space:pre}.ant-pro-table .ant-table-tbody>tr>td>span,.ant-pro-table .ant-table-tbody>tr>th>span,.ant-pro-table .ant-table-thead>tr>td>span,.ant-pro-table .ant-table-thead>tr>th>span{display:block}}@media (max-width:575px){.ant-pro-table-toolbar{flex-direction:column;align-items:flex-start;justify-content:flex-start;height:auto;margin-bottom:16px;margin-left:16px;padding:16px 8px 8px;line-height:normal}.ant-pro-table-toolbar-title{margin-bottom:16px}.ant-pro-table-toolbar-option{display:flex;justify-content:space-between;width:100%}.ant-pro-table-toolbar-default-option{display:flex;flex:1 1;align-items:center;justify-content:flex-end}}.ant-pro-table-column-setting{width:auto}.ant-pro-table-column-setting-title{display:flex;align-items:center;justify-content:space-between;height:32px}.ant-pro-table-column-setting-overlay .ant-popover-inner-content{width:200px;padding:0 0 8px}.ant-pro-table-column-setting-overlay .ant-tree-node-content-wrapper:hover{background-color:transparent}.ant-pro-table-column-setting-overlay .ant-tree-draggable-icon{cursor:-webkit-grab;cursor:grab}.ant-pro-table-column-setting-overlay .ant-tree-treenode{align-items:center}.ant-pro-table-column-setting-overlay .ant-tree-treenode:hover{background-color:#e3ecfd}.ant-pro-table-column-setting-overlay .ant-tree-treenode:hover .ant-pro-table-column-setting-list-item-option{display:block}.ant-pro-table-column-setting-overlay .ant-tree-treenode .ant-tree-checkbox{top:0;margin:0 4px 0 0}.ant-pro-table-column-setting-list{display:flex;flex-direction:column;width:100%;padding-top:8px}.ant-pro-table-column-setting-list.ant-pro-table-column-setting-list-group{padding-top:0}.ant-pro-table-column-setting-list-title{margin-top:6px;margin-bottom:6px;padding-left:24px;color:rgba(0,10,36,.65);font-size:12px}.ant-pro-table-column-setting-list-item{display:flex;align-items:center}.ant-pro-table-column-setting-list-item-title{flex:1 1}.ant-pro-table-column-setting-list-item-option{display:none;float:right;cursor:pointer}.ant-pro-table-column-setting-list-item-option>span>span.anticon{color:#296df3}.ant-pro-table-column-setting-list-item-option>span+span{margin-left:8px}.ant-pro-table-list-toolbar{line-height:1}.ant-pro-table-list-toolbar-container{display:flex;justify-content:space-between;padding:16px 0}.ant-pro-table-list-toolbar-container-mobile{flex-direction:column}.ant-pro-table-list-toolbar-title{display:flex;align-items:center;justify-content:flex-start;color:rgba(0,10,36,.85);font-weight:500;font-size:16px}.ant-pro-table-list-toolbar-search:not(:last-child){display:flex;align-items:center;justify-content:flex-start}.ant-pro-table-list-toolbar-setting-item{margin:0 4px;color:rgba(0,0,0,.75);font-size:16px;cursor:pointer}.ant-pro-table-list-toolbar-setting-item>span{display:block;width:100%;height:100%}.ant-pro-table-list-toolbar-setting-item:hover{color:#5493ff}.ant-pro-table-list-toolbar-left{display:flex;align-items:center;justify-content:flex-start}.ant-pro-table-list-toolbar-right{display:flex;justify-content:flex-end}.ant-pro-table-list-toolbar-extra-line{margin-bottom:16px}.ant-pro-table-list-toolbar-filter{display:flex;align-items:center}.ant-pro-table-list-toolbar-filter:not(:last-child){margin-right:16px}.ant-pro-table-list-toolbar-filter div.ant-pro-table-search{margin:0;padding:0}.ant-pro-table-list-toolbar-inline-menu-item{display:inline-block;margin-right:24px;cursor:pointer;opacity:.75}.ant-pro-table-list-toolbar-inline-menu-item-active{font-weight:700;opacity:1}.ant-pro-table-list-toolbar-dropdownmenu-label{font-weight:700;font-size:16px;text-align:center;cursor:pointer}.ant-pro-table-list-toolbar .ant-tabs-top>.ant-tabs-nav{margin-bottom:0}.ant-pro-table-list-toolbar .ant-tabs-top>.ant-tabs-nav:before{border-bottom:0}.ant-pro-table-list-toolbar .ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-list{margin-top:0}.ant-pro-table-list-toolbar .ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-list .ant-tabs-tab{padding-top:0}@media (max-width:575px){.ant-pro-table-list-toolbar-container{display:flex;flex-wrap:wrap}.ant-pro-table-list-toolbar-left{margin-bottom:16px}}.ant-alert{box-sizing:border-box;margin:0;color:rgba(0,10,36,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";position:relative;display:flex;align-items:center;padding:8px 15px;word-wrap:break-word;border-radius:4px}.ant-alert-content{flex:1 1;min-width:0}.ant-alert-icon{margin-right:8px}.ant-alert-description{display:none;font-size:14px;line-height:22px}.ant-alert-success{background-color:#f0fff7;border:1px solid #a1f0cd}.ant-alert-success .ant-alert-icon{color:#26c992}.ant-alert-info{background-color:#f0f7ff;border:1px solid #a6ccff}.ant-alert-info .ant-alert-icon{color:#296df3}.ant-alert-warning{background-color:#fffdf0;border:1px solid #ffea9e}.ant-alert-warning .ant-alert-icon{color:#ffb924}.ant-alert-error{background-color:#fff0f1;border:1px solid #ffc7cf}.ant-alert-error .ant-alert-icon{color:#ef4872}.ant-alert-error .ant-alert-description>pre{margin:0;padding:0}.ant-alert-action{margin-left:8px}.ant-alert-close-icon{margin-left:8px;padding:0;overflow:hidden;font-size:12px;line-height:12px;background-color:transparent;border:none;outline:none;cursor:pointer}.ant-alert-close-icon .anticon-close{color:rgba(0,10,36,.65);transition:color .3s}.ant-alert-close-icon .anticon-close:hover{color:rgba(0,0,0,.75)}.ant-alert-close-text{color:rgba(0,10,36,.65);transition:color .3s}.ant-alert-close-text:hover{color:rgba(0,0,0,.75)}.ant-alert-with-description{align-items:flex-start;padding:15px 15px 15px 24px}.ant-alert-with-description.ant-alert-no-icon{padding:15px}.ant-alert-with-description .ant-alert-icon{margin-right:15px;font-size:24px}.ant-alert-with-description .ant-alert-message{display:block;margin-bottom:4px;color:rgba(0,10,36,.85);font-size:16px}.ant-alert-message{color:rgba(0,10,36,.85)}.ant-alert-with-description .ant-alert-description{display:block}.ant-alert.ant-alert-motion-leave{overflow:hidden;opacity:1;transition:max-height .3s cubic-bezier(.78,.14,.15,.86),opacity .3s cubic-bezier(.78,.14,.15,.86),padding-top .3s cubic-bezier(.78,.14,.15,.86),padding-bottom .3s cubic-bezier(.78,.14,.15,.86),margin-bottom .3s cubic-bezier(.78,.14,.15,.86)}.ant-alert.ant-alert-motion-leave-active{max-height:0;margin-bottom:0!important;padding-top:0;padding-bottom:0;opacity:0}.ant-alert-banner{margin-bottom:0;border:0;border-radius:0}.ant-alert.ant-alert-rtl{direction:rtl}.ant-alert-rtl .ant-alert-icon{margin-right:auto;margin-left:8px}.ant-alert-rtl .ant-alert-action{margin-right:8px;margin-left:auto}.ant-alert-rtl .ant-alert-close-icon{margin-right:8px;margin-left:auto}.ant-alert-rtl.ant-alert-with-description{padding-right:24px;padding-left:15px}.ant-alert-rtl.ant-alert-with-description .ant-alert-icon{margin-right:auto;margin-left:15px}.ant-pro-table-alert{margin-bottom:16px}.ant-pro-table-alert .ant-alert.ant-alert-no-icon{padding:12px 24px}.ant-pro-table-alert-info{display:flex;align-items:center;transition:all .3s}.ant-pro-table-alert-info-content{flex:1 1}.ant-pro-table-alert-info-option{min-width:48px;padding-left:16px}.userAvatar___9hXSy{width:24px;height:24px;border-radius:50%}.userText___rJvtU{margin-left:10px}.xflow-algo-node{z-index:10;display:flex;width:180px;height:36px;line-height:36px;text-align:center;background-color:#fff;border:1px solid #c2c8d5;border-radius:2px;box-shadow:-1px -1px 4px 0 hsla(0,0%,87.5%,.5),-2px 2px 4px 0 hsla(0,0%,95.7%,.5),2px 3px 8px 2px hsla(0,0%,59.2%,.05);transition:all .15s ease-in-out}.xflow-algo-node:hover{background-color:#fff;border:1px solid #3057e3;box-shadow:0 0 3px 3px rgba(48,86,227,.15);cursor:move}.xflow-algo-node .icon{display:flex;align-items:center;justify-content:center;width:36px}.xflow-algo-node .label{width:108px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-word}.xflow-algo-node .status{width:36px}.xflow-algo-node.panel-node{border:0}.x6-node-selected .xflow-algo-node{background-color:rgba(48,86,227,.05);border:1px solid #3057e3;box-shadow:0 0 3px 3px rgba(48,86,227,.15)}.x6-node-selected .xflow-algo-node:hover{background-color:#fff;box-shadow:0 0 5px 5px rgba(48,86,227,.15)}.dag-solution-layout .xflow-canvas-root .xflow-algo-node{height:72px!important;line-height:72px!important}.dataSourceTooltipWrapper{max-width:500px}.dataSourceTooltipWrapper .ant-tooltip-inner{padding:0}.dataSourceTooltipWrapper .dataSourceTooltip{width:300px;background:#fff;border-radius:5px;color:#4d4d4d;padding:15px;opacity:.9;font-size:11px;box-shadow:0 0 5px #d8d8d8}.dataSourceTooltipWrapper .dataSourceTooltip p{margin-bottom:0;font-size:13px;padding:4px;line-height:18px;overflow:hidden;display:flex;flex-direction:row}.dataSourceTooltipWrapper .dataSourceTooltip p .dataSourceTooltipLabel{display:block;width:64px;color:grey}.dataSourceTooltipWrapper .dataSourceTooltip p .dataSourceTooltipValue{flex:1 1;display:block;width:220px;padding:0 4px;word-break:break-all}.xflow-group-node:hover{border:1px solid #c1cdf7}.xflow-group-node .xflow-group-header{font-size:14px}.x6-node-selected .xflow-group-node{border:1px solid #c1cdf7;box-shadow:0 0 3px 3px rgb(64 169 12.75%)}.ant-modal{box-sizing:border-box;color:rgba(0,0,0,.85);font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum","tnum";pointer-events:none;position:relative;top:100px;width:auto;max-width:calc(100vw - 32px);margin:0 auto;padding:0 0 24px}.ant-modal.ant-zoom-appear,.ant-modal.ant-zoom-enter{transform:none;opacity:0;animation-duration:.3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;height:100%;background-color:rgba(0,0,0,.45)}.ant-modal-mask-hidden{display:none}.ant-modal-wrap{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;outline:0}.ant-modal-wrap{z-index:1000}.ant-modal-title{margin:0;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;line-height:22px;word-wrap:break-word}.ant-modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:0;border-radius:2px;box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05);pointer-events:auto}.ant-modal-close{position:absolute;top:0;right:0;z-index:10;padding:0;color:rgba(0,0,0,.45);font-weight:700;line-height:1;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;transition:color .3s}.ant-modal-close-x{display:block;width:54px;height:54px;font-size:16px;font-style:normal;line-height:54px;text-align:center;text-transform:none;text-rendering:auto}.ant-modal-close:focus,.ant-modal-close:hover{color:rgba(0,0,0,.75);text-decoration:none}.ant-modal-header{padding:16px 24px;color:rgba(0,0,0,.85);background:#fff;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0}.ant-modal-body{padding:24px;font-size:14px;line-height:1.5715;word-wrap:break-word}.ant-modal-footer{padding:10px 16px;text-align:right;background:transparent;border-top:1px solid #f0f0f0;border-radius:0 0 2px 2px}.ant-modal-footer .ant-btn+.ant-btn:not(.ant-dropdown-trigger){margin-bottom:0;margin-left:8px}.ant-modal-open{overflow:hidden}.ant-modal-centered{text-align:center}.ant-modal-centered:before{display:inline-block;width:0;height:100%;vertical-align:middle;content:""}.ant-modal-centered .ant-modal{top:0;display:inline-block;padding-bottom:0;text-align:left;vertical-align:middle}@media (max-width:767px){.ant-modal{max-width:calc(100vw - 16px);margin:8px auto}.ant-modal-centered .ant-modal{flex:1 1}}.ant-modal-confirm .ant-modal-header{display:none}.ant-modal-confirm .ant-modal-body{padding:32px 32px 24px}.ant-modal-confirm-body-wrapper:before{display:table;content:""}.ant-modal-confirm-body-wrapper:after{display:table;clear:both;content:""}.ant-modal-confirm-body .ant-modal-confirm-title{display:block;overflow:hidden;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;line-height:1.4}.ant-modal-confirm-body .ant-modal-confirm-content{margin-top:8px;color:rgba(0,0,0,.85);font-size:14px}.ant-modal-confirm-body>.anticon{float:left;margin-right:16px;font-size:22px}.ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-left:38px}.ant-modal-confirm .ant-modal-confirm-btns{margin-top:24px;text-align:right}.ant-modal-confirm .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-bottom:0;margin-left:8px}.ant-modal-confirm-error .ant-modal-confirm-body>.anticon{color:#ff4d4f}.ant-modal-confirm-confirm .ant-modal-confirm-body>.anticon,.ant-modal-confirm-warning .ant-modal-confirm-body>.anticon{color:#faad14}.ant-modal-confirm-info .ant-modal-confirm-body>.anticon{color:#1890ff}.ant-modal-confirm-success .ant-modal-confirm-body>.anticon{color:#52c41a}.ant-modal-confirm .ant-zoom-leave .ant-modal-confirm-btns{pointer-events:none}.ant-modal-wrap-rtl{direction:rtl}.ant-modal-wrap-rtl .ant-modal-close{right:auto;left:0}.ant-modal-wrap-rtl .ant-modal-footer{text-align:left}.ant-modal-wrap-rtl .ant-modal-footer .ant-btn+.ant-btn{margin-right:8px;margin-left:0}.ant-modal-wrap-rtl .ant-modal-confirm-body{direction:rtl}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon{float:right;margin-right:0;margin-left:16px}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-right:38px;margin-left:0}.ant-modal-wrap-rtl .ant-modal-confirm-btns{text-align:left}.ant-modal-wrap-rtl .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-right:8px;margin-left:0}.ant-modal-wrap-rtl.ant-modal-centered .ant-modal{text-align:right}.dag-solution .__dumi-default-previewer-actions{border:0}.dag-solution-layout{position:relative;height:610px;border:1px solid #d9d9d9}.dag-solution-layout .xflow-x6-canvas{background:#fafafa}.dag-solution-layout .x6-edge:hover path:nth-child(2){stroke:#3056e3;stroke-width:2px}.dag-solution-layout .x6-edge.x6-edge-selected path:nth-child(2){stroke:#3056e3;stroke-width:2px}.dag-solution-layout .xflow-canvas-dnd-node-tree{border-right:1px solid #d9d9d9}.dag-solution-layout .xflow-workspace-toolbar-top{background-image:linear-gradient(180deg,#fff,#fafafa);border-bottom:1px solid #d9d9d9}.dag-solution-layout .xflow-workspace-toolbar-bottom{text-align:center;background:#fff;border-top:1px solid #d9d9d9}.dag-solution-layout .xflow-modal-container{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000}.dag-solution-layout .xflow-collapse-panel .xflow-collapse-panel-header{display:flex;align-items:center;justify-content:space-evenly;background:#f7f8fa}.dag-solution-layout .xflow-collapse-panel .xflow-collapse-panel-header .ant-input-affix-wrapper{padding:2px 11px}.dag-solution-layout .xflow-collapse-panel .xflow-collapse-panel-body{background:#f7f8fa}.dag-solution-layout .xflow-collapse-panel .xflow-collapse-panel-body .xflow-collapse-header{padding:12px 8px}.dag-solution-layout .xflow-collapse-panel .xflow-node-dnd-panel-footer{display:none}.dag-solution-layout .xflow-json-form .tabs .ant-tabs-nav{box-shadow:unset}.xflow-default-node{z-index:10;display:flex;width:180px;height:36px;line-height:36px;text-align:center;background-color:#fff;border:1px solid #1890ff;border-radius:2px;box-shadow:-1px -1px 4px 0 hsla(0,0%,87.5%,.5),-2px 2px 4px 0 hsla(0,0%,95.7%,.5),2px 3px 8px 2px hsla(0,0%,59.2%,.05);transition:all .15s ease-in-out}.xflow-default-node:hover{background-color:#fff;border:1px solid #3057e3;box-shadow:0 0 3px 3px rgba(48,86,227,.15);cursor:move}.xflow-default-node .icon{width:36px}.xflow-default-node .label{width:108px;overflow:hidden;text-overflow:ellipsis}.xflow-default-node .status{width:36px}.xflow-default-node.panel-node{border:0}.x6-node-selected .xflow-default-node{background-color:rgba(48,86,227,.05);border:1px solid #3057e3;box-shadow:0 0 3px 3px rgba(48,86,227,.15)}.x6-node-selected .xflow-default-node:hover{background-color:#fff;box-shadow:0 0 5px 5px rgba(48,86,227,.15)}.xflow-default-group-node{z-index:9;width:100%;height:100%;background-color:hsla(0,0%,100%,.65);border:1px solid hsla(0,0%,100%,.25);border-radius:4px;box-shadow:0 1px 3px 0 rgb(17 49 96/12%),0 0 0 1px rgb(17 49 96/4%);cursor:-webkit-grab;cursor:grab}.xflow-default-group-node:hover{background-color:rgba(227,244,255,.45);border:1px solid #1890ff;box-shadow:0 0 3px 3px rgba(64,169,255,.2);cursor:move}.xflow-default-group-node .xflow-group-header{display:flex;justify-content:space-between;padding:0 12px;font-size:14px;line-height:38px}.xflow-default-group-node .xflow-group-header .header-left{width:80%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.xflow-default-group-node .xflow-group-header .header-right{display:inline-flex;align-items:center}.xflow-default-group-node .xflow-group-header .header-right span.anticon{margin-left:8px}.x6-node-selected .xflow-default-group-node{background-color:rgba(243,249,255,.92);border:1px solid #1890ff;box-shadow:0 0 3px 3px rgba(64,169,255,.2)}.x6-node-selected .xflow-default-group-node:hover{background-color:rgba(243,249,255,.6)}.xflow-canvas-root{position:absolute;top:0;right:0;bottom:0;left:0}.xflow-x6-canvas{width:100%;height:100%}.xflow-app-workspace{position:relative;width:100%;height:100%}.xflow-hide{display:none}.x6-widget-dnd.dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important}.xflow-collapse-panel{border-right:1px solid #d9d9d9}.xflow-collapse-panel .disabled{position:relative;opacity:.45}.xflow-collapse-panel .disabled:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:999;cursor:not-allowed;content:""}.xflow-collapse-panel-node-wrapper{display:flex;align-items:center;justify-content:center;width:100%;cursor:-webkit-grab;cursor:grab}.xflow-collapse-panel-header{display:flex;justify-content:space-evenly;background:#fff;border-bottom:1px solid #d9d9d9}.xflow-collapse-panel-header-title{font-size:16px}.xflow-collapse-panel-header-search{width:100%;padding:0 12px}.xflow-collapse-panel-body{padding:0;overflow-x:hidden;overflow-y:auto;background:#fff}.xflow-collapse-panel-footer{display:flex;justify-content:space-evenly;background:#fff;border-top:1px solid #d9d9d9}.xflow-collapse-panel-footer-title{font-size:16px}.xflow-collapse-panel .xflow-collapse-search-list{height:100%;margin:0;padding:8px 0;overflow-y:auto;list-style:none}.xflow-collapse-panel .xflow-collapse-search-list-item{margin:0;padding:4px 0}.xflow-collapse-panel .xflow-collapse-list{height:100%;margin:0;padding:0;overflow-y:auto;list-style:none}.xflow-collapse-panel .xflow-collapse-list-item{margin:0;padding:0}.xflow-collapse-panel .xflow-collapse-list-item.close .xflow-collapse-content{height:0;transform:scaleY(0)}.xflow-collapse-panel .xflow-collapse-header{display:flex;justify-content:space-between;padding:8px 16px;color:rgba(0,0,0,.65);line-height:1.5;cursor:pointer;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.xflow-collapse-panel .xflow-collapse-header:hover{background:#f5f5f5}.xflow-collapse-panel .xflow-collapse-header-icon{display:flex;align-items:center;justify-content:center;width:24px}.xflow-collapse-panel .xflow-collapse-header-icon svg{transition:all .5s}.xflow-collapse-panel .xflow-collapse-header-label{flex:1 1}.xflow-collapse-panel .xflow-collapse-header-extra{width:auto}.xflow-collapse-panel .xflow-collapse-content{height:100%;height:auto;overflow:hidden;transform:scaleY(1);transition:scale .15s ease-in-out}.xflow-collapse-panel .xflow-collapse-content-item{padding:4px 0;transition:all .5s}.xflow-collapse-panel .xflow-collapse-content-item:hover{background:#f5f5f5}.x6-menu{position:relative;display:inline-block;min-width:160px;min-height:32px;margin:0;padding:4px 0;background-color:#fff;outline:0;box-shadow:0 2px 10px rgba(0,0,0,.12)}.x6-menu-item{position:relative}.x6-menu-item-active>.x6-menu-item-button,.x6-menu-item:hover>.x6-menu-item-button{color:#262626;background:#f5f5f5}.x6-menu-item-divider{display:block;width:100%;height:1px;margin:4px 0;background:hsla(0,0%,58.8%,.2);pointer-events:none}.x6-menu-item-button{position:relative;display:flex;align-content:center;align-items:center;justify-content:space-between;width:100%;height:28px;padding:0 12px;color:#595959;text-align:left;background:transparent;border:none;outline:none;box-shadow:none;cursor:pointer}.x6-menu-item-hidden{display:none}.x6-menu-item-disabled:hover>.x6-menu-item-button,.x6-menu-item-disabled>.x6-menu-item-button{color:#595959;background-color:transparent;cursor:not-allowed;opacity:.4}.x6-menu-item-icon{position:absolute;top:50%;left:6px;display:none;width:24px;height:24px;margin-top:-12px;font-size:13px}.x6-menu-item-text{padding-right:56px;overflow:hidden;font-size:13px;white-space:nowrap;text-overflow:ellipsis}.x6-menu-item-hotkey{font-size:13px;opacity:.75}.x6-menu-submenu-arrow,.x6-menu-submenu.x6-menu-item-disabled:hover>.x6-menu-item-button>.x6-menu-submenu-arrow{position:absolute;top:10px;right:12px;width:0;height:0;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:5px solid #262626;opacity:.4;pointer-events:none}.x6-menu-submenu-menu,.x6-menu-submenu.x6-menu-item-disabled:hover>.x6-menu-submenu-menu{position:absolute;top:-5px;left:100%;z-index:9999;min-width:200px;margin-left:-4px;padding:5px 0;background:#fff;box-shadow:0 2px 10px rgba(0,0,0,.12);transform:translateX(-10px);visibility:hidden;opacity:0;transition:all .25s cubic-bezier(.3,1.2,.2,1)}.x6-menu-submenu.x6-menu-item-active>.x6-menu-item-button>.x6-menu-submenu-arrow,.x6-menu-submenu:hover>.x6-menu-item-button>.x6-menu-submenu-arrow{opacity:.75}.x6-menu-submenu.x6-menu-item-active>.x6-menu-submenu-menu,.x6-menu-submenu:hover>.x6-menu-submenu-menu{transform:translateX(0);visibility:visible;opacity:1}.x6-menu.x6-menu-has-icon .x6-menu-item-button{padding-left:30px}.x6-menu.x6-menu-has-icon .x6-menu-item-button .x6-menu-item-icon{display:flex;align-items:center;justify-content:center}.x6-menu.x6-menu-has-icon .x6-menu-item-button .x6-menu-item-text{padding-left:2px}.xflow-menu-mask{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1000}.xflow-menu-mask .x6-dropdown{overflow:visible;pointer-events:all}.xflow-menu-mask .xflow-context-menu-anchor{position:absolute;z-index:1;background-color:#fff}@keyframes xflow-processing-line{to{stroke-dashoffset:-1000}}.dag-extension-container .x6-edge{stroke-width:1px}.dag-extension-container .x6-edge.success path:nth-child(2){stroke:#d5d5d5!important}.dag-extension-container .x6-edge.success path:nth-child(3){fill:#d5d5d5!important;stroke:#d5d5d5!important}.dag-extension-container .x6-edge.error{stroke-width:2px}.dag-extension-container .x6-edge.error path:nth-child(2){stroke:rgba(245,34,45,.45)!important;stroke-width:2px}.dag-extension-container .x6-edge.processing path:nth-child(2){animation:xflow-processing-line 30s linear infinite;stroke:rgba(57,202,116,.8);stroke-width:2px;stroke-dasharray:8px,2px}.dag-extension-container .x6-edge.x6-edge-selected path:nth-child(2){stroke:#1890ff;stroke-width:2px}.dag-extension-container .x6-edge:hover path:nth-child(2){stroke:#1890ff;stroke-width:2px}.dag-extension-container .x6-edge.hoverHighlight path:nth-child(2){stroke:#1890ff;stroke-width:2px}.dag-extension-container .x6-port .xflow-port-group .xflow-port-arrow{display:none}.dag-extension-container .x6-port .xflow-port-group.available .xflow-port{stroke:rgba(57,202,116,.6);r:8;stroke-width:8px}.dag-extension-container .x6-port .xflow-port-group.connected .xflow-port-arrow{display:block}.dag-extension-container .x6-port .xflow-port-group.connected .xflow-port{display:none}.dag-extension-container .x6-port .xflow-port-group.adsorbed .xflow-port{stroke:rgba(57,202,116,.85);r:10;stroke-width:10px}.layout-top-bottom .x6-port .xflow-port-group .xflow-port-arrow{display:none}.layout-top-bottom .x6-port .xflow-port-group.connected .xflow-port-arrow{display:block}.layout-top-bottom .x6-port .xflow-port-group.connected .xflow-port{display:none}.layout-left-right .x6-port .xflow-port-group .xflow-port-arrow{display:none}.layout-left-right .x6-port .xflow-port-group.connected .xflow-port-arrow{display:block;transform:translateY(5px) rotate(270deg)!important}.layout-left-right .x6-port .xflow-port-group.connected .xflow-port{display:none}.flow-extension-container .x6-edge{stroke-width:1px}.flow-extension-container .x6-edge.success path:nth-child(2){stroke:#888!important}.flow-extension-container .x6-edge.success path:nth-child(3){fill:#888!important;stroke:#888!important}.flow-extension-container .x6-edge.error{stroke-width:2px}.flow-extension-container .x6-edge.error path:nth-child(2){stroke:rgba(245,34,45,.45)!important;stroke-width:2px}.flow-extension-container .x6-edge.guideProcessing path:nth-child(2){stroke:rgba(57,202,116,.8);stroke-width:2px;stroke-dasharray:8px,2px}.flow-extension-container .x6-edge.guideProcessing path:nth-child(2):local{animation:processing-line 30s linear infinite}.flow-extension-container .x6-edge.x6-edge-selected path:nth-child(2){stroke:#1890ff;stroke-width:2px}.flow-extension-container .x6-edge:hover path:nth-child(2){stroke:#1890ff;stroke-width:2px}.flow-extension-container .x6-edge.hoverHighlight path:nth-child(2){stroke:#1890ff;stroke-width:2px}.flow-extension-container .x6-widget-transform{margin:-1px 0 0 -1px;padding:0;border:1px solid #239edd}.flow-extension-container .x6-widget-transform>div{border:1px solid #239edd}.flow-extension-container .x6-widget-transform>div:hover{background-color:#3dafe4}.flow-extension-container .x6-widget-transform-active-handle{background-color:#3dafe4}.flow-extension-container .x6-widget-transform-resize{border-radius:0}.flow-extension-container .x6-widget-selection-inner{border:1px solid #239edd}.flow-extension-container .x6-widget-selection-box{opacity:0}.xflow-form-checkbox{margin-bottom:2px!important}.xflow-form-checkbox :global .ant-checkbox-wrapper{width:100%;overflow:hidden}.xflow-form-input :global .ant-input-clear-icon{color:rgba(0,0,0,.25)}.xflow-json-form{height:100%}.xflow-json-form label{font-size:12px}.xflow-json-form .ant-form-item{margin-bottom:12px}.xflow-json-form .ant-form-item .ant-form-item-label{padding-bottom:4px}.xflow-json-form .ant-form-item .ant-form-item-label>label{color:#666}.xflow-json-form .ant-form-item .ant-form-item-control .ant-checkbox-wrapper{color:#666}.xflow-json-form .ant-form-item-explain,.xflow-json-form .ant-form-item-extra{font-size:12px}.xflow-json-form .ant-form-item-explain-error>div{word-break:break-all}.xflow-json-form .ant-form-item-extra{margin-top:4px}.xflow-json-form .tabs{flex-direction:column;height:100%}.xflow-json-form .tabs .ant-tabs-nav{box-shadow:0 0 16px -5px rgba(0,0,0,.2)}.xflow-json-form .tabs .ant-tabs-nav .ant-tabs-nav-list{width:100%}.xflow-json-form .tabs .ant-tabs-nav .ant-tabs-nav-list .ant-tabs-tab{font-size:12px}.xflow-json-form .tabs .ant-tabs-nav .ant-tabs-nav-list .ant-tabs-tab-active{border-bottom-width:0}.xflow-json-form .tabs .ant-tabs-nav .ant-tabs-nav-list .ant-tabs-tab .ant-tabs-tab-btn{font-weight:400;text-align:center}.xflow-json-form .tabs .ant-tabs-content-holder{padding:0 16px;overflow-y:auto}.xflow-json-form .tabs.xTab .ant-tabs-nav .ant-tabs-nav-list{box-sizing:border-box;height:40px;background-color:#fff;border-bottom:1px solid #d9d9d9}.xflow-json-form .tabs.xTab .ant-tabs-nav .ant-tabs-nav-list .ant-tabs-tab{background-color:#fff}.xflow-json-form .tabs.xTab .ant-tabs-nav .ant-tabs-nav-list .ant-tabs-tab .ant-tabs-tab-btn{width:100%}.xflow-json-form .tabs.singleTab .ant-tabs-tab{width:100%}.xflow-json-form .tabs.coupleTab .ant-tabs-tab{width:50%;margin-right:0;border-right-width:0}.xflow-json-form .tabs.coupleTab .ant-tabs-tab:last-of-type{border-right-width:1px}.xflow-json-form .tabs.ternateTab .ant-tabs-tab{width:33%;margin-right:0;border-right-width:0}.xflow-json-form .tabs.ternateTab .ant-tabs-tab:last-of-type{border-right-width:1px}.xflow-json-schema-form{border-left:1px solid #d9d9d9}.xflow-json-schema-form-body{position:relative;width:100%;height:100%}.xflow-json-schema-form-header{display:flex;justify-content:space-evenly;background:#fff;border-bottom:1px solid #d9d9d9}.xflow-json-schema-form-header-title{font-size:16px}.xflow-json-schema-form-footer{display:flex;justify-content:space-evenly;background:#fff;border-top:1px solid #d9d9d9}.xflow-json-schema-form-footer-title{font-size:16px}.text-truncate{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.xflow-minimap{z-index:999;background:#fff;box-shadow:0 0 10px 0 rgba(0,0,0,.15)}.xflow-minimap .x6-widget-minimap .x6-graph{background:hsla(0,0%,100%,.9)}.xflow-minimap .x6-widget-minimap{background:rgba(34,34,34,.05)}.xflow-node-dnd-panel{border-right:1px solid #d9d9d9}.xflow-node-dnd-panel-header{display:flex;justify-content:space-evenly;background:#fff;border-bottom:1px solid #d9d9d9}.xflow-node-dnd-panel-header-title{font-size:16px}.xflow-node-dnd-panel-header-search{width:100%;padding:0 12px}.xflow-node-dnd-panel-body{padding:8px 0;overflow-x:hidden;overflow-y:auto;background:#fff}.xflow-node-dnd-panel-body .ant-tree-iconEle.ant-tree-icon__customize{display:none!important;width:auto;margin-right:0;color:rgba(0,0,0,.45)}.xflow-node-dnd-panel-body .ant-tree{background:unset}.xflow-node-dnd-panel-body .ant-tree-switcher{display:flex;align-items:center;justify-content:center}.xflow-node-dnd-panel-body .ant-tree-node-content-wrapper{display:flex;align-items:center;padding-left:0;overflow:hidden}.xflow-node-dnd-panel-body-list{margin:0;padding:0}.xflow-node-dnd-panel-body-list-item{margin:0;padding:4px 12px;overflow:hidden;list-style-type:none}.xflow-node-dnd-panel-body-list-item .xflow-node-dnd-panel-node-wrapper{justify-content:center}.xflow-node-dnd-panel-tree-leaf{position:relative}.xflow-node-dnd-panel-tree-leaf .ant-tree-iconEle{display:none}.xflow-node-dnd-panel-tree-leaf .ant-tree-title{padding:2px}.xflow-node-dnd-panel-node-wrapper{display:flex;align-items:center;width:100%}.xflow-node-dnd-panel-footer{display:flex;justify-content:space-evenly;background:#fff;border-top:1px solid #d9d9d9}.xflow-node-dnd-panel-footer-title{font-size:16px}.xflow-dnd-node{width:100%;height:40px}.x6-dropdown{position:absolute;top:-9999px;left:-9999px;z-index:9999;display:block;max-height:320px;overflow-y:scroll;border-radius:3px;box-shadow:0 1px 6px rgba(0,0,0,.2)}.x6-dropdown-hidden{display:none}.x6-dropdown-overlay{display:inline-block}.x6-dropdown.slide-down-appear.slide-down-appear-active.x6-dropdown-placement-bottomCenter,.x6-dropdown.slide-down-appear.slide-down-appear-active.x6-dropdown-placement-bottomLeft,.x6-dropdown.slide-down-appear.slide-down-appear-active.x6-dropdown-placement-bottomRight,.x6-dropdown.slide-down-enter.slide-down-enter-active.x6-dropdown-placement-bottomCenter,.x6-dropdown.slide-down-enter.slide-down-enter-active.x6-dropdown-placement-bottomLeft,.x6-dropdown.slide-down-enter.slide-down-enter-active.x6-dropdown-placement-bottomRight{animation-name:x6SlideUpIn}.x6-dropdown.slide-up-appear.slide-up-appear-active.x6-dropdown-placement-topCenter,.x6-dropdown.slide-up-appear.slide-up-appear-active.x6-dropdown-placement-topLeft,.x6-dropdown.slide-up-appear.slide-up-appear-active.x6-dropdown-placement-topRight,.x6-dropdown.slide-up-enter.slide-up-enter-active.x6-dropdown-placement-topCenter,.x6-dropdown.slide-up-enter.slide-up-enter-active.x6-dropdown-placement-topLeft,.x6-dropdown.slide-up-enter.slide-up-enter-active.x6-dropdown-placement-topRight{animation-name:x6SlideDownIn}.x6-dropdown.slide-down-leave.slide-down-leave-active.x6-dropdown-placement-bottomCenter,.x6-dropdown.slide-down-leave.slide-down-leave-active.x6-dropdown-placement-bottomLeft,.x6-dropdown.slide-down-leave.slide-down-leave-active.x6-dropdown-placement-bottomRight{animation-name:x6SlideUpOut}.x6-dropdown.slide-up-leave.slide-up-leave-active.x6-dropdown-placement-topCenter,.x6-dropdown.slide-up-leave.slide-up-leave-active.x6-dropdown-placement-topLeft,.x6-dropdown.slide-up-leave.slide-up-leave-active.x6-dropdown-placement-topRight{animation-name:x6SlideDownOut}@keyframes x6SlideUpIn{0%{transform:scaleY(.8);transform-origin:0 0;opacity:0}to{transform:scaleY(1);transform-origin:0 0;opacity:1}}@keyframes x6SlideUpOut{0%{transform:scaleY(1);transform-origin:0 0;opacity:1}to{transform:scaleY(.8);transform-origin:0 0;opacity:0}}@keyframes x6SlideDownIn{0%{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}to{transform:scaleY(1);transform-origin:100% 100%;opacity:1}}@keyframes x6SlideDownOut{0%{transform:scaleY(1);transform-origin:100% 100%;opacity:1}to{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}}.x6-toolbar{display:flex;flex-direction:row;height:28px;margin:0;padding:0 0 0 4px;overflow:hidden}.x6-toolbar-content{display:flex;flex:1 1;flex-direction:row;justify-content:space-between;overflow:hidden}.x6-toolbar-content-extras,.x6-toolbar-content-inner,.x6-toolbar-group,.x6-toolbar-item,.x6-toolbar-item-icon,.x6-toolbar-item-text{display:flex;flex-direction:row}.x6-toolbar-content-extras{align-content:center;align-items:center;font-size:14px}.x6-toolbar-group:before{align-self:center;width:1px;height:40%;margin:0 6px;background-color:rgba(0,0,0,.15);content:" ";pointer-events:none}.x6-toolbar-group:first-child:before{content:none}.x6-toolbar-item{align-content:center;align-items:center;margin:0;padding:0 4px;color:#595959;background-color:transparent;border:0;border-radius:2px;outline:none;box-shadow:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.x6-toolbar-item.x6-toolbar-item-hidden{display:none}.x6-toolbar-item.x6-toolbar-item-disabled,.x6-toolbar-item.x6-toolbar-item-disabled:hover{cursor:not-allowed;opacity:.4}.x6-toolbar-item.x6-toolbar-item-disabled .x6-toolbar-item-icon .x6-toolbar-item:active{transform:none}.x6-toolbar-item-icon,.x6-toolbar-item-text{align-content:center;align-items:center}.x6-toolbar-item-icon{font-size:14px;transition:transform 50ms ease}.x6-toolbar-item-icon:active{transform:scale(1.27201965)}.x6-toolbar-item-text{padding-left:4px;font-size:12px}.x6-toolbar-item-dropdown-wrap{margin-top:-13px}.x6-toolbar-item-dropdown-arrow{width:0;height:0;margin-left:6px;border-color:#262626 transparent transparent;border-style:solid;border-width:5px 4px 0;opacity:.4}.x6-toolbar.x6-toolbar-hover-effect{height:32px}.x6-toolbar.x6-toolbar-hover-effect .x6-toolbar-item{margin:4px 2px 4px 0;padding:0 6px;color:#595959}.x6-toolbar.x6-toolbar-hover-effect .x6-toolbar-item-disabled.x6-toolbar-item:hover{color:#595959;background-color:transparent}.x6-toolbar.x6-toolbar-hover-effect .x6-toolbar-item-disabled.x6-toolbar-item:hover .x6-toolbar-item-dropdown-arrow{opacity:.4}.x6-toolbar-item.x6-toolbar-item-active,.x6-toolbar.x6-toolbar-hover-effect .x6-toolbar-item.x6-toolbar-item-active,.x6-toolbar.x6-toolbar-hover-effect .x6-toolbar-item:hover{color:#262626;background-color:#e0e0e0}.x6-toolbar-item.x6-toolbar-item-active .x6-toolbar-item-dropdown-arrow,.x6-toolbar.x6-toolbar-hover-effect .x6-toolbar-item.x6-toolbar-item-active .x6-toolbar-item-dropdown-arrow,.x6-toolbar.x6-toolbar-hover-effect .x6-toolbar-item:hover .x6-toolbar-item-dropdown-arrow{opacity:.75}.x6-toolbar-item.x6-toolbar-item-active{margin:4px 0}.x6-toolbar.x6-toolbar-big{height:32px}.x6-toolbar.x6-toolbar-big .x6-toolbar-content-extras{font-size:16px}.x6-toolbar.x6-toolbar-big .x6-toolbar-item{margin:4px 4px 4px 0;padding:0 5px;border-radius:3px}.x6-toolbar.x6-toolbar-big .x6-toolbar-item-text{font-size:14px}.x6-toolbar.x6-toolbar-big .x6-toolbar-item-icon{font-size:16px}.x6-toolbar.x6-toolbar-hover-effect.x6-toolbar-big{height:40px}.x6-toolbar.x6-toolbar-hover-effect.x6-toolbar-big .x6-toolbar-item{padding:0 10px}.x6-toolbar.x6-toolbar-small{height:22px}.x6-toolbar.x6-toolbar-small .x6-toolbar-content-extras{font-size:12px}.x6-toolbar.x6-toolbar-small .x6-toolbar-item{padding:0 3px}.x6-toolbar.x6-toolbar-small .x6-toolbar-item-text{margin-right:2px;padding-left:2px;font-size:10px}.x6-toolbar.x6-toolbar-small .x6-toolbar-item-icon{font-size:12px}.x6-toolbar.x6-toolbar-small .x6-toolbar-item.x6-toolbar-item-active{margin:2px 0}.x6-toolbar.x6-toolbar-hover-effect.x6-toolbar-small{height:28px}.x6-toolbar.x6-toolbar-hover-effect.x6-toolbar-small .x6-toolbar-item{margin:4px 2px 4px 0;padding:0 5px}.x6-toolbar.x6-toolbar-hover-effect.x6-toolbar-small .x6-toolbar-item.x6-toolbar-item-active{margin:4px 2px 4px 0}.x6-toolbar.x6-toolbar-align-right .x6-toolbar-content{flex-direction:row-reverse}.xflow-toolbar{position:absolute;z-index:99;display:flex;height:40px;background:#fff}.xflow-toolbar-root{display:flex;justify-content:space-between;width:100%}.xflow-toolbar-root.horizontal-center{justify-content:center}.xflow-toolbar-root.vertical{flex-direction:column}.xflow-toolbar-root .x6-toolbar.x6-toolbar-hover-effect{align-items:center;height:100%}.xflow-toolbar-root .x6-toolbar-content{height:100%}.xflow-toolbar.vertical{right:unset;left:unset;width:32px;height:auto;border:1px solid rgba(0,0,0,.04);border-radius:4px;box-shadow:0 0 20px rgb(0 0 0/1%)}.xflow-toolbar.vertical .x6-toolbar.x6-toolbar-hover-effect{height:auto;padding:8px 0}.xflow-toolbar.vertical .x6-toolbar-content-inner,.xflow-toolbar.vertical .x6-toolbar-group{flex-direction:column}.xflow-toolbar.vertical .x6-toolbar-item{margin:0;padding:6px 8px;color:#595959}.xflow-toolbar.horizontal{right:0;left:0}.xflow-toolbar.horizontal .x6-toolbar.x6-toolbar-hover-effect{height:40px;line-height:40px}.flowchart-extension-container .x6-edge{stroke-width:1px}.flowchart-extension-container .x6-edge.success path:nth-child(2){stroke:#888!important}.flowchart-extension-container .x6-edge.success path:nth-child(3){fill:#888!important;stroke:#888!important}.flowchart-extension-container .x6-edge.error{stroke-width:2px}.flowchart-extension-container .x6-edge.error path:nth-child(2){stroke:rgba(245,34,45,.45)!important;stroke-width:2px}.flowchart-extension-container .x6-edge.guideProcessing path:nth-child(2){stroke:rgba(57,202,116,.8);stroke-width:2px;stroke-dasharray:8px,2px}.flowchart-extension-container .x6-edge.guideProcessing path:nth-child(2):local{animation:processing-line 30s linear infinite}.flowchart-extension-container .x6-edge.x6-edge-selected path:nth-child(2){stroke:#1890ff;stroke-width:2px}.flowchart-extension-container .x6-edge:hover path:nth-child(2){stroke:#1890ff;stroke-width:2px}.flowchart-extension-container .x6-edge.hoverHighlight path:nth-child(2){stroke:#1890ff;stroke-width:2px}@keyframes processing-line{to{stroke-dashoffset:-1000}}.flowchart-extension-container .x6-widget-transform{margin:-1px 0 0 -1px;padding:0;border:1px solid #239edd}.flowchart-extension-container .x6-widget-transform>div{border:1px solid #239edd}.flowchart-extension-container .x6-widget-transform>div:hover{background-color:#3dafe4}.flowchart-extension-container .x6-widget-transform-active-handle{background-color:#3dafe4}.flowchart-extension-container .x6-widget-transform-resize{border-radius:0}.flowchart-extension-container .x6-widget-selection-inner{border:1px solid #239edd}.flowchart-extension-container .x6-widget-selection-box{opacity:0}.flowchart-extension-container.xflow-app-workspace{overflow:hidden;border:1px solid #d9d9d9}.flowchart-extension-container.xflow-app-workspace .xflow-workspace-panel{z-index:1;background:#fff}.flowchart-extension-container.xflow-app-workspace svg{overflow:visible!important}.flowchart-extension-container.xflow-app-workspace .x6-edge{stroke-width:1px}.flowchart-extension-container.xflow-app-workspace .x6-edge.x6-edge-selected path:nth-child(2){stroke:#1890ff}.flowchart-extension-container.xflow-app-workspace .x6-edge:hover path:nth-child(2){stroke:#1890ff}.flowchart-extension-container.xflow-app-workspace .x6-edge.hoverHighlight path:nth-child(2){stroke:#1890ff}.flowchart-extension-container.xflow-app-workspace .x6-port>circle{stroke:#69c0ff}.flowchart-extension-container.xflow-app-workspace .x6-widget-transform{box-sizing:border-box!important;margin:0;padding:0;border:2px solid #3572f9;box-shadow:0 4px 4px 0 #dbe6ff}.flowchart-extension-container.xflow-app-workspace .x6-widget-transform>div{width:8px;height:8px;background-color:#fff;border:1px solid #3572f9}.flowchart-extension-container.xflow-app-workspace .xflow-json-form .ant-tabs-content-holder{padding:0!important}.flowchart-container-collpase{transition:left .5s}.flowchart-container-collpase-wrapper{position:relative;width:100%;height:100%}.flowchart-container-collpase-nodes{border-right:1px solid #d9d9d9}.flowchart-container-collpase-icon{position:absolute;z-index:99;width:20px;color:#aaa;font-size:12px;text-align:center;background:#fff;border:1px solid #ccc;transform:translateY(-50%);cursor:pointer}.flowchart-container-collpase-icon:hover{color:#2b84c0}.flowchart-container-collpase .xflow-workspace-panel{transition:left .5s}.flowchart-editor-panel-body{padding:12px}.flowchart-editor-panel-body .flowchart-editor-color-container{width:24px;height:24px;padding:4px;border:1px solid #eee;border-radius:2px}.flowchart-editor-panel-body .flowchart-editor-panel-group{display:flex;flex-direction:column;grid-gap:8px;margin-bottom:12px;padding-bottom:12px;font-size:12px}.flowchart-editor-panel-body .flowchart-editor-panel-group:first-child{border-bottom:1px solid #ccc}.flowchart-editor-panel-body .flowchart-editor-panel-group:last-child{margin-bottom:0}.flowchart-editor-panel-body .flowchart-editor-panel-group input,.flowchart-editor-panel-body .flowchart-editor-panel-group select{height:24px}.flowchart-editor-panel-body .flowchart-editor-panel-group h5{margin:0;color:rgba(0,0,0,.85)}.flowchart-editor-panel-body .flowchart-editor-panel-group .group{display:flex;flex-direction:row;align-items:center}.flowchart-editor-panel-body .flowchart-editor-panel-group .group>label{margin-right:8px;color:rgba(0,0,0,.45);word-break:keep-all}.flowchart-editor-panel-body .flowchart-editor-panel-group .split{display:flex;grid-gap:8px}.flowchart-editor-panel-body .flowchart-editor-panel-group .addon-before-group{position:relative;display:flex;flex-direction:row;width:100%;height:100%;overflow:hidden;vertical-align:center;border:1px solid #d9d9d9;border-radius:2px}.flowchart-editor-panel-body .flowchart-editor-panel-group .addon-before-group>span{position:absolute;top:0;right:0;display:block;width:20px;color:rgba(0,0,0,.8509803921568627);line-height:24px;text-align:center;background-color:#fafafa;cursor:pointer}.flowchart-editor-panel-body .flowchart-editor-panel-group .addon-before-group:hover>span{display:none}.flowchart-editor-panel-body .flowchart-editor-edge-stroke-style,.flowchart-editor-panel-body .flowchart-editor-edge-text-style,.flowchart-editor-panel-body .flowchart-editor-node-text-style{display:flex;flex-direction:row;grid-gap:8px}.flowchart-editor-panel-body .ant-input-number{width:100%}.flowchart-editor-canvas-panel{display:flex;justify-content:center;padding-top:60px;color:#aaa}.flowchart-editor-pick-color-container{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999;background:rgba(0,0,0,.25)}.flowchart-editor-pick-color-container .flowchart-editor-popover{position:absolute;top:50%;left:50%;padding:12px;background:#fff;transform:translate(-50%,-50%)}.flowchart-editor-pick-color-container .sketch-picker{box-sizing:border-box!important;padding:0!important;border-radius:none!important;box-shadow:none!important}.flowchart-editor-pick-color-container .foolter{display:flex;flex-direction:row;justify-content:space-between;margin-top:12px}.flowchart-extension-container .xflow-editor-panel-collpase{color:rgba(0,0,0,.85);font-size:12px;transition:right .5s}.flowchart-extension-container .xflow-editor-panel-collpase-wrapper{position:relative;width:100%;height:100%}.flowchart-extension-container .xflow-editor-panel-collpase-icon{position:absolute;z-index:99;width:20px;color:#aaa;text-align:center;background:#fff;border:1px solid #ccc;transform:translateY(-50%);cursor:pointer}.flowchart-extension-container .xflow-editor-panel-collpase-icon:hover{color:#2b84c0}.flowchart-extension-container .xflow-editor-panel-collpase .xflow-workspace-panel{transition:left .5s}.xflow-group-node{z-index:9;width:100%;height:100%;background-color:hsla(0,0%,100%,.65);border:1px solid hsla(0,0%,100%,.25);border-radius:4px;box-shadow:0 1px 3px 0 rgb(17 49 96/12%),0 0 0 1px rgb(17 49 96/4%);cursor:-webkit-grab;cursor:grab}.xflow-group-node:hover{background-color:rgba(227,244,255,.45);border:1px solid #1890ff;box-shadow:0 0 3px 3px rgba(64,169,255,.2);cursor:move}.xflow-group-node .xflow-group-header{display:flex;justify-content:space-between;padding:0 12px;line-height:38px}.xflow-group-node .xflow-group-header .header-left{width:80%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.xflow-group-node .xflow-group-header .header-right{display:inline-flex;align-items:center}.xflow-group-node .xflow-group-header .header-right span.anticon{margin-left:8px}.x6-node-selected .xflow-group-node{background-color:rgba(243,249,255,.92);border:1px solid #1890ff;box-shadow:0 0 3px 3px rgba(64,169,255,.2)}.x6-node-selected .xflow-group-node:hover{background-color:rgba(243,249,255,.6)}.flowchart-extension-container .xflow-node-panel{color:rgba(0,0,0,.85);font-size:12px}.flowchart-extension-container .xflow-node-panel-header{display:flex;justify-content:space-evenly;background:#fff;border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9}.flowchart-extension-container .xflow-node-panel-header-title{font-size:16px}.flowchart-extension-container .xflow-node-panel-header-search{width:100%;padding:0 12px}.flowchart-extension-container .xflow-node-panel-custom{display:flex;flex-wrap:wrap;grid-gap:5px;background:#fff;cursor:-webkit-grab;cursor:grab}.flowchart-extension-container .xflow-node-panel-official{grid-gap:5px;background:#fff;cursor:-webkit-grab;cursor:grab;display:grid;grid-template-columns:repeat(auto-fit,minmax(24px,1fr))}.flowchart-extension-container .xflow-node-panel-node-wrapper{display:flex;justify-content:center;cursor:pointer}.flowchart-extension-container .xflow-node-panel .ant-collapse-content-box{padding:12px}.flowchart-extension-container .xflow-node-panel .ant-collapse-content{border-top:none}.flowchart-extension-container .xflow-node-panel .ant-collapse-header{color:rgba(0,0,0,.85);font-size:12px}.flowchart-extension-container .xflow-node-panel-collpase{color:rgba(0,0,0,.85);font-size:12px;transition:left .5s}.flowchart-extension-container .xflow-node-panel-collpase-wrapper{position:relative;width:100%;height:100%}.flowchart-extension-container .xflow-node-panel-collpase-nodes{border-right:1px solid #d9d9d9}.flowchart-extension-container .xflow-node-panel-collpase-icon{position:absolute;z-index:99;width:20px;color:#aaa;text-align:center;background:#fff;border:1px solid #ccc;transform:translateY(-50%);cursor:pointer}.flowchart-extension-container .xflow-node-panel-collpase-icon:hover{color:#2b84c0}.loginWarp___33ulX{display:flex;flex-direction:column;height:100vh;overflow:auto}.loginWarp___33ulX .content___kTcj0{flex:1 1;padding:32px 0 24px}.loginWarp___33ulX .content___kTcj0 .formContent___3iWSs{display:flex;flex:1 1;flex-direction:column;height:100%;padding:132px 0 24px;overflow:auto;background:inherit}.loginWarp___33ulX .content___kTcj0 .formContent___3iWSs .formBox___1lEWr{min-width:480px;max-width:500px;margin:0 auto}.loginMain___2JIcS{margin:120px auto auto;padding:20px;background:#fff;border-radius:5px;box-shadow:0 0 10px 2px #eee}.title___14Nxn{margin-bottom:20px;font-size:24px;text-align:center}.input___27HLt{margin-bottom:20px}.signInBtn___XM5qM{width:100%;margin:20px 0;height:40px}.tool___KFjf1{display:flex;flex-direction:row-reverse}.button___gm0Ja{margin-left:10px}:root:root{--primary-color:#f87653;--blue:#296df3;--deep-blue:#446dff;--chat-blue:#1b4aef;--body-background:#f7fafa;--deep-background:#f0f0f0;--light-background:#f5f5f5;--component-background:#fff;--header-color:#edf2f2;--text-color:#181a1a;--text-color-secondary:#3d4242;--text-color-third:#626a6a;--text-color-fourth:#889191;--text-color-fifth:#afb6b6;--text-color-six:#a3a4a6;--text-color-fifth-4:hsla(180,5%,70%,0.4);--tooltip-max-width:350px;--success-color:#52c41a;--processing-color:#ff2442;--error-color:#ff4d4f;--highlight-color:#ff4d4f}#root,body,html{height:100%}.colorWeak{-webkit-filter:invert(80%);filter:invert(80%)}.ant-layout{min-height:100vh}canvas{display:block}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}ol,ul{list-style:none}@media (max-width:480px){.ant-table{width:100%;overflow-x:auto}.ant-table-tbody>tr>td,.ant-table-tbody>tr>th,.ant-table-thead>tr>td,.ant-table-thead>tr>th{white-space:pre}.ant-table-tbody>tr>td>span,.ant-table-tbody>tr>th>span,.ant-table-thead>tr>td>span,.ant-table-thead>tr>th>span{display:block}}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){body .ant-design-pro>.ant-layout{min-height:100vh}}.ant-card-body{padding:24px!important}.ant-pro-page-container-children-content{margin:12px 12px 0!important}.ant-page-header{padding-bottom:10px!important}.ant-spin-spinning{display:flex!important;align-items:center!important;justify-content:center!important}.ant-table-selection-extra .ant-dropdown-trigger{display:none!important}.initialLoading .ant-spin-spinning{max-height:none!important}.initialLoading .loadingPlaceholder{height:100vh}.ellipsis{overflow:hidden;text-overflow:ellipsis}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{font-weight:700;font-size:14px}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>a,.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>span>a,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu>a,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu>span>a{color:#fff}.ant-pro-top-nav-header-logo h1{font-size:18px}.ant-layout-header{background:linear-gradient(90deg,#153d8f,#0a276d);background-color:rgba(0,0,0,.2);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.customizeHeader{background-color:rgba(0,0,0,.2);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.ant-pro-top-nav-header-main-left{min-width:100px!important}.ant-pro-top-nav-header-logo{min-width:100px!important}.link{color:#296df3;cursor:pointer}.closeTab{position:relative;width:10px;height:10px}.closeTab:after,.closeTab:before{position:absolute;top:-2px;left:0;width:1px;height:10px;background-color:#323232;content:" "}.closeTab:before{transform:rotate(45deg)}.closeTab:after{transform:rotate(-45deg)}.dot{float:right;width:8px;height:8px;background:#bfbfbf;border-radius:100%}.bdWrapper{margin:-24px}.bdWrapper .ant-layout-sider{top:48px!important}.logo{position:relative;padding-bottom:5px;color:#fff;font-size:20px;font-weight:700;padding-right:50px}.ant-notification-topRight{right:240px!important}.g6ContextMenuContainer{font-size:12px;color:#545454}.g6ContextMenuContainer li{cursor:pointer;list-style-type:none;list-style:none;margin-left:0}.g6ContextMenuContainer ul{width:100%;padding:0}.g6ContextMenuContainer li:hover{color:#aaa} \ No newline at end of file diff --git a/webapp/packages/supersonic-fe/supersonic-webapp/version.js b/webapp/packages/supersonic-fe/supersonic-webapp/version.js new file mode 100644 index 000000000..609562fa0 --- /dev/null +++ b/webapp/packages/supersonic-fe/supersonic-webapp/version.js @@ -0,0 +1,4 @@ +feVersion={ + "commitId": "cf043d8f0099a86e2194ce93623bb384603ef45d", + "updateTime": "Sun Jul 16 2023 20:07:04 GMT+0800 (China Standard Time)" +} \ No newline at end of file