Commit a29186b1 authored by 周亚武's avatar 周亚武

主界面调试及语音

parent 769dee92
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
</properties> </properties>
</profile> </profile>
<profile> <profile>
<id>reg</id> <id>dy</id>
<properties> <properties>
<profiles.active>dy</profiles.active> <profiles.active>dy</profiles.active>
<profiles.filepath>/tmp</profiles.filepath> <profiles.filepath>/tmp</profiles.filepath>
...@@ -135,6 +135,12 @@ ...@@ -135,6 +135,12 @@
<version>5.13.0</version> <version>5.13.0</version>
</dependency> </dependency>
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>
<!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 --> <!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
......
...@@ -42,7 +42,7 @@ public class EncryptUtil { ...@@ -42,7 +42,7 @@ public class EncryptUtil {
* @param text * @param text
* @return * @return
*/ */
private static String base64ToString(String text) { public static String base64ToString(String text) {
Base64 base64 = new Base64(); Base64 base64 = new Base64();
try { try {
return new String(base64.decode(text.getBytes("utf-8")), "UTF-8").trim().replace("\n", ""); return new String(base64.decode(text.getBytes("utf-8")), "UTF-8").trim().replace("\n", "");
......
...@@ -2,6 +2,7 @@ package com.mortals.xhx.daemon.applicationservice; ...@@ -2,6 +2,7 @@ package com.mortals.xhx.daemon.applicationservice;
import com.mortals.framework.springcloud.service.IApplicationStartedService; import com.mortals.framework.springcloud.service.IApplicationStartedService;
import com.mortals.xhx.swing.MyTray; import com.mortals.xhx.swing.MyTray;
import com.mortals.xhx.tts.UI.MainWindow;
import com.mortals.xhx.tts.UI.SettingWindow; import com.mortals.xhx.tts.UI.SettingWindow;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -18,6 +19,9 @@ public class DemoStartedService implements IApplicationStartedService { ...@@ -18,6 +19,9 @@ public class DemoStartedService implements IApplicationStartedService {
@Value("${siteconfig.url:http://192.168.0.98:11091}") @Value("${siteconfig.url:http://192.168.0.98:11091}")
String host; String host;
@Value("${version:4.0.0}")
String version;
@Override @Override
public void start() { public void start() {
log.info("开始服务.."); log.info("开始服务..");
...@@ -36,6 +40,8 @@ public class DemoStartedService implements IApplicationStartedService { ...@@ -36,6 +40,8 @@ public class DemoStartedService implements IApplicationStartedService {
log.info("configPath:{}",configPath); log.info("configPath:{}",configPath);
log.info("host:{}",host); log.info("host:{}",host);
log.info("version:{}",version);
MainWindow.getInstance().initWindow(configPath,host,version);
SettingWindow.getInstance().initWindow(configPath,host); SettingWindow.getInstance().initWindow(configPath,host);
log.info("初始化托盘完成!"); log.info("初始化托盘完成!");
......
This diff is collapsed.
...@@ -56,6 +56,8 @@ public class SettingWindow { ...@@ -56,6 +56,8 @@ public class SettingWindow {
static String siteCode = ""; static String siteCode = "";
static String siteName = ""; static String siteName = "";
boolean isShow = false; //判断本地是否有配置文件 有则设置窗口不可见
public static void main(String[] args) { public static void main(String[] args) {
//初始化窗口 //初始化窗口
...@@ -546,7 +548,7 @@ public class SettingWindow { ...@@ -546,7 +548,7 @@ public class SettingWindow {
//设置窗口的位置和大小 //设置窗口的位置和大小
frame.setBounds(660,340,600,400); frame.setBounds(660,340,600,400);
//设置窗口对象不可见 //设置窗口对象不可见
frame.setVisible(true); frame.setVisible(isShow);
frame.addWindowListener(new WindowListener() { frame.addWindowListener(new WindowListener() {
@Override @Override
...@@ -575,6 +577,7 @@ public class SettingWindow { ...@@ -575,6 +577,7 @@ public class SettingWindow {
@Override @Override
public void windowActivated(WindowEvent e) { public void windowActivated(WindowEvent e) {
//界面重现时重新读取配置 //界面重现时重新读取配置
readConfig();
} }
@Override @Override
...@@ -606,6 +609,7 @@ public class SettingWindow { ...@@ -606,6 +609,7 @@ public class SettingWindow {
if(jo != null){ if(jo != null){
isShow = false;
if(jo.getDeviceId() != null){ if(jo.getDeviceId() != null){
deviceId = jo.getDeviceId(); deviceId = jo.getDeviceId();
} }
...@@ -638,6 +642,7 @@ public class SettingWindow { ...@@ -638,6 +642,7 @@ public class SettingWindow {
if(jo.getSpeaker() != null){ if(jo.getSpeaker() != null){
speaker = jo.getSpeaker(); speaker = jo.getSpeaker();
} }
isOld = jo.isOld();
siteId = jo.getSiteId(); siteId = jo.getSiteId();
if(jo.getSiteName() != null){ if(jo.getSiteName() != null){
siteName = jo.getSiteName(); siteName = jo.getSiteName();
...@@ -646,6 +651,7 @@ public class SettingWindow { ...@@ -646,6 +651,7 @@ public class SettingWindow {
siteCode = jo.getSiteCode(); siteCode = jo.getSiteCode();
} }
}else { }else {
isShow = true;
log.info( "配置文件为空" ); ; log.info( "配置文件为空" ); ;
} }
...@@ -686,6 +692,7 @@ public class SettingWindow { ...@@ -686,6 +692,7 @@ public class SettingWindow {
cb.setZang(zang); cb.setZang(zang);
cb.setSpeaker(speaker); cb.setSpeaker(speaker);
cb.setCheckVersion(checkVersion); cb.setCheckVersion(checkVersion);
cb.setOld(isOld);
cb.setSiteId(siteId); cb.setSiteId(siteId);
cb.setSiteCode(siteCode); cb.setSiteCode(siteCode);
cb.setSiteName(siteName); cb.setSiteName(siteName);
......
...@@ -20,8 +20,9 @@ public class ConfigBean { ...@@ -20,8 +20,9 @@ public class ConfigBean {
private boolean english; //英双语 private boolean english; //英双语
private boolean zang; //藏双语 private boolean zang; //藏双语
private String speaker; //播音员 private String speaker; //播音员
private boolean isOld; //是否为利旧设备
private int siteId; // 目前被选中的站点id private int siteId; // 目前被选中的站点id
private String siteCode = ""; private String siteCode; //站点编码
private String siteName = ""; private String siteName; //站点名称
} }
package com.mortals.xhx.tts.bean;
/**
* Created by ZYW on 2022-08-16.
*/
public class DataBean {
private String protocol;
private String messageType;
private String sign;
private String deviceCode;
private String timestamp;
public DataBean(String protocol, String messageType, String sign, String deviceCode, String timestamp) {
this.protocol = protocol;
this.messageType = messageType;
this.sign = sign;
this.deviceCode = deviceCode;
this.timestamp = timestamp;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getDeviceCode() {
return deviceCode;
}
public void setDeviceCode(String deviceCode) {
this.deviceCode = deviceCode;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
}
package com.mortals.xhx.tts.bean;
/**
* Created by ZYW on 2022-05-17.
*/
public class DeviceCodeBean {
private String deviceCode;
private String deviceVersion;
public DeviceCodeBean(String deviceCode, String deviceVersion) {
this.deviceCode = deviceCode;
this.deviceVersion = deviceVersion;
}
public String getDeviceCode() {
return deviceCode;
}
public void setDeviceCode(String deviceCode) {
this.deviceCode = deviceCode;
}
public String getDeviceVersion() {
return deviceVersion;
}
public void setDeviceVersion(String deviceVersion) {
this.deviceVersion = deviceVersion;
}
}
package com.mortals.xhx.tts.bean;
/**
* Created by ZYW on 2023-01-04.
*/
public class FlowNumBean {
private int qid;
private String flownum;
private String windowname;
private String windowfromnum;
private int waitcount;
private int forwaitcount;
private long time; //生成的时间
public FlowNumBean(int qid, String flownum, String windowname, String windowfromnum, long time) {
this.qid = qid;
this.flownum = flownum;
this.windowname = windowname;
this.windowfromnum = windowfromnum;
this.time = time;
}
public int getQid() {
return qid;
}
public void setQid(int qid) {
this.qid = qid;
}
public String getWindowfromnum() {
return windowfromnum;
}
public void setWindowfromnum(String windowfromnum) {
this.windowfromnum = windowfromnum;
}
public int getWaitcount() {
return waitcount;
}
public void setWaitcount(int waitcount) {
this.waitcount = waitcount;
}
public int getForwaitcount() {
return forwaitcount;
}
public void setForwaitcount(int forwaitcount) {
this.forwaitcount = forwaitcount;
}
public String getFlownum() {
return flownum;
}
public void setFlownum(String flownum) {
this.flownum = flownum;
}
public String getWindowname() {
return windowname;
}
public void setWindowname(String windowname) {
this.windowname = windowname;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
}
package com.mortals.xhx.tts.bean;
/**
* Created by ZYW on 2022-08-16.
*/
public class HeadersBean {
private DataBean data;
public HeadersBean(DataBean data) {
this.data = data;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
}
package com.mortals.xhx.tts.bean;
/**
* Created by ZYW on 2022-08-16.
*/
public class RabbitMessageBean {
private String data;
private HeadersBean headers;
private String key;
public RabbitMessageBean(String data, HeadersBean headers, String key) {
this.data = data;
this.headers = headers;
this.key = key;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public HeadersBean getHeaders() {
return headers;
}
public void setHeaders(HeadersBean headers) {
this.headers = headers;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
package com.mortals.xhx.tts.utils;
/**
* @author ZYW
* @date 2024-07-25 11:26
*/
public class Constant {
//加解密相关秘钥
public static int ORDERNUM = 9;
public static String DESKEY ="FZV1D&tr";
public static String AESKEY = "w4*KbUamPdZDnDpG";
}
package com.mortals.xhx.tts.utils;
/**
* Created by ZYW on 2022-05-17.
*/
public class ContentBean {
String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.mortals.xhx.tts.utils;
/**
* Created by ZYW on 2022-07-12.
*/
public class DeviceInfoBean {
private Integer productId;
private String productName;
private String productCode;
private String siteCode;
private Integer siteId;
private String siteName;
private Integer source;
private Integer enabled; //设备启用状态 (0.停止,1.启用)
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getSiteCode() {
return siteCode;
}
public void setSiteCode(String siteCode) {
this.siteCode = siteCode;
}
public Integer getSiteId() {
return siteId;
}
public void setSiteId(Integer siteId) {
this.siteId = siteId;
}
public String getSiteName() {
return siteName;
}
public void setSiteName(String siteName) {
this.siteName = siteName;
}
public int getSource() {
return source;
}
public void setSource(Integer source) {
this.source = source;
}
public Integer getEnabled() {
return enabled;
}
public void setEnabled(Integer enabled) {
this.enabled = enabled;
}
public String getProductCode() {
return productCode;
}
public void setProductCode(String productCode) {
this.productCode = productCode;
}
}
...@@ -4,6 +4,11 @@ import java.io.BufferedReader; ...@@ -4,6 +4,11 @@ import java.io.BufferedReader;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.UUID; import java.util.UUID;
/** /**
...@@ -51,6 +56,53 @@ public class MacAddressReader { ...@@ -51,6 +56,53 @@ public class MacAddressReader {
} }
/**
* 本机ip
* @return
*/
public static String getInternetIp(){
try {
InetAddress inetAddress = InetAddress.getLocalHost();
String ipAddress = inetAddress.getHostAddress();
return ipAddress;
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
/**
* 获取局域网ip
* @return
*/
public static String getLocalIp(){
try {
// 获取本机的所有网络接口
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
// 确保网络接口已启用
if (networkInterface.isUp()) {
// 确保不是虚拟网络接口
if (!networkInterface.isLoopback()) {
// 遍历接口的所有IP地址
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress inetAddress = addresses.nextElement();
// 确保是IPv4地址
if (inetAddress instanceof java.net.Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return "127.0.0.1";
}
public static void main(String[] args) { public static void main(String[] args) {
System.out.println("MAC Address: " + getMacAddress()); System.out.println("MAC Address: " + getMacAddress());
} }
......
package com.mortals.xhx.tts.utils;
/**
* Created by ZYW on 2022-05-17.
*/
public class RabbitMessBean {
private String downTopicFilter;
private String exchangeName;
private String host;
private String messageTtl;
private String password;
private Integer port;
private String uploadTopicFilter;
private String username;
private String virtualHost;
public String getDownTopicFilter() {
return downTopicFilter;
}
public void setDownTopicFilter(String downTopicFilter) {
this.downTopicFilter = downTopicFilter;
}
public String getExchangeName() {
return exchangeName;
}
public void setExchangeName(String exchangeName) {
this.exchangeName = exchangeName;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getMessageTtl() {
return messageTtl;
}
public void setMessageTtl(String messageTtl) {
this.messageTtl = messageTtl;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getUploadTopicFilter() {
return uploadTopicFilter;
}
public void setUploadTopicFilter(String uploadTopicFilter) {
this.uploadTopicFilter = uploadTopicFilter;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getVirtualHost() {
return virtualHost;
}
public void setVirtualHost(String virtualHost) {
this.virtualHost = virtualHost;
}
}
package com.mortals.xhx.tts.utils;
/**
* Created by ZYW on 2022-07-01.
*/
public class ResultRabbitBean {
private RabbitMessBean rabbmitInfo;
private ServiceInfoBean serviceInfo;
private DeviceInfoBean deviceInfo;
public RabbitMessBean getRabbmitInfo() {
return rabbmitInfo;
}
public void setRabbmitInfo(RabbitMessBean rabbmitInfo) {
this.rabbmitInfo = rabbmitInfo;
}
public ServiceInfoBean getServiceInfo() {
return serviceInfo;
}
public void setServiceInfo(ServiceInfoBean serviceInfo) {
this.serviceInfo = serviceInfo;
}
public DeviceInfoBean getDeviceInfo() {
return deviceInfo;
}
public void setDeviceInfo(DeviceInfoBean deviceInfo) {
this.deviceInfo = deviceInfo;
}
}
package com.mortals.xhx.tts.utils;
/**
* Created by ZYW on 2022-07-04.
*/
public class ServiceInfoBean {
private String homeUrl;
private String serverUrl;
private String eventUrl;
public String getHomeUrl() {
return homeUrl;
}
public void setHomeUrl(String homeUrl) {
this.homeUrl = homeUrl;
}
public String getServerUrl() {
return serverUrl;
}
public void setServerUrl(String serverUrl) {
this.serverUrl = serverUrl;
}
public String getEventUrl() {
return eventUrl;
}
public void setEventUrl(String eventUrl) {
this.eventUrl = eventUrl;
}
}
package com.mortals.xhx.tts.utils; package com.mortals.xhx.tts.utils;
import org.aspectj.util.FileUtil;
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -199,7 +201,8 @@ public class SpliceMp3Util { ...@@ -199,7 +201,8 @@ public class SpliceMp3Util {
* @throws IOException * @throws IOException
*/ */
public static String heBingMp3(List<String> pathList) throws IOException { public static String heBingMp3(List<String> pathList) throws IOException {
String luJing= "/tmp/"; // String luJing= "/tmp/";
String luJing= "F:\\\\";
File f=new File(luJing); File f=new File(luJing);
f.mkdirs(); f.mkdirs();
//生成处理后的文件 //生成处理后的文件
......
...@@ -46,4 +46,6 @@ siteconfig: ...@@ -46,4 +46,6 @@ siteconfig:
active: active:
active: @profiles.active@ active: @profiles.active@
version: @modelVersion@
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment