|
|
|
@@ -23,6 +23,8 @@ import com.njcn.gather.script.service.IPqScriptCheckDataService;
|
|
|
|
import com.njcn.gather.storage.pojo.po.AdHarmonicResult;
|
|
|
|
import com.njcn.gather.storage.pojo.po.AdHarmonicResult;
|
|
|
|
import com.njcn.gather.storage.pojo.po.AdNonHarmonicResult;
|
|
|
|
import com.njcn.gather.storage.pojo.po.AdNonHarmonicResult;
|
|
|
|
import com.njcn.gather.storage.service.DetectionDataDealService;
|
|
|
|
import com.njcn.gather.storage.service.DetectionDataDealService;
|
|
|
|
|
|
|
|
import com.njcn.gather.system.cfg.pojo.po.SysTestConfig;
|
|
|
|
|
|
|
|
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
|
|
|
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
|
|
|
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
@@ -50,6 +52,7 @@ public class DetectionServiceImpl {
|
|
|
|
private final IPqErrSysDtlsService pqErrSysDtlsService;
|
|
|
|
private final IPqErrSysDtlsService pqErrSysDtlsService;
|
|
|
|
private final IPqScriptCheckDataService pqScriptCheckDataService;
|
|
|
|
private final IPqScriptCheckDataService pqScriptCheckDataService;
|
|
|
|
private final DetectionDataDealService detectionDataDealService;
|
|
|
|
private final DetectionDataDealService detectionDataDealService;
|
|
|
|
|
|
|
|
private final ISysTestConfigService sysTestConfigService;
|
|
|
|
|
|
|
|
|
|
|
|
private final String TYPE_A = "A";
|
|
|
|
private final String TYPE_A = "A";
|
|
|
|
private final String TYPE_B = "B";
|
|
|
|
private final String TYPE_B = "B";
|
|
|
|
@@ -976,7 +979,10 @@ public class DetectionServiceImpl {
|
|
|
|
data.setIsData(isQualified);
|
|
|
|
data.setIsData(isQualified);
|
|
|
|
data.setNum(harm);
|
|
|
|
data.setNum(harm);
|
|
|
|
if (CollUtil.isNotEmpty(harmDataList)) {
|
|
|
|
if (CollUtil.isNotEmpty(harmDataList)) {
|
|
|
|
data.setData(harmDataList.get(0));
|
|
|
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
|
|
|
|
|
|
|
BigDecimal bd = BigDecimal.valueOf(harmDataList.get(0));
|
|
|
|
|
|
|
|
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
data.setData(bd.doubleValue());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Double channelData = issueHarmMap.get(harm);
|
|
|
|
Double channelData = issueHarmMap.get(harm);
|
|
|
|
data.setResultData(channelData);
|
|
|
|
data.setResultData(channelData);
|
|
|
|
@@ -1007,12 +1013,13 @@ public class DetectionServiceImpl {
|
|
|
|
private void setDetection(DictDataEnum dataRule, List<Double> harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue) {
|
|
|
|
private void setDetection(DictDataEnum dataRule, List<Double> harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue) {
|
|
|
|
if (CollUtil.isNotEmpty(harmDataList)) {
|
|
|
|
if (CollUtil.isNotEmpty(harmDataList)) {
|
|
|
|
// 存放合格的数据
|
|
|
|
// 存放合格的数据
|
|
|
|
|
|
|
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
|
|
|
List<Double> qualifiedList = harmDataList.stream()
|
|
|
|
List<Double> qualifiedList = harmDataList.stream()
|
|
|
|
.filter(x -> channelData == 0 ? NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl),
|
|
|
|
.filter(x -> channelData == 0 ? NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, oneConfig.getScale()),
|
|
|
|
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
|
|
|
|
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
|
|
|
|
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))
|
|
|
|
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))
|
|
|
|
:
|
|
|
|
:
|
|
|
|
x != 0 && NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl),
|
|
|
|
x != 0 && NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, oneConfig.getScale()),
|
|
|
|
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
|
|
|
|
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
|
|
|
|
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList());
|
|
|
|
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList());
|
|
|
|
if (CollUtil.isNotEmpty(qualifiedList)) {
|
|
|
|
if (CollUtil.isNotEmpty(qualifiedList)) {
|
|
|
|
@@ -1020,21 +1027,23 @@ public class DetectionServiceImpl {
|
|
|
|
case AT_WILL_VALUE:
|
|
|
|
case AT_WILL_VALUE:
|
|
|
|
case CP95_VALUE:
|
|
|
|
case CP95_VALUE:
|
|
|
|
case AVG_VALUE:
|
|
|
|
case AVG_VALUE:
|
|
|
|
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl));
|
|
|
|
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case SECTION_VALUE:
|
|
|
|
case SECTION_VALUE:
|
|
|
|
case Own_value:
|
|
|
|
case Own_value:
|
|
|
|
if (qualifiedList.size() == harmDataList.size()) {
|
|
|
|
if (qualifiedList.size() == harmDataList.size()) {
|
|
|
|
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl));
|
|
|
|
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
List<Double> subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList());
|
|
|
|
List<Double> subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList());
|
|
|
|
data.setData(subtract.get(0));
|
|
|
|
BigDecimal bd = BigDecimal.valueOf(subtract.get(0));
|
|
|
|
data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl));
|
|
|
|
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
data.setData(bd.doubleValue());
|
|
|
|
|
|
|
|
data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl));
|
|
|
|
data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
isData(dataRule, harmDataList, data, qualifiedList);
|
|
|
|
isData(dataRule, harmDataList, data, qualifiedList);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -1042,7 +1051,10 @@ public class DetectionServiceImpl {
|
|
|
|
|
|
|
|
|
|
|
|
private void isData(DictDataEnum dataRule, List<Double> harmDataList, DetectionData data, List<Double> qualifiedList) {
|
|
|
|
private void isData(DictDataEnum dataRule, List<Double> harmDataList, DetectionData data, List<Double> qualifiedList) {
|
|
|
|
if (CollUtil.isNotEmpty(qualifiedList)) {
|
|
|
|
if (CollUtil.isNotEmpty(qualifiedList)) {
|
|
|
|
data.setData(qualifiedList.get(0));
|
|
|
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
|
|
|
|
|
|
|
BigDecimal bd = BigDecimal.valueOf(qualifiedList.get(0));
|
|
|
|
|
|
|
|
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
data.setData(bd.doubleValue());
|
|
|
|
switch (dataRule) {
|
|
|
|
switch (dataRule) {
|
|
|
|
case AT_WILL_VALUE:
|
|
|
|
case AT_WILL_VALUE:
|
|
|
|
case CP95_VALUE:
|
|
|
|
case CP95_VALUE:
|
|
|
|
@@ -1059,7 +1071,9 @@ public class DetectionServiceImpl {
|
|
|
|
data.setIsData(1);
|
|
|
|
data.setIsData(1);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
List<Double> subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList());
|
|
|
|
List<Double> subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList());
|
|
|
|
data.setData(subtract.get(0));
|
|
|
|
bd = BigDecimal.valueOf(subtract.get(0));
|
|
|
|
|
|
|
|
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
data.setData(bd.doubleValue());
|
|
|
|
data.setIsData(2);
|
|
|
|
data.setIsData(2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
@@ -1171,7 +1185,10 @@ public class DetectionServiceImpl {
|
|
|
|
DetectionData detectionData = new DetectionData();
|
|
|
|
DetectionData detectionData = new DetectionData();
|
|
|
|
detectionData.setIsData(isQualified);
|
|
|
|
detectionData.setIsData(isQualified);
|
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
|
detectionData.setData(list.get(0));
|
|
|
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
|
|
|
|
|
|
|
BigDecimal bd = BigDecimal.valueOf(list.get(0));
|
|
|
|
|
|
|
|
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
detectionData.setData(bd.doubleValue());
|
|
|
|
detectionData.setResultData(channelData);
|
|
|
|
detectionData.setResultData(channelData);
|
|
|
|
//先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断
|
|
|
|
//先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断
|
|
|
|
//获得误差体系
|
|
|
|
//获得误差体系
|
|
|
|
@@ -1195,7 +1212,10 @@ public class DetectionServiceImpl {
|
|
|
|
DetectionData detectionData = new DetectionData();
|
|
|
|
DetectionData detectionData = new DetectionData();
|
|
|
|
detectionData.setIsData(isQualified);
|
|
|
|
detectionData.setIsData(isQualified);
|
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
|
detectionData.setData(list.get(0));
|
|
|
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
|
|
|
|
|
|
|
BigDecimal bd = BigDecimal.valueOf(list.get(0));
|
|
|
|
|
|
|
|
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
detectionData.setData(bd.doubleValue());
|
|
|
|
detectionData.setResultData(BigDecimal.valueOf(1.0 / data).doubleValue() * channelData);
|
|
|
|
detectionData.setResultData(BigDecimal.valueOf(1.0 / data).doubleValue() * channelData);
|
|
|
|
|
|
|
|
|
|
|
|
//先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断
|
|
|
|
//先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断
|
|
|
|
@@ -1220,11 +1240,11 @@ public class DetectionServiceImpl {
|
|
|
|
).collect(Collectors.toList());
|
|
|
|
).collect(Collectors.toList());
|
|
|
|
if (CollUtil.isNotEmpty(qualifiedList)) {
|
|
|
|
if (CollUtil.isNotEmpty(qualifiedList)) {
|
|
|
|
BigDecimal subtract = BigDecimal.valueOf(qualifiedList.get(0))
|
|
|
|
BigDecimal subtract = BigDecimal.valueOf(qualifiedList.get(0))
|
|
|
|
.subtract(BigDecimal.valueOf(1.0 / data * (channelData)));
|
|
|
|
.subtract(BigDecimal.valueOf(1.0 / data * (channelData))).setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
detectionData.setErrorData(subtract);
|
|
|
|
detectionData.setErrorData(subtract);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
BigDecimal subtract = BigDecimal.valueOf(list.get(0))
|
|
|
|
BigDecimal subtract = BigDecimal.valueOf(list.get(0))
|
|
|
|
.subtract(BigDecimal.valueOf(1.0 / data * (channelData)));
|
|
|
|
.subtract(BigDecimal.valueOf(1.0 / data * (channelData))).setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
|
|
|
|
detectionData.setErrorData(subtract);
|
|
|
|
detectionData.setErrorData(subtract);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
isData(dataRule, list, detectionData, qualifiedList);
|
|
|
|
isData(dataRule, list, detectionData, qualifiedList);
|
|
|
|
@@ -1282,23 +1302,24 @@ public class DetectionServiceImpl {
|
|
|
|
* @param channelData 通道值
|
|
|
|
* @param channelData 通道值
|
|
|
|
* @param ratedValue 额定值
|
|
|
|
* @param ratedValue 额定值
|
|
|
|
* @param error
|
|
|
|
* @param error
|
|
|
|
|
|
|
|
* @param scale 小数点位数
|
|
|
|
* @return
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public BigDecimal devSubtractChannelData(Double devData, Double channelData, Double ratedValue, PqErrSysDtls error) {
|
|
|
|
public BigDecimal devSubtractChannelData(Double devData, Double channelData, Double ratedValue, PqErrSysDtls error, Integer scale) {
|
|
|
|
//计算装置值返回值 - 源下发值的数据 = 差值
|
|
|
|
//计算装置值返回值 - 源下发值的数据 = 差值
|
|
|
|
BigDecimal subtract = BigDecimal.valueOf(devData).subtract(BigDecimal.valueOf(channelData));
|
|
|
|
BigDecimal subtract = BigDecimal.valueOf(devData).setScale(scale, RoundingMode.HALF_UP).subtract(BigDecimal.valueOf(channelData));
|
|
|
|
//只有相对值需要%比较,绝对值直接相减就行
|
|
|
|
//只有相对值需要%比较,绝对值直接相减就行
|
|
|
|
if (2 == error.getValueType()) {
|
|
|
|
if (2 == error.getValueType()) {
|
|
|
|
switch (error.getErrorValueType()) {
|
|
|
|
switch (error.getErrorValueType()) {
|
|
|
|
case 0:
|
|
|
|
case 0:
|
|
|
|
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 额定值
|
|
|
|
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 额定值
|
|
|
|
return subtract.multiply(BigDecimal.valueOf(100))
|
|
|
|
return subtract.multiply(BigDecimal.valueOf(100))
|
|
|
|
.divide(BigDecimal.valueOf(ratedValue), 4, RoundingMode.HALF_UP);
|
|
|
|
.divide(BigDecimal.valueOf(ratedValue), scale, RoundingMode.HALF_UP);
|
|
|
|
case 1:
|
|
|
|
case 1:
|
|
|
|
//todo 当谐波电压和间谐波电压默认都是按照相对值误差进行计算(用户关心的是含有率)
|
|
|
|
//todo 当谐波电压和间谐波电压默认都是按照相对值误差进行计算(用户关心的是含有率)
|
|
|
|
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 下发的幅值
|
|
|
|
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 下发的幅值
|
|
|
|
return subtract.multiply(BigDecimal.valueOf(100))
|
|
|
|
return subtract.multiply(BigDecimal.valueOf(100))
|
|
|
|
.divide(BigDecimal.valueOf(channelData), 4, RoundingMode.HALF_UP);
|
|
|
|
.divide(BigDecimal.valueOf(channelData), scale, RoundingMode.HALF_UP);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return subtract;
|
|
|
|
return subtract;
|
|
|
|
@@ -1314,14 +1335,15 @@ public class DetectionServiceImpl {
|
|
|
|
* @return
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public Double startRadiusEnd(Double value, Double ratedData, Double harmData, Integer type) {
|
|
|
|
public Double startRadiusEnd(Double value, Double ratedData, Double harmData, Integer type) {
|
|
|
|
|
|
|
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
|
|
|
if (ObjectUtil.isNotNull(value)) {
|
|
|
|
if (ObjectUtil.isNotNull(value)) {
|
|
|
|
switch (type) {
|
|
|
|
switch (type) {
|
|
|
|
case 0:
|
|
|
|
case 0:
|
|
|
|
return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(ratedData))
|
|
|
|
return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(ratedData))
|
|
|
|
.setScale(4, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
|
|
|
|
case 1:
|
|
|
|
case 1:
|
|
|
|
return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(harmData))
|
|
|
|
return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(harmData))
|
|
|
|
.setScale(4, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
return value;
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -1340,6 +1362,7 @@ public class DetectionServiceImpl {
|
|
|
|
* @return
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public Double maxErrorMultiply(PqErrSysDtls error, Double ratedData, Double harmData) {
|
|
|
|
public Double maxErrorMultiply(PqErrSysDtls error, Double ratedData, Double harmData) {
|
|
|
|
|
|
|
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
|
|
|
Double errorValue = error.getMaxErrorValue();
|
|
|
|
Double errorValue = error.getMaxErrorValue();
|
|
|
|
//1绝对值
|
|
|
|
//1绝对值
|
|
|
|
if (1 == error.getValueType()) {
|
|
|
|
if (1 == error.getValueType()) {
|
|
|
|
@@ -1347,11 +1370,11 @@ public class DetectionServiceImpl {
|
|
|
|
//绝对值-标称值= 最大误差值 * 额定电压
|
|
|
|
//绝对值-标称值= 最大误差值 * 额定电压
|
|
|
|
case 0:
|
|
|
|
case 0:
|
|
|
|
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(ratedData))
|
|
|
|
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(ratedData))
|
|
|
|
.setScale(4, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
|
|
|
|
//绝对值-标准值 = 最大误差值 * 谐波下发值
|
|
|
|
//绝对值-标准值 = 最大误差值 * 谐波下发值
|
|
|
|
case 1:
|
|
|
|
case 1:
|
|
|
|
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(harmData))
|
|
|
|
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(harmData))
|
|
|
|
.setScale(4, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//2相对值
|
|
|
|
//2相对值
|
|
|
|
@@ -1361,7 +1384,7 @@ public class DetectionServiceImpl {
|
|
|
|
case 0:
|
|
|
|
case 0:
|
|
|
|
case 1:
|
|
|
|
case 1:
|
|
|
|
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(100))
|
|
|
|
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(100))
|
|
|
|
.setScale(4, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return errorValue;
|
|
|
|
return errorValue;
|
|
|
|
|