Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
职
职业病数据推送
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
王浪
职业病数据推送
Commits
7f52d38b
Commit
7f52d38b
authored
Mar 24, 2023
by
wanglang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
数据推送
parent
479df7fa
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
590 additions
and
0 deletions
+590
-0
pom.xml
pom.xml
+29
-0
src/main/java/com/example/data_push/config/ZybConfig.java
src/main/java/com/example/data_push/config/ZybConfig.java
+46
-0
src/main/java/com/example/data_push/controller/PushDataController.java
.../com/example/data_push/controller/PushDataController.java
+36
-0
src/main/java/com/example/data_push/dto/DataDto.java
src/main/java/com/example/data_push/dto/DataDto.java
+21
-0
src/main/java/com/example/data_push/service/PushDataService.java
...n/java/com/example/data_push/service/PushDataService.java
+22
-0
src/main/java/com/example/data_push/service/impl/PushDataServiceImpl.java
...m/example/data_push/service/impl/PushDataServiceImpl.java
+64
-0
src/main/java/com/example/data_push/util/JsonToXml2.java
src/main/java/com/example/data_push/util/JsonToXml2.java
+268
-0
src/main/java/com/example/data_push/vo/ZybError.java
src/main/java/com/example/data_push/vo/ZybError.java
+21
-0
src/main/java/com/example/data_push/vo/ZybExtraInfo.java
src/main/java/com/example/data_push/vo/ZybExtraInfo.java
+23
-0
src/main/java/com/example/data_push/vo/ZybList.java
src/main/java/com/example/data_push/vo/ZybList.java
+17
-0
src/main/java/com/example/data_push/vo/ZybVo.java
src/main/java/com/example/data_push/vo/ZybVo.java
+28
-0
src/main/resources/application.yml
src/main/resources/application.yml
+15
-0
No files found.
pom.xml
View file @
7f52d38b
...
@@ -37,6 +37,35 @@
...
@@ -37,6 +37,35 @@
<version>
2.5.6
</version>
<version>
2.5.6
</version>
</dependency>
</dependency>
<!-- hutool -->
<dependency>
<groupId>
cn.hutool
</groupId>
<artifactId>
hutool-all
</artifactId>
<version>
5.1.4
</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
2.0.26
</version>
</dependency>
<dependency>
<groupId>
com.google.code.gson
</groupId>
<artifactId>
gson
</artifactId>
<version>
2.10.1
</version>
</dependency>
<dependency>
<groupId>
dom4j
</groupId>
<artifactId>
dom4j
</artifactId>
<version>
1.6.1
</version>
</dependency>
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-lang3
</artifactId>
<version>
3.11
</version>
</dependency>
<dependency>
<dependency>
<groupId>
mysql
</groupId>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
<artifactId>
mysql-connector-java
</artifactId>
...
...
src/main/java/com/example/data_push/config/ZybConfig.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.config
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.stereotype.Component
;
/**
* @Author hl
* @Date 2022-10-31 09:33
* 省平台参数
*/
@Component
@ConfigurationProperties
(
prefix
=
"zyb"
)
@Data
public
class
ZybConfig
{
/**
* 机构编码
*/
private
String
userId
;
/**
* 机构名称
*/
private
String
name
;
/**
* 机构密码
*/
private
String
password
;
/**
* 私钥
*/
private
String
privateKey
;
/**
* 申报地址
*/
private
String
url
;
/**
* 填报人/报告人
*/
private
String
person
;
/**
* 填报人电话/报告电话
*/
private
String
phone
;
private
String
aa
=
"2233"
;
}
src/main/java/com/example/data_push/controller/PushDataController.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.controller
;
import
com.baomidou.mybatisplus.extension.api.R
;
import
com.example.data_push.dto.DataDto
;
import
com.example.data_push.service.PushDataService
;
import
com.example.data_push.vo.ZybVo
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
@RestController
@RequestMapping
(
"pushData"
)
@Api
(
value
=
"数据推送调用"
,
tags
=
{
"pushData调用"
})
public
class
PushDataController
{
@Autowired
private
PushDataService
pushDataService
;
@ApiOperation
(
value
=
"数据推送"
,
response
=
ZybVo
.
class
)
@PostMapping
(
value
=
"/push"
)
public
R
pushData
(
@RequestBody
@Validated
DataDto
dto
)
throws
Exception
{
return
pushDataService
.
pushData
(
dto
);
}
}
src/main/java/com/example/data_push/dto/DataDto.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
@Data
public
class
DataDto
implements
Serializable
{
@ApiModelProperty
(
value
=
"用户原始数据"
)
private
String
dataJson
;
}
src/main/java/com/example/data_push/service/PushDataService.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.service
;
import
com.baomidou.mybatisplus.extension.api.R
;
import
com.example.data_push.dto.DataDto
;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
public
interface
PushDataService
{
/**
* 数据推送
* @param dto
* @return
*/
R
pushData
(
DataDto
dto
)
throws
Exception
;
}
src/main/java/com/example/data_push/service/impl/PushDataServiceImpl.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.service.impl
;
import
cn.hutool.http.HttpUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.extension.api.R
;
import
com.example.data_push.config.ZybConfig
;
import
com.example.data_push.dto.DataDto
;
import
com.example.data_push.service.PushDataService
;
import
com.example.data_push.util.JsonToXml2
;
import
com.example.data_push.vo.ZybVo
;
import
com.google.gson.Gson
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringEscapeUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
@Slf4j
@Service
public
class
PushDataServiceImpl
implements
PushDataService
{
@Autowired
private
ZybConfig
zybConfig
;
@Override
public
R
pushData
(
DataDto
dto
)
throws
Exception
{
if
(
StringUtils
.
isEmpty
(
dto
.
getDataJson
())){
return
R
.
failed
(
"无法获取到推送数据"
);
}
log
.
info
(
"获取原始数据成功,原始数据为:"
+
dto
.
getDataJson
());
String
result
=
HttpUtil
.
post
(
zybConfig
.
getUrl
(),
dto
.
getDataJson
());
log
.
info
(
"调用省直平台成功,转义前:"
+
result
);
result
=
StringEscapeUtils
.
unescapeXml
(
result
);
log
.
info
(
"转义后:"
+
result
);
if
(!
result
.
contains
(
"<data>"
)){
return
R
.
failed
(
"调用省直平台推送失败"
);
}
String
substring
=
result
.
substring
(
result
.
indexOf
(
"<data>"
),
result
.
indexOf
(
"</data>"
)
+
7
);
//获取data数据
JSONObject
jsonObject
=
JsonToXml2
.
xmltoJson
(
substring
).
getJSONObject
(
"data"
);
log
.
info
(
"获取data数据:"
+
new
Gson
().
toJson
(
jsonObject
));
ZybVo
zybVo
=
JSON
.
toJavaObject
(
jsonObject
,
ZybVo
.
class
);
log
.
info
(
"实体类转换后:"
+
new
Gson
().
toJson
(
zybVo
));
if
(
"-1"
.
equals
(
zybVo
.
getReturnCode
()))
{
return
R
.
failed
(
zybVo
.
getMessage
()
+
","
+
zybVo
.
getErrorList
().
getError
().
getMessage
());
}
log
.
info
(
"单位申报成功"
);
return
R
.
ok
(
zybVo
);
}
}
src/main/java/com/example/data_push/util/JsonToXml2.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.util
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.google.gson.JsonArray
;
import
com.google.gson.JsonElement
;
import
com.google.gson.JsonObject
;
import
com.google.gson.JsonParser
;
import
org.dom4j.Attribute
;
import
org.dom4j.Document
;
import
org.dom4j.DocumentHelper
;
import
org.dom4j.Element
;
import
java.util.List
;
import
java.util.Map.Entry
;
import
java.util.Set
;
public
class
JsonToXml2
{
private
static
final
String
STR_JSON
=
"{\"stakeapply\":{\"voltageLevel\":\"AC00062\",\"stakeList\":{\"stake\":[{\"stakeAssetNO\":45754745,\"otherStakeTypeRemark\":\"xxx\",\"stationId\":\"547547547547\"},{\"stakeAssetNO\":34325325322,\"otherStakeTypeRemark\":\"xxx\",\"stationId\":\"52354645462\"}]},\"otherStationTypeRemark\":\"xxx\",\"stationAddr\":\"哈哈\",\"custLists\":{\"custList\":{\"custId\":\"7547547547\",\"custPhone\":13666666666,\"contactMode\":1}},\"principalList\":{\"principal\":[{\"principalName\":121212,\"principalType\":1},{\"principalName\":12121233,\"principalType\":1}]}}}"
;
/**
* 将json字符串转换成xml
*
* @param json json字符串
* @param parentElement xml根节点
*/
public
static
Element
jsonToXml
(
String
json
,
Element
parentElement
)
{
JsonObject
jsonObject
=
JsonParser
.
parseString
(
json
).
getAsJsonObject
();
return
toXml
(
jsonObject
,
parentElement
,
null
);
}
/**
* 将json字符串转换成xml
*
* @param jsonElement 待解析json对象元素
* @param parentElement 上一层xml的dom对象
* @param name 父节点
*/
public
static
Element
toXml
(
JsonElement
jsonElement
,
Element
parentElement
,
String
name
)
{
if
(
jsonElement
instanceof
JsonArray
)
{
//是json数据,需继续解析
JsonArray
sonJsonArray
=
(
JsonArray
)
jsonElement
;
for
(
int
i
=
0
;
i
<
sonJsonArray
.
size
();
i
++)
{
JsonElement
arrayElement
=
sonJsonArray
.
get
(
i
);
toXml
(
arrayElement
,
parentElement
,
name
);
}
}
else
if
(
jsonElement
instanceof
JsonObject
)
{
//说明是一个json对象字符串,需要继续解析
JsonObject
sonJsonObject
=
(
JsonObject
)
jsonElement
;
Element
currentElement
=
null
;
if
(
name
!=
null
)
{
currentElement
=
parentElement
.
addElement
(
name
);
}
Set
<
Entry
<
String
,
JsonElement
>>
set
=
sonJsonObject
.
entrySet
();
for
(
Entry
<
String
,
JsonElement
>
s
:
set
)
{
toXml
(
s
.
getValue
(),
currentElement
!=
null
?
currentElement
:
parentElement
,
s
.
getKey
());
}
}
else
{
//说明是一个键值对的key,可以作为节点插入了
addAttribute
(
parentElement
,
name
,
jsonElement
.
getAsString
());
}
return
parentElement
;
}
/**
* @param element 父节点
* @param name 子节点的名字
* @param value 子节点的值
*/
public
static
void
addAttribute
(
Element
element
,
String
name
,
String
value
)
{
//增加子节点,并为子节点赋值
Element
el
=
element
.
addElement
(
name
);
el
.
addText
(
value
);
}
/**
* 将xml转换为JSON对象
*
* @param xml xml字符串
* @return
* @throws Exception
*/
public
static
JSONObject
xmltoJson
(
String
xml
)
throws
Exception
{
JSONObject
jsonObject
=
new
JSONObject
();
Document
document
=
DocumentHelper
.
parseText
(
xml
);
//获取根节点元素对象
Element
root
=
document
.
getRootElement
();
iterateNodes
(
root
,
jsonObject
);
return
jsonObject
;
}
/**
* 遍历元素
*
* @param node 元素
* @param json 将元素遍历完成之后放的JSON对象
*/
@SuppressWarnings
(
"unchecked"
)
public
static
void
iterateNodes
(
Element
node
,
JSONObject
json
)
{
//获取当前元素的名称
String
nodeName
=
node
.
getName
();
//判断已遍历的JSON中是否已经有了该元素的名称
if
(
json
.
containsKey
(
nodeName
))
{
//该元素在同级下有多个
Object
Object
=
json
.
get
(
nodeName
);
JSONArray
array
=
null
;
if
(
Object
instanceof
JSONArray
)
{
array
=
(
JSONArray
)
Object
;
}
else
{
array
=
new
JSONArray
();
array
.
add
(
Object
);
}
//获取该元素下所有子元素
List
<
Element
>
listElement
=
node
.
elements
();
if
(
listElement
.
isEmpty
())
{
//该元素无子元素,获取元素的值
String
nodeValue
=
node
.
getTextTrim
();
array
.
add
(
nodeValue
);
json
.
put
(
nodeName
,
array
);
return
;
}
//有子元素
JSONObject
newJson
=
new
JSONObject
();
//遍历所有子元素
for
(
Element
e
:
listElement
)
{
//递归
iterateNodes
(
e
,
newJson
);
}
List
<
Attribute
>
attss
=
node
.
attributes
();
// 获取book属性名和属性值
for
(
Attribute
att
:
attss
)
{
newJson
.
put
(
att
.
getName
(),
att
.
getValue
());
// System.out.println("节点名:" + att.getName() + "节点值:" + att.getValue());
}
array
.
add
(
newJson
);
json
.
put
(
nodeName
,
array
);
return
;
}
//该元素同级下第一次遍历
//获取该元素下所有子元素
List
<
Element
>
listElement
=
node
.
elements
();
if
(
listElement
.
isEmpty
())
{
//该元素无子元素,获取元素的值
String
nodeValue
=
node
.
getTextTrim
();
json
.
put
(
nodeName
,
nodeValue
);
return
;
}
//有子节点,新建一个JSONObject来存储该节点下子节点的值
JSONObject
object
=
new
JSONObject
();
//遍历所有一级子节点
for
(
Element
e
:
listElement
)
{
//递归
iterateNodes
(
e
,
object
);
}
List
<
Attribute
>
attss
=
node
.
attributes
();
// 获取book属性名和属性值
for
(
Attribute
att
:
attss
)
{
object
.
put
(
att
.
getName
(),
att
.
getValue
());
// System.out.println("节点名:" + att.getName() + "节点值:" + att.getValue());
}
json
.
put
(
nodeName
,
object
);
return
;
}
/* public static void main(String[] args) throws Exception {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("data"); //默认根节点
ZybContactHazardFactor contactHazardFactor=new ZybContactHazardFactor();
contactHazardFactor.setHazardCode("331");
ZybContactHazardFactor contactHazardFactor2=new ZybContactHazardFactor();
contactHazardFactor2.setHazardCode("331");
List<ZybContactHazardFactor>list=new ArrayList<>();
list.add(contactHazardFactor);
list.add(contactHazardFactor2);
ZybReportCard zybReportCard=new ZybReportCard();
Map<String,List<ZybContactHazardFactor>> listMap=new HashMap<>();
listMap.put("contactHazardFactor",list);
zybReportCard.setContactHazardFactorList(listMap);
Element el = jsonToXml(new Gson().toJson(zybReportCard), root);
System.out.println(el.asXML());
}*/
/*
json串
{
"stakeapply": {
"voltageLevel": "AC00062",
"stakeList": {
"stake": [
{
"stakeAssetNO": 45754745,
"otherStakeTypeRemark": "xxx",
"stationId": "547547547547"
},
{
"stakeAssetNO": 34325325322,
"otherStakeTypeRemark": "xxx",
"stationId": "52354645462"
}
]
},
"otherStationTypeRemark": "xxx",
"stationAddr": "哈哈",
"custLists": {
"custList": {
"custId": "7547547547",
"custPhone": 13666666666,
"contactMode": 1
}
},
"principalList": {
"principal": [
{
"principalName": 121212,
"principalType": 1
},
{
"principalName": 12121233,
"principalType": 1
}
]
}
}
}
*/
/*
转换后的xml
<?xml version="1.0" encoding="UTF-8"?>
<stakeapply>
<voltageLevel>AC00062</voltageLevel>
<stakeList>
<stake>
<stakeAssetNO>45754745</stakeAssetNO>
<otherStakeTypeRemark>xxx</otherStakeTypeRemark>
<stationId>547547547547</stationId>
</stake>
<stake>
<stakeAssetNO>34325325322</stakeAssetNO>
<otherStakeTypeRemark>xxx</otherStakeTypeRemark>
<stationId>52354645462</stationId>
</stake>
</stakeList>
<otherStationTypeRemark>xxx</otherStationTypeRemark>
<stationAddr>哈哈</stationAddr>
<custLists>
<custList>
<custId>7547547547</custId>
<custPhone>13666666666</custPhone>
<contactMode>1</contactMode>
</custList>
</custLists>
<principalList>
<principal>
<principalName>121212</principalName>
<principalType>1</principalType>
</principal>
<principal>
<principalName>12121233</principalName>
<principalType>1</principalType>
</principal>
</principalList>
</stakeapply>
*/
}
\ No newline at end of file
src/main/java/com/example/data_push/vo/ZybError.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.vo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* @Author hl
* @Date 2022-10-31 10:50
*/
@Data
public
class
ZybError
{
@ApiModelProperty
(
value
=
"请求错误响应码"
)
private
String
code
;
@ApiModelProperty
(
value
=
"机构组织代码"
)
private
String
orgCode
;
@ApiModelProperty
(
value
=
"请求错误响应提示"
)
private
String
message
;
}
src/main/java/com/example/data_push/vo/ZybExtraInfo.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.vo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* @Author hl
* @Date 2022-10-31 10:50
*/
@Data
public
class
ZybExtraInfo
{
@ApiModelProperty
(
value
=
"请求响应总数"
)
private
String
total
;
@ApiModelProperty
(
value
=
"请求响应成功数"
)
private
String
successTotal
;
@ApiModelProperty
(
value
=
"请求响应失败数"
)
private
String
errorTotal
;
}
src/main/java/com/example/data_push/vo/ZybList.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.vo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* @Author hl
* @Date 2022-10-31 10:53
*/
@Data
public
class
ZybList
{
@ApiModelProperty
(
value
=
"请求错误响应"
)
private
ZybError
error
;
}
src/main/java/com/example/data_push/vo/ZybVo.java
0 → 100644
View file @
7f52d38b
package
com.example.data_push.vo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* @Author hl
* @Date 2022-10-31 10:48
* 返回体
*/
@Data
public
class
ZybVo
{
@ApiModelProperty
(
value
=
"请求返回码"
)
private
String
returnCode
;
@ApiModelProperty
(
value
=
"错误数据集合"
)
private
ZybList
errorList
;
@ApiModelProperty
(
value
=
"请求提示语"
)
private
String
message
;
@ApiModelProperty
(
value
=
"请求成功数据"
)
private
ZybExtraInfo
extraInfo
;
}
src/main/resources/application.yml
View file @
7f52d38b
...
@@ -35,3 +35,18 @@ spring:
...
@@ -35,3 +35,18 @@ spring:
zyb
:
#申报地址
url
:
http://47.99.104.188:8083/ws_data/ws/TJ?wsdl
#机构编码
userId
:
420502015
#机构名称
name
:
宜昌市疾病预防控制中心
#机构密码
password
:
ycjk420502015#zyb
#填报人/报告人
person
:
徐兵
#填报人电话/报告电话
phone
:
15971628128
#私钥
privateKey
:
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCzvxunu6Ijjzi6w5SvF+l4pfFR/wkO9tK7Mc25BkoIBcBrQAragOJ5DPZnq5Z+Bwm4yMTwWtlQTR/m9jG/t0yKWv5D715kuvJsZxk5ymkYU6PJ8E0WXp9Xkb3rsNaLCpwPQcQb3Hfvqtdbk7J56jjIMTGVNDYpQvvEQsZuoE64QKmsDV+FEcSAl8NBdZ2tblyafk7zn26HyEfuOJ8TXSdQ1HwQQAUP+ko0WSzTVDi4VkBbTlTzY74S4JughXIsSSWTXlRnsb/MHAFmA/7FEjMkLARPYUB1QBUZ0/lSy315B6HG3hBmT+W7nQMfz1jnHkbA6B3FFGmBV4Qtd7FjvVHZAgMBAAECggEBAJ8KEisoTv8No1FE6hK+oppYoZw+f0JZS/3LxE3Y7boJdMawpKnO7hPTT1ZNMVwTWBvCsNZGXA+8HeUaoswSIEwu1NlBO5D/BK67zkse+DxJDRwJXfvT/0LZNmULU9k0qv6o3x8TxJ8v11s05O8QOeuP82IkD2QU23U87BxIBT7qpCfRXw/Zh9pBAEYCsRK1kfpci7TaP9KMh5BkED5PGkny7/RAuYaQGSNyM8eskmIOURAMrMxjiBGRL/LN7GK/edB9DacjTQxFMil6aCi++jQxiP8FCP8rTd789rEEADxAo/Q8izd9cnzWhXepqqf0/dlVmvaHFMsxvGeSyC6RHu0CgYEA3Z3PcvQZ7IEN1Bb8ghjJCu7mlJkTNdCYjs9NlRkqaG7045nhdvhHkdyvjCUfC07Ru5y7zGUu4UuRqXjqK3992uE3E5rklxERFc2sWRhW5osA9xSrxkJ0Wmcm09KcoXH2VN9IIPDIvxyPs64E71B0jm8dqGCvsgST5S+MsIvN/SsCgYEAz6JNc49+0pdOcndF1YZtZfqEkmgwiothott9BjJW6K1FMYEgDBANqnpEwfkRUNwwRCwVDX9gM0gHcRsyeQOHDM0CUGNEJ4J3VQsp+BEwfWYIa9lStJC7c6muBIJWvLL+NcEJu66wBwYAEa0sXuOFf2BN/cTEl1ZzSFmzUzwr0wsCgYEArWcAXdLPwfUMq+m8c9MO44YgVx8bH91ysTNVYhdJzmMbLEdIWj1USrYhiYe2LbPjeWfercRyFQh7Fd6tY5GjGTNlU+q7d9R7yNKgSyo3PLaA79N1wHBY+C+D+vPtaIlyE+CNYHDmslqXuiCsbdBHEvewfgIBF0prqkU1USJi7/cCgYEAwpWOFCCEcANQh0Fz9rm2SH3QRAzUgOJCrAcaUfZXMFNBpzUlvWhGBl/zk/1A1xCjQyA00qNummCEaOFeGb7Oj5aI9qEwu/4uq0p9GHezg7FdbwUJ1yJUKf74kE090DXGusWfw33ghZR/+BDcpkh/UXIFZS9ENbfU7hbyUazwPSUCgYA2cuIVgWX4c3wkqgrZfFq7xhfMU7sPqqkPwao1hYpyACiF1LmL39FB+hFP68ZRYPVC1qWDdmSnxk/nXbEwvMormDtqxFWVttjxPDqnr3uQjbsuK3t9GFHmdrQB7kUzp0O7LJX6+4FxPTgd9MYcRJhXhHQ3JA02IiMqK7991fvnTA==
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment