|
@@ -1,14 +1,15 @@
|
|
|
-package com.zd.alg.netty.sdk;
|
|
|
|
|
|
|
+package com.zd.alg.rfid.sdk;
|
|
|
|
|
|
|
|
import com.gg.reader.api.dal.GClient;
|
|
import com.gg.reader.api.dal.GClient;
|
|
|
import com.gg.reader.api.protocol.gx.*;
|
|
import com.gg.reader.api.protocol.gx.*;
|
|
|
-import com.zd.alg.netty.service.ISendService;
|
|
|
|
|
-import com.zd.alg.netty.service.IService;
|
|
|
|
|
|
|
+import com.zd.alg.rfid.service.ISendService;
|
|
|
|
|
+import com.zd.alg.rfid.service.IService;
|
|
|
|
|
+import com.zd.algorithm.api.rfid.domain.entity.HardwareRfid;
|
|
|
import com.zd.common.core.exception.ServiceException;
|
|
import com.zd.common.core.exception.ServiceException;
|
|
|
import com.zd.common.core.utils.SpringUtils;
|
|
import com.zd.common.core.utils.SpringUtils;
|
|
|
import com.zd.laboratory.api.feign.RemoteLaboratoryService;
|
|
import com.zd.laboratory.api.feign.RemoteLaboratoryService;
|
|
|
|
|
+import com.zd.model.entity.HardwareRfidDto;
|
|
|
import com.zd.model.entity.InventoryTag;
|
|
import com.zd.model.entity.InventoryTag;
|
|
|
-import com.zd.model.entity.RemoteLabHardware;
|
|
|
|
|
import com.zd.model.enums.HardwareOperate;
|
|
import com.zd.model.enums.HardwareOperate;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
@@ -43,19 +44,19 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
|
|
private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
|
|
|
|
|
|
|
|
@Resource
|
|
@Resource
|
|
|
- private RedisTemplate<String, RemoteLabHardware> redisTemplate;
|
|
|
|
|
|
|
+ private RedisTemplate<String, HardwareRfid> redisTemplate;
|
|
|
|
|
|
|
|
@Resource
|
|
@Resource
|
|
|
private RemoteLaboratoryService remoteLaboratoryService;
|
|
private RemoteLaboratoryService remoteLaboratoryService;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public void start(RemoteLabHardware hardware) {
|
|
|
|
|
- open(hardware);
|
|
|
|
|
|
|
+ public void start(HardwareRfid hardwareRfid) {
|
|
|
|
|
+ open(hardwareRfid);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private void open(RemoteLabHardware hardware) {
|
|
|
|
|
|
|
+ private void open(HardwareRfid hardwareRfid) {
|
|
|
GClient client;
|
|
GClient client;
|
|
|
- String ipAddress = hardware.getIpAddress();
|
|
|
|
|
|
|
+ String ipAddress = hardwareRfid.getIpAddress();
|
|
|
if (clientMap.containsKey(ipAddress)) {
|
|
if (clientMap.containsKey(ipAddress)) {
|
|
|
client = clientMap.get(ipAddress);
|
|
client = clientMap.get(ipAddress);
|
|
|
} else {
|
|
} else {
|
|
@@ -72,41 +73,41 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
boolean change = setGpi(client);
|
|
boolean change = setGpi(client);
|
|
|
if (!change){
|
|
if (!change){
|
|
|
log.info("GPI epc error.");
|
|
log.info("GPI epc error.");
|
|
|
- close(hardware);
|
|
|
|
|
- open(hardware);
|
|
|
|
|
|
|
+ close(hardwareRfid);
|
|
|
|
|
+ open(hardwareRfid);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- MsgBaseSetBaseband msgBaseSetBaseband = setSession(hardware, client);
|
|
|
|
|
|
|
+ MsgBaseSetBaseband msgBaseSetBaseband = setSession(hardwareRfid, client);
|
|
|
if (0 != msgBaseSetBaseband.getRtCode()) {
|
|
if (0 != msgBaseSetBaseband.getRtCode()) {
|
|
|
log.info("Session epc error.");
|
|
log.info("Session epc error.");
|
|
|
- close(hardware);
|
|
|
|
|
- open(hardware);
|
|
|
|
|
|
|
+ close(hardwareRfid);
|
|
|
|
|
+ open(hardwareRfid);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
// 功率配置, 将4个天线功率都设置为30dBm.
|
|
// 功率配置, 将4个天线功率都设置为30dBm.
|
|
|
- MsgBaseSetPower msgBaseSetPower = setPower(hardware, client);
|
|
|
|
|
|
|
+ MsgBaseSetPower msgBaseSetPower = setPower(hardwareRfid, client);
|
|
|
if (0 != msgBaseSetPower.getRtCode()) {
|
|
if (0 != msgBaseSetPower.getRtCode()) {
|
|
|
log.info("Power configuration error.");
|
|
log.info("Power configuration error.");
|
|
|
- close(hardware);
|
|
|
|
|
- open(hardware);
|
|
|
|
|
|
|
+ close(hardwareRfid);
|
|
|
|
|
+ open(hardwareRfid);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
//天线读卡, 读取EPC数据区以及TID数据区
|
|
//天线读卡, 读取EPC数据区以及TID数据区
|
|
|
- MsgBaseInventoryEpc msgBaseInventoryEpc = setInventory(hardware, client);
|
|
|
|
|
|
|
+ MsgBaseInventoryEpc msgBaseInventoryEpc = setInventory(hardwareRfid, client);
|
|
|
if (0 != msgBaseInventoryEpc.getRtCode()) {
|
|
if (0 != msgBaseInventoryEpc.getRtCode()) {
|
|
|
log.info("Inventory epc error.");
|
|
log.info("Inventory epc error.");
|
|
|
- close(hardware);
|
|
|
|
|
- open(hardware);
|
|
|
|
|
|
|
+ close(hardwareRfid);
|
|
|
|
|
+ open(hardwareRfid);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 订阅标签上报事件
|
|
// 订阅标签上报事件
|
|
|
- subscribeHandler(client, hardware);
|
|
|
|
|
- subscribeHandlerTagEpcOver(client,hardware);
|
|
|
|
|
|
|
+ subscribeHandler(client, hardwareRfid);
|
|
|
|
|
+ subscribeHandlerTagEpcOver(client,hardwareRfid);
|
|
|
subscribeTcpHandler(client);
|
|
subscribeTcpHandler(client);
|
|
|
String serialNumber = client.getSerialNumber();
|
|
String serialNumber = client.getSerialNumber();
|
|
|
if (StringUtils.hasLength(serialNumber)){
|
|
if (StringUtils.hasLength(serialNumber)){
|
|
|
- redisTemplate.opsForValue().set(serialNumber, hardware);
|
|
|
|
|
|
|
+ redisTemplate.opsForValue().set(serialNumber, hardwareRfid);
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
throw new ServiceException("Connect failure.");
|
|
throw new ServiceException("Connect failure.");
|
|
@@ -119,21 +120,21 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
* @param client 客户端对象
|
|
* @param client 客户端对象
|
|
|
*/
|
|
*/
|
|
|
public void subscribeTcpHandler(GClient client) {
|
|
public void subscribeTcpHandler(GClient client) {
|
|
|
- RemoteLabHardware labHardware = redisTemplate.opsForValue().get(client.getSerialNumber());
|
|
|
|
|
|
|
+ HardwareRfid hardwareRfid = redisTemplate.opsForValue().get(client.getSerialNumber());
|
|
|
client.onDisconnected = s -> {
|
|
client.onDisconnected = s -> {
|
|
|
log.info("连接" + s + "已断开");
|
|
log.info("连接" + s + "已断开");
|
|
|
- if (labHardware!=null){
|
|
|
|
|
|
|
+ if (hardwareRfid!=null){
|
|
|
client.close();
|
|
client.close();
|
|
|
- remoteLaboratoryService.update(HardwareOperate.CLOSE, labHardware.getIpAddress());
|
|
|
|
|
|
|
+ remoteLaboratoryService.update(HardwareOperate.CLOSE, hardwareRfid.getIpAddress());
|
|
|
log.info("连接" + s + "重连中。。。");
|
|
log.info("连接" + s + "重连中。。。");
|
|
|
- start(labHardware);
|
|
|
|
|
|
|
+ start(hardwareRfid);
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static MsgBaseInventoryEpc setInventory(RemoteLabHardware hardware, GClient client) {
|
|
|
|
|
|
|
+ public static MsgBaseInventoryEpc setInventory(HardwareRfid hardwareRfid, GClient client) {
|
|
|
MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc();
|
|
MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc();
|
|
|
- switch (hardware.getChannels()) {
|
|
|
|
|
|
|
+ switch (hardwareRfid.getChannels()) {
|
|
|
case 4:
|
|
case 4:
|
|
|
msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4);
|
|
msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4);
|
|
|
break;
|
|
break;
|
|
@@ -156,30 +157,30 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
return msgBaseInventoryEpc;
|
|
return msgBaseInventoryEpc;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static MsgBaseSetPower setPower(RemoteLabHardware hardware, GClient client) {
|
|
|
|
|
- String uniformPower = hardware.getUniformPower();
|
|
|
|
|
|
|
+ public static MsgBaseSetPower setPower(HardwareRfid hardwareRfid, GClient client) {
|
|
|
|
|
+ String uniformPower = hardwareRfid.getUniformPower();
|
|
|
MsgBaseGetPower msgBaseGetPower = new MsgBaseGetPower();
|
|
MsgBaseGetPower msgBaseGetPower = new MsgBaseGetPower();
|
|
|
client.sendSynMsg(msgBaseGetPower);
|
|
client.sendSynMsg(msgBaseGetPower);
|
|
|
MsgBaseSetPower msgBaseSetPower = new MsgBaseSetPower();
|
|
MsgBaseSetPower msgBaseSetPower = new MsgBaseSetPower();
|
|
|
if (0 == msgBaseGetPower.getRtCode()) {
|
|
if (0 == msgBaseGetPower.getRtCode()) {
|
|
|
- sendPower(hardware, client, uniformPower, msgBaseGetPower, msgBaseSetPower);
|
|
|
|
|
|
|
+ sendPower(hardwareRfid, client, uniformPower, msgBaseGetPower, msgBaseSetPower);
|
|
|
} else {
|
|
} else {
|
|
|
log.info("==============获取输出功率失败==============");
|
|
log.info("==============获取输出功率失败==============");
|
|
|
}
|
|
}
|
|
|
return msgBaseSetPower;
|
|
return msgBaseSetPower;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private static void sendPower(RemoteLabHardware hardware, GClient client, String uniformPower, MsgBaseGetPower msgBaseGetPower, MsgBaseSetPower msgBaseSetPower) {
|
|
|
|
|
|
|
+ private static void sendPower(HardwareRfid hardwareRfid, GClient client, String uniformPower, MsgBaseGetPower msgBaseGetPower, MsgBaseSetPower msgBaseSetPower) {
|
|
|
if (StringUtils.hasLength(uniformPower)) {
|
|
if (StringUtils.hasLength(uniformPower)) {
|
|
|
- editAndSendPower(hardware, client, uniformPower, msgBaseSetPower, msgBaseGetPower);
|
|
|
|
|
|
|
+ editAndSendPower(hardwareRfid, client, uniformPower, msgBaseSetPower, msgBaseGetPower);
|
|
|
} else {
|
|
} else {
|
|
|
msgBaseSetPower.setRtCode((byte) 0);
|
|
msgBaseSetPower.setRtCode((byte) 0);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private static void editAndSendPower(RemoteLabHardware hardware, GClient client, String uniformPower, MsgBaseSetPower msgBaseSetPower, MsgBaseGetPower msgBaseGetPower) {
|
|
|
|
|
|
|
+ private static void editAndSendPower(HardwareRfid hardwareRfid, GClient client, String uniformPower, MsgBaseSetPower msgBaseSetPower, MsgBaseGetPower msgBaseGetPower) {
|
|
|
Hashtable<Integer, Integer> dicPower = msgBaseGetPower.getDicPower();
|
|
Hashtable<Integer, Integer> dicPower = msgBaseGetPower.getDicPower();
|
|
|
- Integer channels = hardware.getChannels();
|
|
|
|
|
|
|
+ Integer channels = hardwareRfid.getChannels();
|
|
|
String[] uniformPowers = uniformPower.split(",");
|
|
String[] uniformPowers = uniformPower.split(",");
|
|
|
for (int i = 1; i <= channels; i++) {
|
|
for (int i = 1; i <= channels; i++) {
|
|
|
Integer power = dicPower.get(i);
|
|
Integer power = dicPower.get(i);
|
|
@@ -199,15 +200,15 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static MsgBaseSetBaseband setSession(RemoteLabHardware hardware, GClient client) {
|
|
|
|
|
|
|
+ public static MsgBaseSetBaseband setSession(HardwareRfid hardwareRfid, GClient client) {
|
|
|
MsgBaseGetBaseband msgBaseGetBaseband = new MsgBaseGetBaseband();
|
|
MsgBaseGetBaseband msgBaseGetBaseband = new MsgBaseGetBaseband();
|
|
|
MsgBaseSetBaseband msgBaseSetBaseband = new MsgBaseSetBaseband();
|
|
MsgBaseSetBaseband msgBaseSetBaseband = new MsgBaseSetBaseband();
|
|
|
client.sendSynMsg(msgBaseGetBaseband);
|
|
client.sendSynMsg(msgBaseGetBaseband);
|
|
|
if (0 == msgBaseGetBaseband.getRtCode()) {
|
|
if (0 == msgBaseGetBaseband.getRtCode()) {
|
|
|
int session = msgBaseGetBaseband.getSession();
|
|
int session = msgBaseGetBaseband.getSession();
|
|
|
log.info("Session index is:==============》{}", session);
|
|
log.info("Session index is:==============》{}", session);
|
|
|
- if (session != hardware.getSessionIndex()) {
|
|
|
|
|
- msgBaseSetBaseband.setSession(hardware.getSessionIndex());
|
|
|
|
|
|
|
+ if (session != hardwareRfid.getSessionIndex()) {
|
|
|
|
|
+ msgBaseSetBaseband.setSession(hardwareRfid.getSessionIndex());
|
|
|
client.sendSynMsg(msgBaseSetBaseband);
|
|
client.sendSynMsg(msgBaseSetBaseband);
|
|
|
if (0 != msgBaseSetBaseband.getRtCode()) {
|
|
if (0 != msgBaseSetBaseband.getRtCode()) {
|
|
|
log.info("Session epc error.");
|
|
log.info("Session epc error.");
|
|
@@ -253,14 +254,14 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public void disconnect(RemoteLabHardware hardware) {
|
|
|
|
|
- close(hardware);
|
|
|
|
|
|
|
+ public void disconnect(HardwareRfid hardwareRfid) {
|
|
|
|
|
+ close(hardwareRfid);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public boolean alarm(RemoteLabHardware hardware) {
|
|
|
|
|
|
|
+ public boolean alarm(HardwareRfid hardwareRfid) {
|
|
|
//灯带设置
|
|
//灯带设置
|
|
|
- String ipAddress = hardware.getIpAddress();
|
|
|
|
|
|
|
+ String ipAddress = hardwareRfid.getIpAddress();
|
|
|
if (clientMap.containsKey(ipAddress)) {
|
|
if (clientMap.containsKey(ipAddress)) {
|
|
|
GClient client = clientMap.get(ipAddress);
|
|
GClient client = clientMap.get(ipAddress);
|
|
|
boolean alarm = false;
|
|
boolean alarm = false;
|
|
@@ -271,15 +272,15 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
log.info("报警状态:==============》{},设备IP:{}", alarm, ipAddress);
|
|
log.info("报警状态:==============》{},设备IP:{}", alarm, ipAddress);
|
|
|
if (!alarm) {
|
|
if (!alarm) {
|
|
|
alarmMap.putIfAbsent(ipAddress,true);
|
|
alarmMap.putIfAbsent(ipAddress,true);
|
|
|
- return changeGpo(ipAddress, 1, client, 10);
|
|
|
|
|
|
|
+ return changeGpo(ipAddress, 1, client, 1);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public void close(RemoteLabHardware hardware) {
|
|
|
|
|
- String ipAddress = hardware.getIpAddress();
|
|
|
|
|
|
|
+ public void close(HardwareRfid hardwareRfid) {
|
|
|
|
|
+ String ipAddress = hardwareRfid.getIpAddress();
|
|
|
if (clientMap.containsKey(ipAddress)) {
|
|
if (clientMap.containsKey(ipAddress)) {
|
|
|
GClient client = clientMap.get(ipAddress);
|
|
GClient client = clientMap.get(ipAddress);
|
|
|
changeGpo(ipAddress, 0, client, 0);
|
|
changeGpo(ipAddress, 0, client, 0);
|
|
@@ -342,10 +343,10 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
* 订阅6c标签信息上报
|
|
* 订阅6c标签信息上报
|
|
|
*
|
|
*
|
|
|
* @param client 客户端
|
|
* @param client 客户端
|
|
|
- * @param hardware 设备数据
|
|
|
|
|
|
|
+ * @param hardwareRfid 设备数据
|
|
|
*/
|
|
*/
|
|
|
- public void subscribeHandler(GClient client, RemoteLabHardware hardware) {
|
|
|
|
|
- String ipAddress = hardware.getIpAddress();
|
|
|
|
|
|
|
+ public void subscribeHandler(GClient client, HardwareRfid hardwareRfid) {
|
|
|
|
|
+ String ipAddress = hardwareRfid.getIpAddress();
|
|
|
clientMap.computeIfAbsent(ipAddress, f -> client);
|
|
clientMap.computeIfAbsent(ipAddress, f -> client);
|
|
|
String serialNumber = client.getSerialNumber();
|
|
String serialNumber = client.getSerialNumber();
|
|
|
client.onTagEpcLog = (s, logBaseEpcInfo) -> {
|
|
client.onTagEpcLog = (s, logBaseEpcInfo) -> {
|
|
@@ -355,17 +356,21 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
String key=epc+antId;
|
|
String key=epc+antId;
|
|
|
if (Boolean.FALSE.equals(redisTemplate.hasKey(key))){
|
|
if (Boolean.FALSE.equals(redisTemplate.hasKey(key))){
|
|
|
log.info("===========》{},index: {}", epc, antId);
|
|
log.info("===========》{},index: {}", epc, antId);
|
|
|
- redisTemplate.opsForValue().set(key,hardware,30,TimeUnit.SECONDS);
|
|
|
|
|
|
|
+ redisTemplate.opsForValue().set(key,hardwareRfid,30,TimeUnit.SECONDS);
|
|
|
scheduledExecutorService.execute(()->{
|
|
scheduledExecutorService.execute(()->{
|
|
|
InventoryTag tag = new InventoryTag();
|
|
InventoryTag tag = new InventoryTag();
|
|
|
BeanUtils.copyProperties(logBaseEpcInfo, tag);
|
|
BeanUtils.copyProperties(logBaseEpcInfo, tag);
|
|
|
String readerSerialNumber = logBaseEpcInfo.getReaderSerialNumber();
|
|
String readerSerialNumber = logBaseEpcInfo.getReaderSerialNumber();
|
|
|
log.info("===========》读取器设备编码:{}", readerSerialNumber);
|
|
log.info("===========》读取器设备编码:{}", readerSerialNumber);
|
|
|
|
|
+ HardwareRfidDto hardwareRfidDto = new HardwareRfidDto();
|
|
|
if (StringUtils.hasLength(serialNumber)){
|
|
if (StringUtils.hasLength(serialNumber)){
|
|
|
tag.setSerialNumber(serialNumber);
|
|
tag.setSerialNumber(serialNumber);
|
|
|
- tag.setRemoteLabHardware(redisTemplate.opsForValue().get(serialNumber));
|
|
|
|
|
|
|
+// tag.setRemoteLabHardware(redisTemplate.opsForValue().get(serialNumber));
|
|
|
|
|
+ BeanUtils.copyProperties(redisTemplate.opsForValue().get(serialNumber),hardwareRfidDto);
|
|
|
|
|
+ tag.setHardwareRfidDto(hardwareRfidDto);
|
|
|
}else {
|
|
}else {
|
|
|
- tag.setRemoteLabHardware(hardware);
|
|
|
|
|
|
|
+ BeanUtils.copyProperties(hardwareRfid,hardwareRfidDto);
|
|
|
|
|
+ tag.setHardwareRfidDto(hardwareRfidDto);
|
|
|
}
|
|
}
|
|
|
sendService.send(tag);
|
|
sendService.send(tag);
|
|
|
});
|
|
});
|
|
@@ -378,13 +383,13 @@ public class DeJuRFIDServerImpl implements IService {
|
|
|
* 订阅6c标签信息上报停止事件
|
|
* 订阅6c标签信息上报停止事件
|
|
|
*
|
|
*
|
|
|
* @param client 客户端
|
|
* @param client 客户端
|
|
|
- * @param hardware 设备数据
|
|
|
|
|
|
|
+ * @param hardwareRfid 设备数据
|
|
|
*/
|
|
*/
|
|
|
- public void subscribeHandlerTagEpcOver(GClient client, RemoteLabHardware hardware) {
|
|
|
|
|
|
|
+ public void subscribeHandlerTagEpcOver(GClient client, HardwareRfid hardwareRfid) {
|
|
|
client.onTagEpcOver= (s, logBaseEpcInfo) -> {
|
|
client.onTagEpcOver= (s, logBaseEpcInfo) -> {
|
|
|
log.info("HandlerTagEpcOver:"+s);
|
|
log.info("HandlerTagEpcOver:"+s);
|
|
|
- close(hardware);
|
|
|
|
|
- open(hardware);
|
|
|
|
|
|
|
+ close(hardwareRfid);
|
|
|
|
|
+ open(hardwareRfid);
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|